Python 用交易成本计算收益

Python 用交易成本计算收益,python,finance,trading,Python,Finance,Trading,这可能是在计算交易回报时过于简化了,同时也包括了交易成本。我做了一些假设——投资和提取投资的佣金分别为1%和2%。佣金在交易期内不会发生变化,在这种情况下,交易期为5个时间步。我已经使用Python代码来执行计算 给定资产在5个时间步长内价格的正负百分比变化集是{0.031%,0.00121%,0.0231%,-0.0213%,-0.0121%} 进入投资的佣金为投资金额的1%,退出投资的佣金为投资金额现值的2% 如果我在这项资产上投资1欧元,以下是否正确? 1. 如果我在$t=5$之前不进行投

这可能是在计算交易回报时过于简化了,同时也包括了交易成本。我做了一些假设——投资和提取投资的佣金分别为1%和2%。佣金在交易期内不会发生变化,在这种情况下,交易期为5个时间步。我已经使用Python代码来执行计算

给定资产在5个时间步长内价格的正负百分比变化集是
{0.031%,0.00121%,0.0231%,-0.0213%,-0.0121%}

进入投资的佣金为投资金额的1%,退出投资的佣金为投资金额现值的2%

如果我在这项资产上投资1欧元,以下是否正确?

1.

如果我在$t=5$之前不进行投资交易,则最终投资金额为: 最终百分比变动金额为$t=5$,即
“初始投资金额”+“%change”-“佣金输入”-“佣金退出”
,因此:

initial_investment_amt = 1

comission_in_amt = 1

comission_out_amt = 2

price_change = -.0121

return_amt = (initial_investment_amt + (price_change / 100)) - (comission_in_amt / 100) - (comission_out_amt / 100) = 0.97 which represents a loss of 1 - .97 = .03
2.

如果我在每个时间步交易投资直到$t=5$,则最终投资金额为:

initial_investment_amt = 1

comission_in_amt = 1

comission_out_amt = 2

price_change = .031

return_amt_1 = (initial_investment_amt + (price_change / 100)) - (comission_in_amt / 100) - (comission_out_amt / 100)

price_change = .00121

return_amt_2 = (return_amt_1 + (price_change / 100)) - (comission_in_amt / 100) - (comission_out_amt / 100)

price_change = .0231

return_amt_3 = (return_amt_2 + (price_change / 100)) - (comission_in_amt / 100) - (comission_out_amt / 100)

price_change = -.0213

return_amt_4 = (return_amt_3 + (price_change / 100)) - (comission_in_amt / 100) - (comission_out_amt / 100)

price_change = -.0121

return_amt_5 = (return_amt_4 + (price_change / 100)) - (comission_in_amt / 100) - (comission_out_amt / 100)

print(return_amt_1)
print(return_amt_2)
print(return_amt_3)
print(return_amt_4)
print(return_amt_5)
印刷品:

0.97031
0.9403220999999999
0.9105530999999999
0.8803400999999998
0.8502190999999998

这意味着损失1-0.85=0.15美元。

首先,我不得不恭敬地不同意你对案例1的结论:

如果我在$t=5$之前不交易投资,则最终投资金额为:$t=5$时的最终百分比变化金额,即“初始投资金额”+“'%change'-”佣金进入“-”佣金退出

我认为,最终值的正确公式是

((初始投资金额-输入佣金)*(1+%变化))-退出佣金。 主要区别在于,在获得投资回报之前,输入佣金/投资费已退出流通。随着时间的推移,这会产生显著的差异

假设我是正确的,下面是我建议的代码。为了便于参考,我随意更改了一些术语,但您显然可以将其更改为适合您的任何术语:

p_changes = [0.03100, 0.00121, 0.02310, 0.02130, -0.01210]
initial_investment_amt = 100 #I used a larger initial investment; otherwise, the fees would have eaten you alive...
invest_fee = 1
sell_fee = 2

def periodic_ret(amount,change,reinv):

    if reinv == 0:
        if ind + 1 == 1: #for the initial period
            forward = (amount-invest_fee)*(1+change)      
        if ind +1 == len(p_changes): #for the final period
            forward = (amount*(1+change))-sell_fee
        else:
            forward = (amount*(1+change))
    else:
        forward = (amount-invest_fee)*(1+change)-sell_fee
    print(forward)
    return forward    

for i in range(len(p_changes)):
    reinv = 1 #1 if an invest and sell fee are paid each period, or 0, if an invest fee is paid once upfront and sell fee is paid once at the end
    if i == 0: #for the initial period
        cur = periodic_ret(initial_investment_amt, p_changes[0], reinv)
    else:
        cur = periodic_ret(cur,p_changes[i], reinv)
输出(w/reinv=1):


首先,我不得不恭敬地不同意你对案例1的结论:

如果我在$t=5$之前不交易投资,则最终投资金额为:$t=5$时的最终百分比变化金额,即“初始投资金额”+“'%change'-”佣金进入“-”佣金退出

我认为,最终值的正确公式是

((初始投资金额-输入佣金)*(1+%变化))-退出佣金。 主要区别在于,在获得投资回报之前,输入佣金/投资费已退出流通。随着时间的推移,这会产生显著的差异

假设我是正确的,下面是我建议的代码。为了便于参考,我随意更改了一些术语,但您显然可以将其更改为适合您的任何术语:

p_changes = [0.03100, 0.00121, 0.02310, 0.02130, -0.01210]
initial_investment_amt = 100 #I used a larger initial investment; otherwise, the fees would have eaten you alive...
invest_fee = 1
sell_fee = 2

def periodic_ret(amount,change,reinv):

    if reinv == 0:
        if ind + 1 == 1: #for the initial period
            forward = (amount-invest_fee)*(1+change)      
        if ind +1 == len(p_changes): #for the final period
            forward = (amount*(1+change))-sell_fee
        else:
            forward = (amount*(1+change))
    else:
        forward = (amount-invest_fee)*(1+change)-sell_fee
    print(forward)
    return forward    

for i in range(len(p_changes)):
    reinv = 1 #1 if an invest and sell fee are paid each period, or 0, if an invest fee is paid once upfront and sell fee is paid once at the end
    if i == 0: #for the initial period
        cur = periodic_ret(initial_investment_amt, p_changes[0], reinv)
    else:
        cur = periodic_ret(cur,p_changes[i], reinv)
输出(w/reinv=1):


佣金和价格变动均以百分比形式给出。这意味着投资后账户中的金额为:

初始投资金额*(1-佣金金额/100)

_amt后缀可能令人困惑,但佣金在问题中表示为%

第一个投资期后,该账户的金额为:

初始投资金额*(1-佣金金额/100)*(1-价格变化/100)

最后,退出后,客户端收到:

初始投资金额*(1-佣金金额/100)(1-价格变化/100)(1-佣金金额/100)

我认为这种模式很清楚,所以你只要为一项较长的投资插入更多的价格变化,如果你撤资再投资,你将要支付更多的佣金。
希望这是可以的-抱歉没有代码-但它看起来更清晰,并且使用了问题符号。

佣金和价格变动都以百分比形式给出。这意味着投资后账户中的金额为:

初始投资金额*(1-佣金金额/100)

_amt后缀可能令人困惑,但佣金在问题中表示为%

第一个投资期后,该账户的金额为:

初始投资金额*(1-佣金金额/100)*(1-价格变化/100)

最后,退出后,客户端收到:

初始投资金额*(1-佣金金额/100)(1-价格变化/100)(1-佣金金额/100)

我认为这种模式很清楚,所以你只要为一项较长的投资插入更多的价格变化,如果你撤资再投资,你将要支付更多的佣金。
希望这没问题-抱歉,没有代码-但它看起来更清晰,并且使用了问题符号。

除非我遗漏了什么,否则您似乎认为在每一个步骤中,您都会同时支付投资佣金和销售佣金。这是真的吗?还是时间步1开头的投资佣金和时间步5开头的销售佣金?@JackFleeting In 1。我在投资时支付一笔投资佣金,当我进行投资时,我支付一笔销售佣金——因此在本例中,在5个时间步骤的系列中支付两笔佣金。在2。当我在每个时间步将投资取出,然后再投资时,我必须在每个时间步支付投资和销售佣金。我希望这是有道理的。根据市场在5个时间步中的走势,这些策略中的每一个都会产生不同的回报,正如我在问题中所建议的。除非我遗漏了什么,否则你似乎认为在每一个时间步你都会支付投资佣金和销售佣金。这是真的吗?还是时间步1开头的投资佣金和时间步5开头的销售佣金?@JackFleeting In 1。我在伦敦支付投资佣金