使用Python和akshare库分析股票风险

要分析某只股票的风险,我们可以使用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)

代码说明

  1. 数据获取:
  • 使用akshare的
    “stock_zh_a_hist”函数获取A股历史数据
  • 数据包括日期、开盘价、收盘价、最高价、最低价等
  1. 风险指标计算:
  • 年化波动率: 反映股票价格的波动程度
  • 最大回撤: 衡量从最高点到最低点的最大损失
  • VaR(风险价值): 在95%置信度下的日最大损失
  • 夏普比率: 衡量风险调整后的收益
  1. 可视化:
  • 价格走势图
  • 收益率分布直方图
  • 累计收益率和前高曲线
  • 回撤曲线

使用说明

  1. 安装所需库:
    “pip install akshare pandas numpy matplotlib scipy”
  2. 修改
    “stock_code”为你想分析的股票代码(如”600519″为贵州茅台)
  3. 调整
    “start_date”和
    “end_date”设置分析的时间范围
  4. 运行代码即可获取风险分析结果和可视化图表

注意事项

  1. akshare的数据接口可能会有变化,如果获取失败请检查akshare文档
  2. Beta系数的计算需要市场指数数据,这里简化处理未实现
  3. 更全面的风险分析可以添加更多指标,如下行风险、索提诺比率等

希望这个代码能帮助你分析股票风险!如需进一步扩展,可以考虑添加更多风险指标或与其他金融数据的关联分析。