python计算股票年化收益率、年化波动率、夏普比率系数(>1,good)并绘图

python代码,由vscode trae插件生成–无需任何调整,即可运行

import akshare as ak
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt

def get_stock_data(stock_code, start_date, end_date):
    """
    获取指定股票的历史数据

    :param stock_code: 股票代码,例如 'sh600519'
    :param start_date: 开始日期,格式 'YYYYMMDD'
    :param end_date: 结束日期,格式 'YYYYMMDD'
    :return: 包含历史数据的 DataFrame
    """
    stock_df = ak.stock_zh_a_hist(symbol=stock_code[2:], period="daily", start_date=start_date, end_date=end_date)
    stock_df['日期'] = pd.to_datetime(stock_df['日期'])
    stock_df.set_index('日期', inplace=True)
    return stock_df

def calculate_risk_metrics(stock_df):
    """
    计算股票风险指标

    :param stock_df: 包含历史数据的 DataFrame
    :return: 包含风险指标的字典和包含日收益率的 DataFrame
    """
    # 计算日收益率
    stock_df['日收益率'] = stock_df['收盘'].pct_change()
    # 计算年化收益率
    annual_return = stock_df['日收益率'].mean() * 252
    # 计算年化波动率(收益率标准差)
    annual_volatility = stock_df['日收益率'].std() * np.sqrt(252)
    # 假设无风险利率为 2%
    risk_free_rate = 0.02
    # 计算夏普比率
    sharpe_ratio = (annual_return - risk_free_rate) / annual_volatility

    return {
        '年化收益率': annual_return,
        '年化波动率': annual_volatility,
        '夏普比率': sharpe_ratio
    }, stock_df

def plot_stock_data(stock_df, stock_code):
    """
    绘制股价变化和日收益率变化图

    :param stock_df: 包含历史数据和日收益率的 DataFrame
    :param stock_code: 股票代码
    """
    # 设置图片清晰度
    plt.rcParams['figure.dpi'] = 300
    # 设置中文字体
    plt.rcParams['font.sans-serif'] = ['SimHei']
    plt.rcParams['axes.unicode_minus'] = False

    # 创建一个包含两个子图的画布
    fig, axes = plt.subplots(2, 1, figsize=(12, 8))

    # 绘制股价变化图
    axes[0].plot(stock_df['收盘'], label='收盘价')
    axes[0].set_title(f'{stock_code} 股价变化')
    axes[0].set_ylabel('价格')
    axes[0].legend()

    # 绘制日收益率变化图
    axes[1].plot(stock_df['日收益率'], label='日收益率', color='orange')
    axes[1].set_title(f'{stock_code} 日收益率变化')
    axes[1].set_xlabel('日期')
    axes[1].set_ylabel('收益率')
    axes[1].legend()

    # 手动调整子图之间的垂直间距
    plt.subplots_adjust(hspace=0.5)
    plt.show()

if __name__ == "__main__":
    stock_code = 'sh600938'  # 农业银行
    start_date = '20240101'
    end_date = '20250531'

    # 获取股票数据
    stock_data = get_stock_data(stock_code, start_date, end_date)

    # 计算风险指标
    risk_metrics, stock_data = calculate_risk_metrics(stock_data)

    print(f"股票代码: {stock_code}")
    print(f"开始日期: {start_date}")
    print(f"结束日期: {end_date}")
    print("风险指标:")
    for key, value in risk_metrics.items():
        print(f"{key}: {value:.4f}")

    # 绘制图表
    plot_stock_data(stock_data, stock_code)

计算结果:农行、中国海油

股票代码: sh600938 中国海油
开始日期: 20240101
结束日期: 20250531
风险指标:
年化收益率: 0.2109
年化波动率: 0.3317 波动大、影响收益
夏普比率: 0.5756

股票代码: sh601288 农业银行
开始日期: 20240101
结束日期: 20250531
风险指标:
年化收益率: 0.3293
年化波动率: 0.2067 波动小收益高
夏普比率: 1.4961 收益高