
数据获取与预处理
量化交易策略的起点是获取高质量的市场数据。Python生态提供了多种数据源接口,包括tushare、akshare、yfinance、ccxt等,覆盖股票、期货、数字货币等品种。以期货分钟线数据为例,使用akshare获取主力合约连续数据:
import akshare as ak
# 获取螺纹钢期货主力连续合约日线数据
df = ak.futures_main_sina(symbol="RB0", start_date="2020-01-01", end_date="2024-12-31")
df.rename(columns={'日期': 'date', '开盘价': 'open', '最高价': 'high', '最低价': 'low', '收盘价': 'close', '成交量': 'volume'}, inplace=True)
df['date'] = pd.to_datetime(df['date'])
df.set_index('date', inplace=True)
df = df[['open', 'high', 'low', 'close', 'volume']].astype(float)
数据清洗需处理缺失值、异常值、停牌日。期货数据需注意合约换月,采用主力连续或后复权价格避免跳空。股票数据需考虑除权除息,使用前复权价格。数据标准化后存入本地数据库或内存,便于快速回测。
策略逻辑构建
策略逻辑是量化交易的核心,决定买卖条件。常见策略类型包括趋势跟踪、均值回归、套利、高频做市。以双均线趋势策略为例,采用短期均线上穿长期均线做多,下穿做空。使用pandas计算指标:

df['ma_short'] = df['close'].rolling(window=10).mean()
df['ma_long'] = df['close'].rolling(window=30).mean()
df['signal'] = 0
df.loc[df['ma_short'] > df['ma_long'], 'signal'] = 1
df.loc[df['ma_short'] < df['ma_long'], 'signal'] = -1
信号需滞后一期避免未来函数,即当日收盘后计算信号,次日开盘执行。对于期货,可加入波动率过滤,当ATR超过阈值时降低仓位。对于股票,可加入基本面因子如市盈率、ROE,构建多因子模型。策略逻辑应简洁、可解释,避免过度拟合。
回测框架与绩效评估
回测验证策略历史表现,Python中backtrader、vnpy、zipline、vectorbt等框架可加速开发。以backtrader为例,定义策略类:
import backtrader as bt
class DualMAStrategy(bt.Strategy):
params = (('short_period', 10), ('long_period', 30),)
def __init__(self):
self.ma_short = bt.indicators.SMA(self.data.close, period=self.params.short_period)
self.ma_long = bt.indicators.SMA(self.data.close, period=self.params.long_period)
self.crossover = bt.indicators.CrossOver(self.ma_short, self.ma_long)
def next(self):
if not self.position:
if self.crossover > 0:
self.buy(size=1)
elif self.crossover < 0:
self.sell(size=1)
else:
if self.crossover < 0:
self.close()
self.sell(size=1)
elif self.crossover > 0:
self.close()
self.buy(size=1)
绩效评估指标包括年化收益率、最大回撤、夏普比率、胜率、盈亏比。使用pyfolio或quantstats生成报告。回测需考虑交易成本、滑点、手续费,期货还需保证金和杠杆。避免过度优化参数,采用样本外测试和滚动回测。
风险管理与资金管理
风险管理决定策略长期生存能力。仓位管理采用凯利公式、固定比例或波动率倒数。期货交易需计算保证金占用,设置止损止盈。股票交易需分散行业,控制单票权重。风险指标包括VaR、CVaR、beta。
# 固定比例仓位管理
risk_per_trade = 0.02 # 每笔交易风险2%
account_size = 1000000
stop_loss_pct = 0.05
position_size = (account_size * risk_per_trade) / (df['close'].iloc[-1] * stop_loss_pct)
动态止损采用跟踪止损、ATR止损。期货跨期套利需监控价差和库存。股票组合需再平衡,控制换手率。风险预算模型分配不同策略权重,降低相关性。
实盘执行与监控
实盘执行将信号发送至券商或交易所接口。Python通过ctp、ibapi、futu、easytrader等连接。股票使用华泰、中信等API,期货使用CTP、飞马。执行算法包括TWAP、VWAP、冰山指令。
# 使用vnpy连接CTP期货接口
from vnpy_ctp import CtpGateway
from vnpy.event import EventEngine
event_engine = EventEngine()
main_engine = MainEngine(event_engine)
main_engine.add_gateway(CtpGateway)
main_engine.connect({'用户名': 'xxx', '密码': 'xxx', '经纪商代码': '9999', '交易服务器': 'tcp://180.168.146.187:10130', '行情服务器': 'tcp://180.168.146.187:10131'})
监控系统实时跟踪持仓、盈亏、风险敞口。异常处理包括网络断开、订单拒绝、行情延迟。日志记录每笔交易,便于归因分析。策略上线前需模拟盘运行至少一个月,验证稳定性和执行偏差。
策略优化与迭代
策略迭代基于绩效归因和市場变化。参数优化采用网格搜索、遗传算法、贝叶斯优化,避免过拟合。因子挖掘使用机器学习,如随机森林、LSTM预测价格。另类数据包括新闻情绪、卫星图像、供应链数据。
from sklearn.ensemble import RandomForestClassifier
from sklearn.model_selection import TimeSeriesSplit
features = df[['ma_short', 'ma_long', 'volume', 'atr']].dropna()
labels = (df['close'].shift(-1) > df['close']).astype(int).dropna()
tscv = TimeSeriesSplit(n_splits=5)
for train_idx, test_idx in tscv.split(features):
model = RandomForestClassifier(n_estimators=100)
model.fit(features.iloc[train_idx], labels.iloc[train_idx])
score = model.score(features.iloc[test_idx], labels.iloc[test_idx])
策略组合分散风险,低相关策略叠加提升夏普。定期重新训练模型,适应市场制度变迁。期货策略关注展期收益、期限结构。股票策略关注风格轮动、行业景气。
代码工程化与部署
策略代码需模块化、版本控制、单元测试。使用git管理,pytest测试核心函数。部署采用docker容器,定时任务用airflow或crontab。生产环境分离研究、回测、实盘。
# 策略配置文件config.yaml
strategy:
name: dual_ma
short_period: 10
long_period: 30
risk:
max_position: 0.3
stop_loss: 0.05
使用argparse或click解析参数,logging记录运行状态。异步IO提升行情处理速度。数据库存储tick和分钟线,redis缓存最新行情。实盘需考虑延迟,采用C++扩展或numba加速。
量化交易中Python编写策略覆盖数据、逻辑、回测、风控、执行、优化、工程化全流程。股票和期货市场特性不同,股票需关注基本面、分红、停牌,期货需关注杠杆、保证金、换月。持续学习市场微观结构,迭代策略,控制风险,方能实现稳定收益。