Pycharm中Fama-French数据集处理卡壳(步骤3及以后)求助
Fama-French月度数据集处理剩余步骤解决方案
已完成代码回顾
import pandas as pd ff_monthly = pd.read_csv(r"file path") ff_monthly = pd.read_csv(r"file path", index_col=0) Mkt = ff_monthly['Mkt-RF'] + ff_monthly['RF'] ff_monthly = ff_monthly.assign(Mkt=Mkt) df = pd.DataFrame(ff_monthly)
剩余任务分步实现
1. 从索引提取年份和月份,新增列
假设数据集索引为YYYYMM格式(如192607代表1926年7月),通过字符串切片提取年月:
# 将索引转为字符串类型方便切片 df.index = df.index.astype(str) # 提取年份和月份并转为数值型 df['Year'] = df.index.str[:4].astype(int) df['Month'] = df.index.str[4:].astype(int)
2. 创建年度统计结果DataFrame
提取数据中所有唯一年份,初始化用于存储年化指标的空DataFrame:
# 获取所有唯一年份并排序 years = df['Year'].unique() years.sort() # 创建以年份为索引、包含指定列的结果表 annual_stats = pd.DataFrame(index=years, columns=['Mean', 'Standard Deviation'])
3. 年化转换函数
编写函数接收小数形式的月度均值和标准差,返回对应的年化均值与标准差元组:
def annualize(r_m, s_m): # 计算年化均值:(1+月度均值)^12 - 1 r_a = (1 + r_m) ** 12 - 1 # 计算年化标准差:月度标准差 * 根号12 s_a = s_m * (12 ** 0.5) return (r_a, s_a)
4. 按年份计算年化指标并输出结果
遍历每个年份,计算Mkt列的月度统计值,转成小数后传入函数得到年化值,最后打印结果并保存为CSV:
for year in years: # 筛选当年Mkt数据,将百分比转为小数 yearly_data = df[df['Year'] == year]['Mkt'] / 100 # 计算月度均值和标准差 monthly_mean = yearly_data.mean() monthly_std = yearly_data.std() # 调用函数获取年化指标 annual_mean, annual_std = annualize(monthly_mean, monthly_std) # 填充结果表 annual_stats.loc[year, 'Mean'] = annual_mean annual_stats.loc[year, 'Standard Deviation'] = annual_std # 打印最终结果 print(annual_stats) # 输出为CSV文件(可自定义保存路径) annual_stats.to_csv('ff_annual_mkt_stats.csv')
完整整合代码
import pandas as pd # 加载数据(替换为你的实际文件路径) ff_monthly = pd.read_csv(r"file path", index_col=0) # 计算Mkt列 Mkt = ff_monthly['Mkt-RF'] + ff_monthly['RF'] ff_monthly = ff_monthly.assign(Mkt=Mkt) df = pd.DataFrame(ff_monthly) # 1. 提取年份和月份 df.index = df.index.astype(str) df['Year'] = df.index.str[:4].astype(int) df['Month'] = df.index.str[4:].astype(int) # 2. 创建年度统计DataFrame years = df['Year'].unique() years.sort() annual_stats = pd.DataFrame(index=years, columns=['Mean', 'Standard Deviation']) # 3. 年化转换函数 def annualize(r_m, s_m): r_a = (1 + r_m) ** 12 - 1 s_a = s_m * (12 ** 0.5) return (r_a, s_a) # 4. 按年份计算并填充结果 for year in years: yearly_data = df[df['Year'] == year]['Mkt'] / 100 monthly_mean = yearly_data.mean() monthly_std = yearly_data.std() annual_mean, annual_std = annualize(monthly_mean, monthly_std) annual_stats.loc[year, 'Mean'] = annual_mean annual_stats.loc[year, 'Standard Deviation'] = annual_std # 输出结果 print(annual_stats) annual_stats.to_csv('ff_annual_mkt_stats.csv')
内容的提问来源于stack exchange,提问作者XYZ
相关产品推荐
相关产品推荐

