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

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

发布者:股市刺客,转载请注明出处:https://www.95sca.cn/archives/1305454
站内所有文章皆来自网络转载或读者投稿,请勿用于商业用途。如有侵权、不妥之处,请联系站长并出示版权证明以便删除。敬请谅解!

(0)
股市刺客的头像股市刺客
上一篇 4天前
下一篇 2024 年 7 月 29 日

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注