首页 > 解决方案 > 熊猫:如何累积回报 - 预测价格

问题描述

我有一个按日期(月度数据)索引的股票价格熊猫数据框。我想计算以下内容:从 1983 年 1 月 31 日的 100 只股票开始,价值 4100 美元(每只股票 41.00 美元),如果我能准确预测下个月的收盘价,那么 2012 年 3 月股票的最大绝对值是多少。

在此处输入图像描述

以下是一些可以使用的示例数据:

df = pd.DataFrame({
    'Date': ['1983-01-01','1983-02-28','1983-03-31','1983-04-30','1983-05-31'],
    'Month End Price': [41.00,46.75,44.25,50.00,59.25]
}).set_index('Date')

df.index = pd.to_datetime(df.index)

例如,1983 年 2 月,股价从 41.00 上涨到 46.75,当月回报率为 14.02%。所以我的股票,最初价值 4100 美元,到 1983 年 2 月末将升至 4100 美元*(1+14.02%)= 4675 美元。

83 年 3 月出现负回报(价格从 46.75 跌至 44.25)。在知道这种下降之后,我会在 2 月底卖出所有价值 4675 美元的股票(不参与亏损),然后在 1983 年 4 月初再投资。

1983 年 4 月,股票表现为 +12.99% (50.00/44.25 -1),所以到 1983 年 4 月底,我的净资产将从 4675 美元增加到 4675 美元*(1+12.99%) = 5282.5 美元。

标签: pythonpandasnumpyreturnfinance

解决方案


您可以更紧凑地执行此操作,但我将设置一些中间列,以便逻辑清晰。首先,我将设置一个包含一些起伏的样本数据集。

import pandas as pd

prices = [50.00,46.75,44.25,50.00,59.25,66.50,
          29.25,44.25,59.25,61.00,64.25,65.25]
dates = pd.date_range('01-31-1983','12-31-1983', freq='m')

df = pd.DataFrame({'Month End Price':prices}, index=dates)

这会产生一个如下所示的数据框:

           Month End Price
1983-01-31            50.00
1983-02-28            46.75
1983-03-31            44.25
1983-04-30            50.00
1983-05-31            59.25
1983-06-30            66.50
1983-07-31            29.25
1983-08-31            44.25
1983-09-30            59.25
1983-10-31            61.00
1983-11-30            64.25
1983-12-31            65.25

和这个: 在此处输入图像描述

您可以将每月的价格波动计算为:

df['Monthly Returns'] = df['Month End Price'].diff()/df['Month End Price']

据我了解,我们希望实现所有收益并避免所有损失。我设置了一个乘数列,当我们本应避免损失的月份等于 1 时,基本上1 + df['Monthly Returns']是有收益的月份。然后我计算一Cash列作为该Multiplier列乘以 41 美元的累积乘积,这是我们的本金。这里有使用for循环的诱惑,但在 Pandas 中,每当你看到 afor时,通常会有一个更快的内置函数,例如cumprod

df['Multiplier'] = df['Monthly Returns'].apply(lambda x: max(x, 0)) + 1
df['Cash'] = df['Multiplier'].cumprod() * 41

完成所有这些后,我们就有了如下所示的内容:

           Month End Price  Monthly Returns  Multiplier        Cash
1983-01-31            50.00              NaN         NaN   41.000000
1983-02-28            46.75        -0.069519    1.000000   41.000000
1983-03-31            44.25        -0.056497    1.000000   41.000000
1983-04-30            50.00         0.115000    1.115000   45.715000
1983-05-31            59.25         0.156118    1.156118   52.851941
1983-06-30            66.50         0.109023    1.109023   58.613995
1983-07-31            29.25        -1.273504    1.000000   58.613995
1983-08-31            44.25         0.338983    1.338983   78.483145
1983-09-30            59.25         0.253165    1.253165   98.352296
1983-10-31            61.00         0.028689    1.028689  101.173878
1983-11-30            64.25         0.050584    1.050584  106.291623
1983-12-31            65.25         0.015326    1.015326  107.920614

位置的值如下所示:

在此处输入图像描述


推荐阅读