
数据获取与管理
股票与期货量化交易的第一步是获取高质量的历史与实时数据。Python生态提供了多种工具,yfinance库可以拉取美股与部分A股数据,tushare适合国内股票期货数据,ccxt则覆盖数字货币。期货数据需要关注主力合约拼接,避免换月跳空影响回测。数据清洗环节处理缺失值、异常价格与停牌标记,用pandas的resample方法统一时间频率至1分钟、5分钟或日线。存储方面,SQLite或Parquet格式适合本地快速读写,DuckDB能加速大规模查询。
import yfinance as yf
import pandas as pd
# 获取股票数据
df = yf.download('AAPL', start='2020-01-01', end='2023-01-01', interval='1d')
# 获取期货连续合约数据示例(使用tushare需要token)
# import tushare as ts
# pro = ts.pro_api('your_token')
# futures = pro.fut_daily(ts_code='IF.CFX', start_date='20200101', end_date='20230101')
# 数据清洗
df = df.dropna()
df = df[df['Volume'] > 0]
df.index = pd.to_datetime(df.index)
策略开发与信号生成
股票策略常见因子包括动量、均值回归、波动率突破。期货策略注重期限结构、展期收益率与持仓量变化。用Python实现信号时,避免未来函数,确保每个时间点仅使用历史数据。移动平均交叉、布林带、RSI等指标可用ta-lib或pandas_ta计算。期货跨期套利策略需计算价差z-score,股票多因子策略需正交化处理。信号生成后转为交易指令,区分开仓、平仓、止损。
import pandas_ta as ta
df['SMA_20'] = ta.sma(df['Close'], length=20)
df['SMA_50'] = ta.sma(df['Close'], length=50)
df['signal'] = 0
df.loc[df['SMA_20'] > df['SMA_50'], 'signal'] = 1
df.loc[df['SMA_20'] < df['SMA_50'], 'signal'] = -1
df['position'] = df['signal'].shift(1) # 避免未来函数
回测框架与绩效评估
backtrader、vectorbt、zipline是主流回测库。backtrader支持股票期货多品种、多周期,vectorbt向量化回测速度快。回测需考虑交易成本:股票佣金万分之二点五,期货手续费与滑点。绩效指标包括夏普比率、最大回撤、年化收益、胜率、盈亏比。期货保证金交易需计算杠杆后的真实收益。用pyfolio或quantstats生成可视化报告。注意回测过拟合,使用样本外测试与滚动窗口。
import backtrader as bt
class SmaCross(bt.Strategy):
params = dict(period=20)
def __init__(self):
self.sma = bt.indicators.SimpleMovingAverage(self.data.close, period=self.params.period)
def next(self):
if not self.position:
if self.data.close[0] > self.sma[0]:
self.buy(size=100)
else:
if self.data.close[0] < self.sma[0]:
self.close()
cerebro = bt.Cerebro()
cerebro.addstrategy(SmaCross)
data = bt.feeds.PandasData(dataname=df)
cerebro.adddata(data)
cerebro.broker.setcash(100000)
cerebro.broker.setcommission(commission=0.00025)
cerebro.run()
风险管理与仓位控制
量化交易核心在于风险控制。股票组合使用波动率倒数加权或风险平价。期货采用固定比例保证金,每笔交易风险不超过总资金2%。止损用ATR倍数,止盈用移动平均或固定盈亏比。凯利公式可优化下注比例,但需谨慎使用。最大回撤监控触发降仓。Python中可用numpy计算协方差矩阵,scipy.optimize求解最优权重。

import numpy as np
returns = df['Close'].pct_change().dropna()
volatility = returns.rolling(20).std()
position_size = 0.02 / volatility # 风险2%
position_size = position_size.clip(0, 1)
实盘执行与自动化
实盘接口选择:股票用easytrader、miniqmt,期货用CTP接口包装如vnpy、pyctp。部署在云服务器,定时任务调度用APScheduler。订单管理包括限价单、市价单、止损单。监控日志用logging模块,异常报警通过邮件或钉钉。期货夜盘需处理不同交易时段。实盘前用模拟盘验证至少三个月。
from apscheduler.schedulers.blocking import BlockingScheduler
def trading_job():
# 获取最新行情、计算信号、下单
pass
sched = BlockingScheduler()
sched.add_job(trading_job, 'cron', day_of_week='mon-fri', hour='9', minute='30')
sched.start()
期货特有考量
期货合约有到期日,回测需拼接主力连续合约,处理换月价差。保证金制度放大盈亏,需计算动态权益。期货交易时段与股票不同,夜盘行情需单独处理。跨期套利、跨品种套利在Python中可通过统计套利实现,协整检验用statsmodels。期货持仓限额与大户报告制度影响策略容量。
import statsmodels.api as sm
# 协整检验
score, pvalue, _ = sm.tsa.coint(price_a, price_b)
if pvalue < 0.05:
# 计算价差z-score
spread = price_a - beta * price_b
zscore = (spread - spread.mean()) / spread.std()
持续优化与迭代
策略上线后定期评估因子衰减,重新训练参数。使用walk-forward分析避免过拟合。机器学习方法如随机森林、LSTM可预测价格,但需特征工程与交叉验证。强化学习用于动态仓位管理。社区资源如QuantConnect、聚宽提供研究环境。保持代码版本控制,记录每次交易日志。
Python量化交易从数据到实盘形成闭环,股票与期货策略各有侧重。掌握核心库与风控逻辑,持续迭代,方能在市场中获得稳定收益。