Python量化交易:结合爬虫与TA-Lib技术指标分析
引言
量化交易(Quantitative Trading)是利用数学模型和计算机程序进行金融投资决策的方法。Python凭借其丰富的数据分析和机器学习库,已成为量化交易的主流工具之一。本文将介绍如何结合网络爬虫获取股票数据,并使用TA-Lib(Technical Analysis Library)计算技术指标,构建一个简易的量化交易分析系统。
核心内容:
- 使用爬虫获取股票数据(
**<font style="color:rgb(64, 64, 64);background-color:rgb(236, 236, 236);">yfinance</font>**
+**<font style="color:rgb(64, 64, 64);background-color:rgb(236, 236, 236);">requests</font>**
) - TA-Lib技术指标计算(MACD、RSI、布林带等)
- 策略回测与可视化(
**<font style="color:rgb(64, 64, 64);background-color:rgb(236, 236, 236);">Backtrader</font>**
+**<font style="color:rgb(64, 64, 64);background-color:rgb(236, 236, 236);">Matplotlib</font>**
)
1. 数据获取:爬取股票数据
1.1 使用yfinance获取历史数据
**<font style="color:rgb(64, 64, 64);background-color:rgb(236, 236, 236);">yfinance</font>**
是Yahoo Finance的Python接口,可方便获取股票历史数据。
import yfinance as yf
import pandas as pd# 下载苹果公司(AAPL)的股票数据
data = yf.download("AAPL", start="2022-01-01", end="2023-12-31")# 查看数据结构
print(data.head())
输出示例:
Open High Low Close Adj Close Volume
Date
2022-01-03 177.830002 182.880005 177.710007 182.009995 181.483673 104487900
2022-01-04 182.630005 182.940002 179.119995 179.699997 179.192230 99310400
2022-01-05 179.610001 180.169998 174.639999 174.919998 174.438995 94537600
2022-01-06 172.699997 175.300003 171.639999 172.000000 171.531570 96904000
2022-01-07 172.889999 174.139999 171.029999 172.169998 171.701080 86709100
2. 技术指标计算:TA-Lib实战
2.1 安装TA-Lib
2.2 计算常用技术指标
(1) 移动平均线(MA)
import talib# 计算5日、20日、60日均线
data['MA5'] = talib.MA(data['Close'], timeperiod=5)
data['MA20'] = talib.MA(data['Close'], timeperiod=20)
data['MA60'] = talib.MA(data['Close'], timeperiod=60)
(2) 相对强弱指数(RSI)
# 计算14日RSI
data['RSI'] = talib.RSI(data['Close'], timeperiod=14)
(3) MACD(异同移动平均线)
# 计算MACD(默认参数:12, 26, 9)
data['MACD'], data['MACD_Signal'], data['MACD_Hist'] = talib.MACD(data['Close'])
(4) 布林带(Bollinger Bands)
# 计算布林带(20日均线 ± 2倍标准差)
data['Upper Band'], data['Middle Band'], data['Lower Band'] = talib.BBANDS(data['Close'], timeperiod=20)
指标可视化:
import matplotlib.pyplot as pltplt.figure(figsize=(12, 8))
plt.plot(data.index, data['Close'], label='Close Price', alpha=0.7)
plt.plot(data.index, data['MA20'], label='20-Day MA', color='orange')
plt.plot(data.index, data['Upper Band'], label='Upper Band', linestyle='--', color='red')
plt.plot(data.index, data['Lower Band'], label='Lower Band', linestyle='--', color='green')
plt.title('AAPL Stock Price with Technical Indicators')
plt.legend()
plt.grid(True)
plt.show()
3. 量化策略回测(Backtrader实战)
3.2 实现双均线交易策略
import backtrader as btclass SmaCrossStrategy(bt.Strategy):params = (('fast', 5), ('slow', 20)) # 短期5日均线,长期20日均线def __init__(self):self.sma_fast = bt.indicators.SMA(period=self.p.fast)self.sma_slow = bt.indicators.SMA(period=self.p.slow)def next(self):# 金叉买入if self.sma_fast[0] > self.sma_slow[0] and self.sma_fast[-1] <= self.sma_slow[-1]:self.buy()# 死叉卖出elif self.sma_fast[0] < self.sma_slow[0] and self.sma_fast[-1] >= self.sma_slow[-1]:self.sell()# 创建回测引擎
cerebro = bt.Cerebro()
datafeed = bt.feeds.PandasData(dataname=data)
cerebro.adddata(datafeed)
cerebro.addstrategy(SmaCrossStrategy)
cerebro.broker.set_cash(100000) # 初始资金10万美元# 运行回测
print('Starting Portfolio Value: %.2f' % cerebro.broker.getvalue())
cerebro.run()
print('Final Portfolio Value: %.2f' % cerebro.broker.getvalue())# 可视化回测结果
cerebro.plot(style='candlestick')
输出示例:
Starting Portfolio Value: 100000.00
Final Portfolio Value: 112450.50
4. 优化与扩展
4.1 策略优化(网格搜索参数)
from backtrader.analyzers import SharpeRatio# 测试不同均线组合
for fast_period in [5, 10, 15]:for slow_period in [20, 30, 50]:cerebro = bt.Cerebro()datafeed = bt.feeds.PandasData(dataname=data)cerebro.adddata(datafeed)cerebro.addstrategy(SmaCrossStrategy, fast=fast_period, slow=slow_period)cerebro.addanalyzer(SharpeRatio, _name='sharpe')results = cerebro.run()sharpe = results[0].analyzers.sharpe.get_analysis()['sharperatio']print(f"Fast={fast_period}, Slow={slow_period}, Sharpe Ratio={sharpe:.2f}")
4.2 结合机器学习(LSTM预测股价)
from sklearn.preprocessing import MinMaxScaler
from keras.models import Sequential
from keras.layers import LSTM, Dense# 数据标准化
scaler = MinMaxScaler()
scaled_data = scaler.fit_transform(data['Close'].values.reshape(-1, 1))# 构建LSTM模型
model = Sequential()
model.add(LSTM(50, return_sequences=True, input_shape=(60, 1)))
model.add(LSTM(50))
model.add(Dense(1))
model.compile(optimizer='adam', loss='mse')# 训练模型(示例代码,需调整)
# model.fit(X_train, y_train, epochs=10, batch_size=32)
5. 总结
本文实现了以下核心功能:
- 数据获取:使用
**<font style="color:rgb(64, 64, 64);background-color:rgb(236, 236, 236);">yfinance</font>**
和爬虫抓取股票数据。 - 技术分析:利用
**<font style="color:rgb(64, 64, 64);background-color:rgb(236, 236, 236);">TA-Lib</font>**
计算MACD、RSI、布林带等指标。 - 策略回测:通过
**<font style="color:rgb(64, 64, 64);background-color:rgb(236, 236, 236);">Backtrader</font>**
验证双均线策略的盈利能力。 - 优化扩展:参数优化与机器学习结合。