环境搭建与数据准备:虚拟交易环境配置、历史数据获取与清洗、回测框架选择

说实话,很多做量化的人一上来就急着写策略。我见过太多人,策略写得花里胡哨,结果回测环境没搭对,数据全是坑。嗯,今天咱们就把这第一步走扎实。

环境搭建和数据准备,说白了就是给策略搭个舞台。舞台不稳,戏再好也白搭。我个人习惯把这块分成三个部分:虚拟交易环境、历史数据、回测框架。咱们一个一个来。

虚拟交易环境配置

为什么要搞虚拟环境?你想想看,真金白银的实盘谁敢直接上?我刚开始做量化那会儿,就吃过这个亏。策略在本地跑得飞起,一上实盘就崩。后来才明白,本地环境和实盘环境差太多了。

虚拟交易环境的核心,就是模拟真实券商的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