【发布时间】:2020-07-03 17:54:56
【问题描述】:
问题的背景是我正在尝试对交易策略进行回测,并随着时间的推移评估我的投资组合表现。我正在使用 Pandas DataFrame 来操作数据。
我使用
生成了虚拟数据data = {'position': [1, 0, 0, 0, -1, 0, 0, 1, 0, 0],
'close': [10,25,30,25,22,20,21,16,11,20],
'close_position' : [10,25,30,25,22,22,22,16,11,20]}
df = pd.DataFrame(data = data)
输出df是
+-------+----------+------------+----------------+
| index | position | close | close_position |
+-------+----------+------------+----------------+
| 0 | 1 | 10 | 10 |
| 1 | 0 | 25 | 25 |
| 2 | 0 | 30 | 30 |
| 3 | 0 | 25 | 25 |
| 4 | -1 | 22 | 22 |
| 5 | 0 | 20 | 22 |
| 6 | 0 | 21 | 22 |
| 7 | 1 | 16 | 16 |
| 8 | 0 | 11 | 11 |
| 9 | -1 | 20 | 20 |
+-------+----------+------------+----------------+
position 列告诉您何时入职。 1 代表买入,-1 代表卖出。
我首先在指数 0 分配 100 美元,其中价格由 close 表示,即10,当价格为 22 时我在指数 4 处出售,所以我的投资组合增加了 120%,这使我的投资金额达到 @ 987654329@。在指数5 和6 上,我没有持仓,因此我的投资组合变化为0%,我将维持220 美元。
在指数7 我再次买入,但这次我没有使用 100 美元,而是使用 220 美元以收盘价买入16 并以20 卖出,从而将我的投资组合增加了 25%。现在我会拥有220 + 55 = 275。
我使用下面的代码生成了列change,它告诉索引0 的价格变化和pct_change 计算相对于基准价格的百分比变化。我想根据position 列动态更改下面代码第 3 行中的基本价格,即df.close.iloc[0]。在索引 7 处,我想将第 3 行中的 df.close.iloc[0] 更改为 df.close.iloc[7] 并且我希望将 alloc 更改为 220,因为现在我将投资 220 美元,因为我将获得一个新职位。
下面代码的第 2 行也计算了相对于指数 0 的收盘价差,这在指数 6 之前很好,但从指数 7 开始,我想计算相对于指数 7 的价格差。
alloc = 100 # allocation amount
df['change_cumsum'] = df.close_position.diff().cumsum()
df['pct_change_cumsum'] = alloc + ((df.change_cumsum / df.close.iloc[0]) * alloc)
电流输出:
+-------+----------+-------+----------------+---------------+-------------------+
| index | position | close | close_position | change | pct_change |
+-------+----------+-------+----------------+---------------+-------------------+
| 0 | 1 | 10 | 10 | NaN | NaN |
| 1 | 0 | 25 | 25 | 15 | 250 |
| 2 | 0 | 30 | 30 | 20 | 300 |
| 3 | 0 | 25 | 25 | 15 | 250 |
| 4 | -1 | 22 | 22 | 12 | 220 |
| 5 | 0 | 20 | 22 | 12 | 220 |
| 6 | 0 | 21 | 22 | 12 | 220 |
| 7 | 1 | 16 | 16 | 6 | 160 |
| 8 | 0 | 11 | 11 | 1 | 110 |
| 9 | 0 | 20 | 20 | 10 | 200 |
+-------+----------+-------+----------------+---------------+-------------------+
期望的输出:
+-------+----------+-------+----------------+---------------+-------------------+
| index | position | close | close_position | change. | pct_change |
+-------+----------+-------+----------------+---------------+-------------------+
| 0 | 1 | 10 | 10 | 0 | 0 |
| 1 | 0 | 25 | 25 | 15 | 250 |
| 2 | 0 | 30 | 30 | 20 | 300 |
| 3 | 0 | 25 | 25 | 15 | 250 |
| 4 | -1 | 22 | 22 | 12 | 220 |
| 5 | 0 | 20 | 22 | 12 | 220 |
| 6 | 0 | 21 | 22 | 12 | 220 |
| 7 | 1 | 16 | 16 | 0 | 220|
| 8 | 0 | 11 | 11 | -5 | 151.25 |
| 9 | 0 | 20 | 20 | 4 | 275 |
+-------+----------+-------+----------------+---------------+-------------------+
【问题讨论】:
-
我想我注意到您想要的输出不一致:您的列
pct_change是您分配位置百分比的变化。我想知道您对索引 7 的想法:您以 0% 的变化开始一个位置,但在索引 8 处,我希望看到 -31 而不是 151.25。这个专栏到底是关于什么的? -
如果我在指数 7 分配 220 美元,我将建立一个新头寸,在指数 7 时我的投资组合百分比变化为 0%,因此指数 7 的价值应该是 220(这是我的错误,我已经进行了编辑)。但是,如果您从 220 美元减少 -31%,那么您应该在索引 8 处获得 151.25 美元,这是正确的。
-
好吧,现在说得通了!如果我有办法找到
pct_change而不需要change,你还能接受吗? -
是的,可以接受。