环境搭建与数据准备:虚拟交易环境配置、历史数据获取与清洗、回测框架选择
说实话,很多做量化的人一上来就急着写策略。我见过太多人,策略写得花里胡哨,结果回测环境没搭对,数据全是坑。嗯,今天咱们就把这第一步走扎实。
环境搭建和数据准备,说白了就是给策略搭个舞台。舞台不稳,戏再好也白搭。我个人习惯把这块分成三个部分:虚拟交易环境、历史数据、回测框架。咱们一个一个来。
虚拟交易环境配置
为什么要搞虚拟环境?你想想看,真金白银的实盘谁敢直接上?我刚开始做量化那会儿,就吃过这个亏。策略在本地跑得飞起,一上实盘就崩。后来才明白,本地环境和实盘环境差太多了。
虚拟交易环境的核心,就是模拟真实券商的API接口。我个人推荐用Docker来隔离环境。为什么?因为依赖管理太烦了。你装个pandas版本不对,整个回测结果都可能变。
核心配置清单:
- Python 3.8+(别用3.6了,很多库都不支持)
- pandas 1.3+(数据处理必备)
- numpy 1.21+(数值计算)
- 回测框架(后面会细说)
- 数据库(SQLite或PostgreSQL)
# 我的标准Dockerfile片段
FROM python:3.9-slim
WORKDIR /app
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
# 注意:这里要设置时区
ENV TZ=Asia/Shanghai
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime
COPY . .
CMD ["python", "run_backtest.py"]
小技巧:我习惯在本地用虚拟环境,但生产环境用Docker。这样开发调试方便,部署也一致。别问我为什么,问就是踩过坑。
历史数据获取与清洗
数据是量化策略的命根子。数据有问题,策略再牛也是白搭。我曾经因为一个除权除息的数据没处理好,回测收益率差了20%。嗯,那感觉就像考试时发现题目看错了。
数据获取有几个渠道:
- 免费数据源:Yahoo Finance、东方财富、Tushare(部分免费)
- 付费数据源:Wind、Choice、聚宽
- 自己爬:不推荐,维护成本太高
我个人建议,初期用免费数据就够了。但要注意,免费数据经常有缺失和错误。我一般会做以下清洗:
def clean_market_data(df):
"""
数据清洗函数 - 我踩过的坑都写在注释里了
"""
# 1. 去除重复行
df = df.drop_duplicates(subset=['date', 'code'])
# 2. 处理缺失值
# 注意:前向填充要小心,连续缺失超过3天就别填了
df = df.fillna(method='ffill', limit=3)
# 3. 去除停牌数据
df = df[df['volume'] > 0]
# 4. 处理复权
# 我习惯用后复权,这样看历史走势更真实
df['adj_close'] = df['close'] * df['adj_factor']
return df
注意:数据清洗时,千万别用未来数据。我见过有人用当天的收盘价去算当天的指标,这属于典型的未来函数。回测时看着漂亮,实盘直接完蛋。
数据频率也是个问题。日线数据最简单,但很多策略需要分钟级数据。我个人经验是:
| 策略类型 | 推荐数据频率 | 数据量(1年) |
|---|---|---|
| 趋势跟踪 | 日线 | 约250条/标的 |
| 均值回归 | 30分钟线 | 约4800条/标的 |
| 高频策略 | Tick级 | 海量 |
回测框架选择
回测框架这块,我折腾过不少。从自己手写到用现成的,各有优劣。说白了,没有最好的框架,只有最适合你的。
目前主流的回测框架有:
- Backtrader:功能全面,社区活跃,适合大多数场景
- Zipline:Quantopian出品,但维护不太积极了
- PyAlgoTrade:轻量级,适合快速验证想法
- vnpy:国内团队开发,支持实盘
我个人最常用的是Backtrader。为什么?因为它灵活,而且文档写得不错。我刚开始用的时候,照着文档写了个简单的双均线策略,半小时就跑通了。
import backtrader as bt
class MyStrategy(bt.Strategy):
def __init__(self):
self.sma_short = bt.indicators.SimpleMovingAverage(
self.data.close, period=10)
self.sma_long = bt.indicators.SimpleMovingAverage(
self.data.close, period=30)
def next(self):
if self.sma_short > self.sma_long:
self.buy()
elif self.sma_short < self.sma_long:
self.sell()
# 初始化回测引擎
cerebro = bt.Cerebro()
cerebro.addstrategy(MyStrategy)
# 加载数据
data = bt.feeds.PandasData(dataname=clean_data)
cerebro.adddata(data)
# 运行回测
results = cerebro.run()
选框架的建议:别一上来就追求功能最全的。先选一个你三天内能上手的框架,跑通一个最简单的策略。等你有感觉了,再考虑换更专业的框架。
框架选好后,还要注意几个细节:
- 滑点设置:别设0,实盘不可能没滑点。我一般设0.1%
- 手续费:不同券商不一样,要查清楚
- 资金管理:别全仓干,回测时就要考虑仓位控制
好了,环境搭好了,数据准备好了,框架也选好了。接下来就是写策略、跑回测、调参数。但记住,回测只是开始,不是结束。我见过太多人在回测上花太多时间,结果实盘还是亏。嗯,这个咱们后面再聊。
公众号:蓝海资料掘金营,微信deep3321