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 收益高