一个基于Python的简单量化交易策略核心代码示例
以下是一个基于Python的简单量化交易策略核心代码示例,包含数据获取、策略逻辑、回测框架和可视化模块。代码以双均线策略(金叉/死叉)为例,使用`pandas`和`backtrader`框架实现:
```python
# -*- coding: utf-8 -*-
"""
量化交易核心代码示例(双均线策略)
环境需求:Python 3.8+,需安装以下库:
pip install pandas numpy backtrader matplotlib yfinance
"""
import pandas as pd
import numpy as np
import backtrader as bt
import yfinance as yf
import matplotlib.pyplot as plt
# ===================== 数据获取模块 =====================
def fetch_data(symbol='AAPL', start='2020-01-01', end='2023-01-01'):
"""
从Yahoo Finance获取历史数据
"""
data = yf.download(symbol, start=start, end=end)
data = data[['Open', 'High', 'Low', 'Close', 'Volume']]
data.columns = ['open', 'high', 'low', 'close', 'volume']
return data
# ===================== 策略逻辑模块 =====================
class DualMovingAverageStrategy(bt.Strategy):
params = (
('fast_period', 5), # 短期均线周期
('slow_period', 20), # 长期均线周期
('order_size', 100), # 每次交易数量
('printlog', True) # 打印交易日志
)
def __init__(self):
# 计算双均线
self.fast_ma = bt.indicators.SMA(
self.data.close, period=self.params.fast_period
)
self.slow_ma = bt.indicators.SMA(
self.data.close, period=self.params.slow_period
)
self.crossover = bt.indicators.CrossOver(self.fast_ma, self.slow_ma)
def next(self):
if not self.position: # 没有持仓
if self.crossover > 0: # 金叉信号
self.buy(size=self.params.order_size) # 买入
elif self.crossover < 0: # 死叉信号
self.sell(size=self.params.order_size) # 卖出
def log(self, txt, dt=None, doprint=False):
"""日志记录"""
if self.params.printlog or doprint:
dt = dt or self.datas[0].datetime.date(0)
print(f'{dt.isoformat()}, {txt}')
def notify_order(self, order):
"""订单状态通知"""
if order.status in [order.Submitted, order.Accepted]:
return # 订单已提交/接受 - 无需处理
if order.status in [order.Completed]:
if order.isbuy():
self.log(f'买入执行, 价格:{order.executed.price:.2f}, 成本:{order.executed.value:.2f}, 佣金:{order.executed.comm:.2f}')
elif order.issell():
self.log(f'卖出执行, 价格:{order.executed.price:.2f}, 成本:{order.executed.value:.2f}, 佣金:{order.executed.comm:.2f}')
# ===================== 回测执行模块 =====================
def run_backtest(data):
cerebro = bt.Cerebro() # 初始化回测引擎
# 加载数据
datafeed = bt.feeds.PandasData(dataname=data)
cerebro.adddata(datafeed)
# 添加策略
cerebro.addstrategy(DualMovingAverageStrategy)
# 设置初始资金
cerebro.broker.setcash(100000.0)
# 设置交易手续费
cerebro.broker.setcommission(commission=0.001) # 0.1%手续费
# 添加分析指标
cerebro.addanalyzer(bt.analyzers.SharpeRatio, _name='sharpe')
cerebro.addanalyzer(bt.analyzers.DrawDown, _name='drawdown')
cerebro.addanalyzer(bt.analyzers.Returns, _name='returns')
print('初始资金: %.2f' % cerebro.broker.getvalue())
results = cerebro.run()
print('最终资金: %.2f' % cerebro.broker.getvalue())
return cerebro, results
# ===================== 可视化模块 =====================
def visualize_results(cerebro):
cerebro.plot(style='candlestick', volume=False, figsize=(12, 8))
# ===================== 风险控制模块 =====================
class RiskManagement(bt.Indicator):
"""
自定义风险指标示例(最大回撤控制)
"""
lines = ('max_dd',)
params = (('max_allowed_dd', 0.2),)
def __init__(self):
self.addminperiod(20)
self.highwater = bt.Max(self.data.close)
self.drawdown = (self.highwater - self.data.close)/self.highwater
def next(self):
self.lines.max_dd[0] = self.drawdown[0]
if self.drawdown[0] > self.p.max_allowed_dd:
self.log(f'触发最大回撤限制: {self.drawdown[0]:.2%} > {self.p.max_allowed_dd:.2%}')
# ===================== 主程序 =====================
if __name__ == '__main__':
# 获取数据
data = fetch_data(symbol='AAPL', start='2020-01-01', end='2023-01-01')
# 运行回测
cerebro, results = run_backtest(data)
# 输出关键指标
strat = results[0]
print('夏普比率:',
strat.analyzers.sharpe.get_analysis()['sharperatio'])
print('最大回撤:',
strat.analyzers.drawdown.get_analysis()['max']['drawdown'])
print('年化收益率:',
strat.analyzers.returns.get_analysis()['rnorm100'])
# 可视化结果
visualize_results(cerebro)
```
### 代码结构说明:
1. **数据获取模块**:使用`yfinance`从雅虎财经获取历史数据
2. **策略逻辑**:定义双均线交叉策略(5日均线上穿20日均线买入,下穿卖出)
3. **回测框架**:集成`backtrader`的回测引擎,支持手续费设置和资金管理
4. **风险管理**:包含最大回撤监控模块(可扩展止损止盈逻辑)
5. **可视化**:生成K线图与交易信号叠加的可视化结果
### 扩展建议:
- **增加因子**:添加MACD、RSI等技术指标
- **机器学习**:整合sklearn实现预测模型
- **高频交易**:使用`ccxt`接入交易所实时API
- **参数优化**:添加遗传算法优化参数:
```python
cerebro.optstrategy(
DualMovingAverageStrategy,
fast_period=range(5, 20, 5),
slow_period=range(20, 60, 10)
)
```
### 注意事项:
1. 该代码仅为示例框架,实盘交易需增加:
- 实时数据接口
- 订单类型管理(限价单/市价单)
- 滑点控制
- 更严格的风险控制模块
2. 回测结果可能存在过拟合,需进行Walk-Forward检验
3. 建议使用WIND、Tushare等专业金融数据源替代雅虎财经
需要更复杂的策略实现(如高频做市、套利策略)或具体交易所接口对接,可进一步说明需求。