如何基于每日股票收盘价计算周度与月度收益率?
股票周度与月度收益率计算方案
前提准备
首先确保你的Date列(或索引)是datetime类型,如果不是,先执行转换:
import pandas as pd # 若Date是普通列 table['Date'] = pd.to_datetime(table['Date']) # 若Date是索引(原始DataFrame格式) table = table.reset_index() # 转为重置索引后的格式统一处理 table['Date'] = pd.to_datetime(table['Date'])
周度收益率计算
通过groupby结合pd.Grouper指定周频率(freq='W'),按股票代码和周分组后,用期末收盘价/期初收盘价 - 1计算区间收益率:
# 计算每只股票的周度收益率 weekly_returns = table.groupby( ['ticker', pd.Grouper(key='Date', freq='W')] )['Adj Close'].apply(lambda x: x.iloc[-1] / x.iloc[0] - 1).reset_index(name='Weekly Return')
- 注:
freq='W'默认以周日为周结束日,若需调整为周一结束,可改用freq='W-MON'。
月度收益率计算
将频率参数改为freq='M'(月末节点),即可计算月度收益率:
# 计算每只股票的月度收益率 monthly_returns = table.groupby( ['ticker', pd.Grouper(key='Date', freq='M')] )['Adj Close'].apply(lambda x: x.iloc[-1] / x.iloc[0] - 1).reset_index(name='Monthly Return')
- 若需以月首为统计节点,可使用
freq='MS'。
平均周度/月度收益率计算
如果需要每只股票的平均周度/月度收益率,直接对结果按ticker分组取均值:
# 每只股票的平均周度收益率 mean_weekly_returns = weekly_returns.groupby('ticker')['Weekly Return'].mean() # 每只股票的平均月度收益率 mean_monthly_returns = monthly_returns.groupby('ticker')['Monthly Return'].mean()
补充说明
- 采用
x.iloc[-1]/x.iloc[0]-1的原因:区间收益率直接用期末与期初的价格比计算,比累加日度收益率更准确,和你之前使用pct_change()的日度收益率逻辑一致。 - 若DataFrame未重置索引(Date为索引),可将
pd.Grouper的参数改为level='Date'替代key='Date',无需重置索引。
内容的提问来源于stack exchange,提问作者ASH
相关产品推荐
相关产品推荐

