首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Python量化交易:结合爬虫与TA-Lib技术指标分析

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

原创
作者头像
小白学大数据
发布2025-08-19 16:44:45
发布2025-08-19 16:44:45
2380
举报

引言量化交易(Quantitative Trading)是利用数学模型和计算机程序进行金融投资决策的方法。Python凭借其丰富的数据分析和机器学习库,已成为量化交易的主流工具之一。本文将介绍如何结合网络爬虫获取股票数据,并使用TA-Lib(Technical Analysis Library)计算技术指标,构建一个简易的量化交易分析系统。核心内容:使用爬虫获取股票数据(yfinance + requests)TA-Lib技术指标计算(MACD、RSI、布林带等)策略回测与可视化(Backtrader + Matplotlib)1. 数据获取:爬取股票数据1.1 使用yfinance获取历史数据yfinance是Yahoo Finance的Python接口,可方便获取股票历史数据。

代码语言:txt
复制
import yfinance as yf
import pandas as pd

# 下载苹果公司(AAPL)的股票数据
data = yf.download("AAPL", start="2022-01-01", end="2023-12-31")

# 查看数据结构
print(data.head())

输出示例:

代码语言:txt
复制
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-Lib2.2 计算常用技术指标(1) 移动平均线(MA)

代码语言:txt
复制
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)

代码语言:txt
复制
# 计算14日RSI
data['RSI'] = talib.RSI(data['Close'], timeperiod=14)

(3) MACD(异同移动平均线)

代码语言:txt
复制
# 计算14日RSI
data['RSI'] = talib.RSI(data['Close'], timeperiod=14)

(4) 布林带(Bollinger Bands)

代码语言:txt
复制
# 计算14日RSI
data['RSI'] = talib.RSI(data['Close'], timeperiod=14)

指标可视化:

代码语言:txt
复制
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 实现双均线交易策略

代码语言:txt
复制
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')

输出示例:

代码语言:txt
复制
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')

4. 优化与扩展4.1 策略优化(网格搜索参数)

代码语言:txt
复制
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预测股价)

代码语言:txt
复制
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. 总结本文实现了以下核心功能:数据获取:使用yfinance和爬虫抓取股票数据。技术分析:利用TA-Lib计算MACD、RSI、布林带等指标。策略回测:通过Backtrader验证双均线策略的盈利能力。优化扩展:参数优化与机器学习结合。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档