Python量化交易:结合爬虫与TA-Lib技术指标分析

126 阅读3分钟

引言

量化交易(Quantitative Trading)是利用数学模型和计算机程序进行金融投资决策的方法。Python凭借其丰富的数据分析和机器学习库,已成为量化交易的主流工具之一。本文将介绍如何结合网络爬虫获取股票数据,并使用TA-Lib(Technical Analysis Library)计算技术指标,构建一个简易的量化交易分析系统。

核心内容:

  1. 使用爬虫获取股票数据**<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>**
  2. TA-Lib技术指标计算(MACD、RSI、布林带等)
  3. 策略回测与可视化**<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 plt

plt.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 bt

class 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. 总结

本文实现了以下核心功能:

  1. 数据获取:使用**<font style="color:rgb(64, 64, 64);background-color:rgb(236, 236, 236);">yfinance</font>**和爬虫抓取股票数据。
  2. 技术分析:利用**<font style="color:rgb(64, 64, 64);background-color:rgb(236, 236, 236);">TA-Lib</font>**计算MACD、RSI、布林带等指标。
  3. 策略回测:通过**<font style="color:rgb(64, 64, 64);background-color:rgb(236, 236, 236);">Backtrader</font>**验证双均线策略的盈利能力。
  4. 优化扩展:参数优化与机器学习结合。