Pandas:如何累积returns - 预测价格
Pandas: How to accumulate returns - forecasting prices
我有一个 pandas 按日期索引的股票价格数据框(每月数据)。我想计算以下内容:从 1983 年 1 月 31 日价值 4100 美元(每只股票 41.00 美元)的 100 只股票开始,如果我能够准确预测下个月的收盘价,2012 年 3 月股票的最大绝对值是多少。
- 如果下个月的月末价格高于本月的月末价格:全额现金买入股票并充分参与股票returns
- 如果下个月月末价格低于本月月末价格:卖出所有股票并在月初套现(不参与股票亏损)
这里有一些示例数据可以使用:
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,即当月 return 的 14.02%。所以我的股票,最初价值 4100 美元,到 1983 年 2 月底会涨到 4100 美元*(1+14.02%)= 4675 美元。
3 月 83 日出现负值 return(价格从 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 美元。
您可以更紧凑地执行此操作,但我将设置一些中间列以便逻辑清晰。首先,我将设置一个有一些起伏的示例数据集。
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,只要你看到 for
,通常会有更快的内置循环,例如 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
职位的价值如下所示:
我有一个 pandas 按日期索引的股票价格数据框(每月数据)。我想计算以下内容:从 1983 年 1 月 31 日价值 4100 美元(每只股票 41.00 美元)的 100 只股票开始,如果我能够准确预测下个月的收盘价,2012 年 3 月股票的最大绝对值是多少。
- 如果下个月的月末价格高于本月的月末价格:全额现金买入股票并充分参与股票returns
- 如果下个月月末价格低于本月月末价格:卖出所有股票并在月初套现(不参与股票亏损)
这里有一些示例数据可以使用:
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,即当月 return 的 14.02%。所以我的股票,最初价值 4100 美元,到 1983 年 2 月底会涨到 4100 美元*(1+14.02%)= 4675 美元。
3 月 83 日出现负值 return(价格从 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 美元。
您可以更紧凑地执行此操作,但我将设置一些中间列以便逻辑清晰。首先,我将设置一个有一些起伏的示例数据集。
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,只要你看到 for
,通常会有更快的内置循环,例如 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
职位的价值如下所示: