生生不息

生生不息

AI计算年化实现波动率

2025-06-22
AI计算年化实现波动率

提示词

#Python代码
#读取我们要用的历史行情数据文件
df = pd.read_excel('2-1.xlsx')

#保留要用的字段
df = df[['日期', '收盘']]

#转换日期格式并设为index
df['日期'] = pd.to_datetime(df['日期'])
df.set_index('日期', inplace=True)

#用对数收益来描述价格变动
df['对数收益'] = np.log(df['收盘']/df['收盘'].shift(1))

#定义一个计算实现波动率的函数
def realized_volatility(x): 
    return np.sqrt(np.sum(x**2))

#将数据按照月度重组,并计算实现波动率
df_rv = ( 
    df.groupby(pd.Grouper(freq="M")) 
    .apply(realized_volatility) 
    .rename(columns={"对数收益": "实现波动率"})
)

#检查结果
df_rv.tail(12)

我需要基于上面的代码,计算出每个月的年化实现波动率,请给出代码。

答案

import pandas as pd
import numpy as np

# 读取历史行情数据
df = pd.read_excel('2-1.xlsx')

# 保留要用的字段
df = df[['日期', '收盘']]

# 转换日期格式并设为index
df['日期'] = pd.to_datetime(df['日期'])
df.set_index('日期', inplace=True)

# 用对数收益来描述价格变动
df['对数收益'] = np.log(df['收盘']/df['收盘'].shift(1))

# 定义一个计算实现波动率的函数
def realized_volatility(x):
    return np.sqrt(np.sum(x**2))

# 将数据按照月度重组,并计算实现波动率
df_rv = (
    df.groupby(pd.Grouper(freq="M"))
    .apply(lambda x: realized_volatility(x['对数收益']))  # 确保只处理对数收益列
    .to_frame(name="月实现波动率")  # 转换为DataFrame并命名列
)

# 计算年化实现波动率 = 月波动率 × √12 (年化转换因子)[2,3](@ref)
df_rv['年化实现波动率'] = df_rv['月实现波动率'] * np.sqrt(12)

# 格式化为百分比字符串便于阅读
df_rv['年化实现波动率_pct'] = df_rv['年化实现波动率'].apply(lambda x: f"{x:.2%}")

# 检查最后12个月的结果
print(df_rv.tail(12))

输出结果没毛病

              月实现波动率   年化实现波动率 年化实现波动率_pct
日期                                    
2022-01-31  0.088663  0.307137      30.71%
2022-02-28  0.068900  0.238676      23.87%
2022-03-31  0.133816  0.463554      46.36%
2022-04-30  0.123565  0.428042      42.80%
2022-05-31  0.068098  0.235899      23.59%
2022-06-30  0.073393  0.254242      25.42%
2022-07-31  0.074279  0.257309      25.73%
2022-08-31  0.070498  0.244212      24.42%
2022-09-30  0.072070  0.249656      24.97%
2022-10-31  0.070144  0.242986      24.30%
2022-11-30  0.140845  0.487901      48.79%
2022-12-31  0.092911  0.321854      32.19%