当前位置: 首页 > news >正文

股票量化交易开发 Yfinance

以下是一段基于Python的股票量化分析代码,包含数据获取、技术指标计算、策略回测和可视化功能:

python

 
import yfinance as yf
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
from backtesting import Backtest, Strategy
from backtesting.lib import crossover
# 参数设置
SYMBOL = 'AAPL' # 股票代码
START_DATE = '2020-01-01'
END_DATE = '2023-12-31'
FAST_MA = 20 # 快速均线周期
SLOW_MA = 50 # 慢速均线周期
RSI_PERIOD = 14 # RSI周期
BB_PERIOD = 20 # 布林带周期
# 获取数据
def get_stock_data(symbol, start, end):
data = yf.download(symbol, start=start, end=end)
data = data[['Open', 'High', 'Low', 'Close', 'Volume']]
data.columns = ['open', 'high', 'low', 'close', 'volume']
return data.dropna()
# 计算技术指标
def calculate_technical_indicators(df):
# 移动平均线
df['fast_ma'] = df['close'].rolling(FAST_MA).mean()
df['slow_ma'] = df['close'].rolling(SLOW_MA).mean()
# RSI计算
delta = df['close'].diff()
gain = delta.where(delta > 0, 0)
loss = -delta.where(delta < 0, 0)
avg_gain = gain.rolling(RSI_PERIOD).mean()
avg_loss = loss.rolling(RSI_PERIOD).mean()
rs = avg_gain / avg_loss
df['rsi'] = 100 - (100 / (1 + rs))
# 布林带
df['bb_mid'] = df['close'].rolling(BB_PERIOD).mean()
std = df['close'].rolling(BB_PERIOD).std()
df['bb_upper'] = df['bb_mid'] + 2 * std
df['bb_lower'] = df['bb_mid'] - 2 * std
return df.dropna()
# 双均线策略
class DualMovingAverageStrategy(Strategy):
def init(self):
self.fast_ma = self.I(lambda x: x, self.data.close.rolling(FAST_MA).mean())
self.slow_ma = self.I(lambda x: x, self.data.close.rolling(SLOW_MA).mean())
def next(self):
if crossover(self.fast_ma, self.slow_ma):
self.buy()
elif crossover(self.slow_ma, self.fast_ma):
self.sell()
# 可视化函数
def visualize_results(data, bt):
plt.figure(figsize=(16, 20))
# 价格与均线
plt.subplot(3, 1, 1)
plt.plot(data['close'], label='Price')
plt.plot(data['fast_ma'], label=f'{FAST_MA} MA')
plt.plot(data['slow_ma'], label=f'{SLOW_MA} MA')
plt.title('Price and Moving Averages')
plt.legend()
# RSI
plt.subplot(3, 1, 2)
plt.plot(data['rsi'], label='RSI')
plt.axhline(70, color='red', linestyle='--')
plt.axhline(30, color='green', linestyle='--')
plt.title('RSI Indicator')
# 策略收益曲线
plt.subplot(3, 1, 3)
plt.plot(bt._equity_curve['Equity'], label='Strategy')
plt.plot(data['close']/data['close'].iloc[0], label='Buy & Hold')
plt.title('Strategy vs Buy & Hold')
plt.legend()
plt.tight_layout()
plt.show()
# 主程序
if __name__ == "__main__":
# 获取并处理数据
data = get_stock_data(SYMBOL, START_DATE, END_DATE)
data = calculate_technical_indicators(data)
# 回测策略
bt = Backtest(data, DualMovingAverageStrategy, cash=100000, commission=.002)
stats = bt.run()
# 输出关键指标
print(f"策略年化收益率: {stats['Return [%]']:.2f}%")
print(f"夏普比率: {stats['Sharpe Ratio']:.2f}")
print(f"最大回撤: {stats['Max. Drawdown [%]']:.2f}%")
print(f"交易次数: {stats['# Trades']}")
# 可视化结果
visualize_results(data, bt)
# 显示详细回测报告
bt.plot()

代码功能说明:

  1. 数据获取

    • 使用yfinance获取雅虎财经数据
    • 包含开盘价、最高价、最低价、收盘价和成交量
  2. 技术指标计算

    • 双移动平均线(快速MA和慢速MA)
    • 相对强弱指数(RSI)
    • 布林带指标(Bollinger Bands)
  3. 交易策略

    • 双均线交叉策略(金叉买入,死叉卖出)
    • 包含0.2%的交易手续费
    • 初始资金10万美元
  4. 风险管理

    • 计算年化收益率
    • 夏普比率评估风险调整收益
    • 最大回撤指标
  5. 可视化功能

    • 价格与均线走势图
    • RSI指标图
    • 策略与买入持有收益对比
    • 交互式回测结果展示

使用说明:

  1. 安装依赖库:

bash

pip install yfinance pandas numpy matplotlib seaborn backtesting
  1. 修改参数:

python

 
# 可调整股票代码和时间范围
SYMBOL = 'TSLA' # 改为其他股票代码如TSLA
START_DATE = '2022-01-01' # 修改开始日期
FAST_MA = 10 # 调整快速均线周期
  1. 策略优化示例:

python

 
# 增加止损止盈逻辑
class EnhancedStrategy(DualMovingAverageStrategy):
def next(self):
if crossover(self.fast_ma, self.slow_ma):
self.buy(sl=self.data.low[-1]*0.95, tp=self.data.high[-1]*1.15)
elif crossover(self.slow_ma, self.fast_ma):
self.sell()

该代码实现了完整的量化分析流程,可以作为量化交易策略开发的基础框架。建议在Jupyter Notebook中运行以获得更好的交互体验。

相关文章:

  • Orbslam V3使用Kalibr标定参数详解(D435i)
  • opencascade 源码学习 XmlDrivers-XmlDrivers
  • MyBatis面试常见问题
  • Post-Training Quantization, PTQ
  • 深入探索JVM字节码增强技术与调优实践
  • 基于Python+Django的二手房信息管理系统
  • 用于DiffTraj的行人轨迹数据预处理
  • 程序员学商务英语之Making Business Calls
  • 每日一题--内存池
  • 嵌入式软件开发--面试总结
  • VLLM专题(三十九)—自动前缀缓存(二)
  • 【资源损坏类故障】:详细了解坏块
  • Redis解决缓存击穿问题——两种方法
  • 【踩坑实录】-The function STRING takes only primitive types
  • Netty源码—1.服务端启动流程二
  • extern和static的作用(有例子)
  • 【AI绘图模型介绍】Checkpoint / LoRA / VAE / Embeddings 模型是什么?
  • Java:Apache HttpClient中HttpRoute用法的介绍
  • 如何让节卡机器人精准对点?
  • 基于基于eFish-SBC-RK3576工控板的智慧城市边缘网关
  • 见证历史与未来共舞:上海西岸“蝶变共生”对话讲坛圆满举行
  • 网商银行2024年年报发布,客户资产管理规模超过1万亿
  • 顺利撤离空间站,神十九乘组踏上回家之旅
  • IMF前副总裁朱民捐赠1000万元,在复旦设立青云学子基金
  • 电话费被私改成48元套餐长达数年,投诉后移动公司退补600元话费
  • 普京发表声明感谢协助俄军收复库尔斯克州的朝鲜军人