如何在 pandas DataFrame 中进行递归计算?

How to do a recursive calculation in a pandas DataFrame?

我有一个 DataFrame,其中包含量化投资算法产生的买卖操作。然后我尝试用一​​个初始值投入进行模拟,以计算每次操作后的最终资本。

为此,我创建了一个名为 'money' 的新列,我尝试在其中进行递归计算。其中 'money' 列的当前值是先前值乘以操作的 profit/loss 百分比。

ops_df['money'] = list( repeat(TOTAL_INVESTED, len(ops_df)) )
ops_df['money'] = (1 + ops_df.profit_perc.shift(1)) * ops_df.money.shift(1)
ops_df.head(10)

然而,预期的递归计算并没有发生。我很怀疑,因为归因的右侧是在归因之前完整计算的。

我设法使用公共循环解决了这个计算,但我把它记在了脑海里。必须有更好、更有效的方法来进行此计算。我想知道如果有,会是什么样子?

TOTAL_INVESTED = 1000
money = [TOTAL_INVESTED, ]

for i in range(1, len(ops_df)):
    curr_money = round( money[i-1] * (1 + ops_df.profit_perc.iloc[i]), 2 )
    money.append(curr_money)

ops_df['money'] = money

数据:

{'profit_perc': [-0.039548, 0.490518, 0.127511, -0.019439]}

您可以使用 cumprod。这个想法是找到每一行的收益率并将其乘以初始投资:

TOTAL_INVESTED = 1000
df = pd.DataFrame({'profit_perc': [-0.039548, 0.490518, 0.127511, -0.019439]})
df['money'] = df['profit_perc'].shift(-1).add(1).cumprod().mul(TOTAL_INVESTED).shift().fillna(TOTAL_INVESTED)

输出:

   profit_perc        money
0    -0.039548  1000.000000
1     0.490518  1490.518000
2     0.127511  1680.575441
3    -0.019439  1647.906735