一个基于Python的简单量化交易策略核心代码示例

liftword4周前 (02-11)技术文章15

以下是一个基于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等专业金融数据源替代雅虎财经

需要更复杂的策略实现(如高频做市、套利策略)或具体交易所接口对接,可进一步说明需求。

相关文章

Python量化交易:策略创建运行流程

学习目标目标知道策略的创建和运行知道策略的相关设置知道RQ的策略运行流程应用无1、体验创建策略、运行策略流程1.1 创建策略1.2 策略界面2、 策略界面功能、运行介绍2.1 一个完整的策略需要做的事...

5分钟教会你:如何用python写一个量化交易程序

在量化交易领域,Python凭借其丰富的库和简洁的语法成为众多开发者的首选语言。下面这篇文章将为你详细介绍如何用Python编写一个简单的交易量化程序,适合有一定编程基础且对量化交易感兴趣的读者。用P...

手把手教你用Python搭建自己的量化回测框架「均值回归策略」

引言大部分量化策略都可以归类为均值回归与动量策略。事实上,只有当股票价格是均值回归或趋势的,交易策略才能盈利。否则,价格是随机游走的,交易将无利可图。均值回归是金融学的一个重要概念,指股票价格无论高于...

如何用 Python 打造你的专属量化交易软件全解析

在金融科技飞速发展的今天,量化交易越来越受到投资者的青睐。Python作为一门强大且灵活的编程语言,为我们搭建期货量化交易软件提供了有力工具。今天,就让我们深入探讨如何用Python实现这一目标。量化...

「精彩漫画」带你秒懂8种常见的量化选股模型

本漫画转自公众号金财维,作者财维君。(资料来源:金财维,作者财维君,版权归原作者所有)关于Python金融量化专注于分享Python在金融量化领域的应用。加入知识星球,可以免费获取量化投资视频资料、量...