基于分组的Python涨跌幅计算:按起始日期算30/60/90日平均收益率
股票收益率计算实现方案
核心处理步骤
- 将
DATE列转换为datetime格式(适配dd.mm.yyyy日期格式) - 按股票代码筛选对应起始日期后的交易数据
- 计算起始日期后30/60/90天的累计收益率
- 对三个时间段的收益率取平均值
Python 实现代码
import pandas as pd # 假设原始数据已加载到DataFrame中 # df = pd.read_csv('stock_data.csv', parse_dates=['DATE'], dayfirst=True) # 定义各股票的起始日期 start_dates = { 'APPLE': pd.to_datetime('22.12.2022', dayfirst=True), 'HARLEY': pd.to_datetime('16.11.2022', dayfirst=True), 'META': pd.to_datetime('21.10.2021', dayfirst=True) } results = {} for code, start_date in start_dates.items(): # 筛选当前股票起始日期后的有效数据并按日期排序 code_data = df[(df['CODE'] == code) & (df['DATE'] >= start_date)].sort_values('DATE') # 获取起始日收盘价 initial_price = code_data.iloc[0]['CLOSE PRICE'] # 计算目标日期(起始日+30/60/90天) target_periods = { '30天收益率(%)': start_date + pd.DateOffset(days=30), '60天收益率(%)': start_date + pd.DateOffset(days=60), '90天收益率(%)': start_date + pd.DateOffset(days=90) } period_returns = {} for period_name, target_date in target_periods.items(): # 找到目标日期或之后最近的交易日数据 closest_entry = code_data[code_data['DATE'] >= target_date].iloc[0] current_price = closest_entry['CLOSE PRICE'] # 计算收益率(转换为百分比并保留两位小数) period_returns[period_name] = round(((current_price / initial_price) - 1) * 100, 2) # 计算平均收益率 avg_return = round(sum(period_returns.values()) / len(period_returns), 2) period_returns['平均收益率(%)'] = avg_return results[code] = period_returns # 转换为可视化表格 result_table = pd.DataFrame(results).T.reset_index().rename(columns={'index': '股票代码'}) print(result_table)
输出结果示例
| 股票代码 | 30天收益率(%) | 60天收益率(%) | 90天收益率(%) | 平均收益率(%) |
|---|---|---|---|---|
| APPLE | 4.25 | 7.81 | 10.32 | 7.46 |
| HARLEY | -2.10 | 1.53 | 3.07 | 0.83 |
| META | 12.45 | 20.10 | 25.67 | 19.41 |
内容的提问来源于stack exchange,提问作者Bianconera99
相关产品推荐
相关产品推荐

