转自微信公众号 《数据科学与实战》
1、获取历史股票数据
2、计算移动平均线等技术指标
3、可视化股价走势
4、计算关键风险回报指标(如夏普比率)
5、分析回报率分布
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import yfinance as yf
from datetime import datetime, timedelta
# 设置时间范围(过去一年)
end_date = datetime.now()
start_date = end_date - timedelta(days=365)
# 下载股票数据(以阿里巴巴为例)
ticker = "BABA"
stock_data = yf.download(ticker, start=start_date, end=end_date)
# 查看数据的前几行
print(f"{ticker} 股票数据概览:")
print(stock_data.head())
# 计算简单的技术指标 - 20日和50日移动平均线
stock_data['MA20'] = stock_data['Close'].rolling(window=20).mean()
stock_data['MA50'] = stock_data['Close'].rolling(window=50).mean()
# 绘制股票价格和移动平均线
plt.figure(figsize=(12, 6))
plt.plot(stock_data.index, stock_data['Close'], label='收盘价', color='blue')
plt.plot(stock_data.index, stock_data['MA20'], label='20日均线', color='red')
plt.plot(stock_data.index, stock_data['MA50'], label='50日均线', color='green')
plt.title(f'{ticker} 过去一年股价走势及移动平均线')
plt.xlabel('日期')
plt.ylabel('价格(美元)')
plt.legend()
plt.grid(True, alpha=0.3)
plt.show()
# 计算每日回报率
stock_data['Daily_Return'] = stock_data['Close'].pct_change() * 100
# 计算基本统计数据
mean_return = stock_data['Daily_Return'].mean()
std_return = stock_data['Daily_Return'].std()
annual_return = mean_return * 252 # 假设一年有252个交易日
annual_volatility = std_return * np.sqrt(252)
sharpe_ratio = annual_return / annual_volatility # 假设无风险利率为0
print(f"\n{ticker} 基本统计数据:")
print(f"平均日回报率: {mean_return:.2f}%")
print(f"回报率标准差: {std_return:.2f}%")
print(f"年化回报率: {annual_return:.2f}%")
print(f"年化波动率: {annual_volatility:.2f}%")
print(f"夏普比率: {sharpe_ratio:.2f}")
# 绘制回报率分布直方图
plt.figure(figsize=(10, 6))
plt.hist(stock_data['Daily_Return'].dropna(), bins=50, alpha=0.75, color='blue')
plt.axvline(0, color='red', linestyle='--', linewidth=1)
plt.title(f'{ticker} 日回报率分布')
plt.xlabel('日回报率 (%)')
plt.ylabel('频率')
plt.grid(True, alpha=0.3)
plt.show()