要分析某只股票的风险,我们可以使用akshare库获取股票数据,然后进行风险指标计算绘图。以下是一个完整的Python代码示例:
import akshare as ak
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from scipy.stats import norm
from datetime import datetime, timedelta
# 设置中文显示
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False
def get_stock_data(stock_code, start_date, end_date):
"""
获取股票历史数据
"""
try:
# 使用akshare获取股票数据
df = ak.stock_zh_a_hist(symbol=stock_code, period="daily", start_date=start_date, end_date=end_date, adjust="hfq")
df['日期'] = pd.to_datetime(df['日期'])
df.set_index('日期', inplace=True)
df.sort_index(inplace=True)
return df
except Exception as e:
print(f"获取数据失败: {e}")
return None
def calculate_risk_metrics(df):
"""
计算风险指标
"""
if df is None or len(df) < 30:
print("数据不足或获取失败")
return None
# 计算日收益率
df['日收益率'] = df['收盘'].pct_change()
# 计算风险指标
metrics = {}
# 1. 波动率(年化)
daily_volatility = df['日收益率'].std()
annual_volatility = daily_volatility * np.sqrt(252)
metrics['年化波动率'] = annual_volatility
# 2. 最大回撤
df['累计收益率'] = (1 + df['日收益率']).cumprod()
df['前高'] = df['累计收益率'].cummax()
df['回撤'] = (df['累计收益率'] - df['前高']) / df['前高']
max_drawdown = df['回撤'].min()
metrics['最大回撤'] = max_drawdown
# 3. VaR (95%置信度)
var_95 = norm.ppf(0.05, df['日收益率'].mean(), df['日收益率'].std())
metrics['日VaR(95%)'] = var_95
# 4. 夏普比率(假设无风险利率为3%)
annual_return = (1 + df['日收益率'].mean()) ** 252 - 1
risk_free_rate = 0.03
sharpe_ratio = (annual_return - risk_free_rate) / annual_volatility
metrics['夏普比率'] = sharpe_ratio
# 5. Beta系数(需要市场数据,这里简化处理)
# 实际应用中需要获取市场指数数据计算
return metrics
def plot_stock_risk(df):
"""
绘制风险相关图表
"""
if df is None or len(df) < 30:
return
plt.figure(figsize=(15, 10))
# 1. 价格走势
plt.subplot(2, 2, 1)
plt.plot(df['收盘'], label='收盘价')
plt.title('股票价格走势')
plt.xlabel('日期')
plt.ylabel('价格')
plt.legend()
# 2. 收益率分布
plt.subplot(2, 2, 2)
plt.hist(df['日收益率'].dropna(), bins=50, density=True, alpha=0.6, color='g')
plt.title('日收益率分布')
plt.xlabel('日收益率')
plt.ylabel('频率')
# 3. 累计收益率和回撤
plt.subplot(2, 2, 3)
plt.plot(df['累计收益率'], label='累计收益率')
plt.plot(df['前高'], label='前高', linestyle='--')
plt.title('累计收益率与回撤')
plt.xlabel('日期')
plt.ylabel('累计收益率')
plt.legend()
# 4. 回撤曲线
plt.subplot(2, 2, 4)
plt.plot(df['回撤'], label='回撤', color='r')
plt.title('回撤曲线')
plt.xlabel('日期')
plt.ylabel('回撤比例')
plt.legend()
plt.tight_layout()
plt.show()
def analyze_stock_risk(stock_code, start_date, end_date):
"""
分析股票风险的主函数
"""
print(f"正在分析股票 {stock_code} 的风险...")
# 获取数据
df = get_stock_data(stock_code, start_date, end_date)
if df is None:
return
# 计算风险指标
metrics = calculate_risk_metrics(df)
if metrics:
print("\n风险指标分析结果:")
for key, value in metrics.items():
print(f"{key}: {value:.4f}")
# 绘制图表
plot_stock_risk(df)
else:
print("无法计算风险指标")
# 示例使用
if __name__ == "__main__":
# 设置股票代码和时间范围
stock_code = "601288" # 平安银行,可以替换为其他股票代码
# 计算两年前的日期
start_date = (datetime.now() - timedelta(days=365*1)).strftime("%Y%m%d")
# 获取当前日期
end_date = datetime.now().strftime("%Y%m%d")
analyze_stock_risk(stock_code, start_date, end_date)
代码说明
- 数据获取:
- 使用akshare的
“stock_zh_a_hist”函数获取A股历史数据 - 数据包括日期、开盘价、收盘价、最高价、最低价等
- 风险指标计算:
- 年化波动率: 反映股票价格的波动程度
- 最大回撤: 衡量从最高点到最低点的最大损失
- VaR(风险价值): 在95%置信度下的日最大损失
- 夏普比率: 衡量风险调整后的收益
- 可视化:
- 价格走势图
- 收益率分布直方图
- 累计收益率和前高曲线
- 回撤曲线
使用说明
- 安装所需库:
“pip install akshare pandas numpy matplotlib scipy” - 修改
“stock_code”为你想分析的股票代码(如”600519″为贵州茅台) - 调整
“start_date”和
“end_date”设置分析的时间范围 - 运行代码即可获取风险分析结果和可视化图表
注意事项
- akshare的数据接口可能会有变化,如果获取失败请检查akshare文档
- Beta系数的计算需要市场指数数据,这里简化处理未实现
- 更全面的风险分析可以添加更多指标,如下行风险、索提诺比率等
希望这个代码能帮助你分析股票风险!如需进一步扩展,可以考虑添加更多风险指标或与其他金融数据的关联分析。
