使用cumprod()在Python中计算资产曲线

时间:2018-07-31 02:54:12

标签: python python-3.x numpy return algorithmic-trading

我很难使用cumprod()计算复利。它从一开始就开始复利,但是我只希望它在“ Final_Order”等于买入时开始,而在“ Final_Order等于卖出”时停止,然后在下一个买入订单中再次重置。请参见下面的示例。

下面的样本数据显示了我期望在“回测”列中看到的输出。

 Time  Adj_Price  Final_Order   Backtest
  0        7          nan          1000
  1        6          nan          1000
  2        5          Buy          1000
  3        7          Buy          1400
  4        8          Sell         1600
  5        6          Sell         1600
  6        4          Buy          1600
  7        5          Buy          2000
  8        7          Buy          2800
  9        9          Sell         3600
  10       7          Sell         3600
  11       7          Sell         3600
  12       6          Sell         3600

以下是“回测”的计算。

  • 时间1 = IF(Final_Order =“ Buy(t0)”,(6/7)* 1000,其他1000)= 1000
  • 时间2 = IF(Final_Order =“ Buy(t1)”,(5/6)* 1000,其他1000)= 1000
  • 时间3 = IF(Final_Order =“ Buy(t2)”,(7/5)* 1000,其他1000)= 1400
  • 时间4 = IF(Final_Order =“ Buy(t3)”,(8/7)* 1400,其他1400)= 1600
  • 时间5 = IF(Final_Order =“ Buy(t4)”,(6/8)* 1600,其他1600)= 1600
  • 时间6 = IF(Final_Order =“ Buy(t5)”,(4/6)* 1600,其他1600)= 1600
  • 时间7 = IF(Final_Order =“ Buy(t6)”,(5/4)* 1600,其他1600)= 2000
  • 时间8 = IF(Final_Order =“ Buy(t7)”,(7/5)* 2000,Else 2000)= 2800
  • 时间9 = IF(Final_Order =“ Buy(t8)”,(9/7)* 2800,其他2800)= 3600
  • 时间10 = IF(Final_Order =“ Buy(t9)”,(7/9)* 3600,其他3600)= 3600

下面是我正在使用的代码。

data['Backtest'] = np.where(data['Final_Order'] == 'Buy',
                            ((1 + data['Adj 
Close'].pct_change(1)).cumprod())*1000,
                            data['Backtest'].ffill())

1 个答案:

答案 0 :(得分:1)

创建一个列表,其初始值为1000,并具有费率和最终订单:

b = [1000]+list(zip(df.Adj_Price.shift(-1)/df.Adj_Price,df.Final_Order))

df['BACK']=list(itertools.accumulate(b,lambda x,y: round(y[0]*x) if y[1]=="Buy" else x))[:-1]

df

    Time  Adj_Price Final_Order  Backtest  BACK
0      0          7         NaN      1000  1000
1      1          6         NaN      1000  1000
2      2          5         Buy      1000  1000
3      3          7         Buy      1400  1400
4      4          8        Sell      1600  1600
5      5          6        Sell      1600  1600
6      6          4         Buy      1600  1600
7      7          5         Buy      2000  2000
8      8          7         Buy      2800  2800
9      9          9        Sell      3600  3600
10    10          7        Sell      3600  3600
11    11          7        Sell      3600  3600
12    12          6        Sell      3600  3600

将创建的列与已经存在的列进行比较,它们是相同的