从零开始:用Python实现量化项目的单元测试

那个凌晨三点崩溃的交易系统

去年有个客户半夜给我打电话,声音都在发抖:"王经理,我的策略今早自动平仓了全部头寸,可市场明明在上涨啊!"我让他把日志发过来一看,原来是价格波动触发了某个边界条件,导致风控模块误判。这种事情我见得太多了——很多量化新手把全部精力放在策略开发上,却忘了给代码穿上"防弹衣"。

为什么单元测试能救你的账户

想象你是个建筑工人,单元测试就像每砌完一层砖就用水平仪检查一次。我在营业部见过太多这样的悲剧:某个策略回测年化60%,实盘却亏掉30%,最后发现是数据处理函数少除了个100。Python的unittest模块就是你的安全绳,它能帮你抓住这些"幽灵bug"。

上周有个程序员客户给我展示他的双均线策略,我让他运行python -m unittest,结果7个测试用例红了4个——其中一个竟然是把买卖信号搞反了。要是直接上实盘,相当于给市场送钱。

搭建你的第一个测试战场

先别急着写策略,我们在项目根目录建个tests文件夹。记住这个铁律:每个strategy.py旁边必须有个test_strategy.py。就像炒菜得备着灭火器,我的开户客户里,养成这个习惯的最后爆仓率能降低60%。

拿最常见的均线交叉来说,测试文件大概长这样:

import unittest
from strategy import MovingAverageCross

class TestMAC(unittest.TestCase):
    def test_golden_cross(self):
        # 构造测试数据
        fake_prices = [10,10,10,20,20] 
        strategy = MovingAverageCross(short_window=2)
        signals = strategy.generate_signals(fake_prices)
        # 断言第五天应该发出买入信号
        self.assertEqual(signals[-1], 1)

这个简单测试能防止你把金叉死叉逻辑写反——我见过有人因此一晚上亏掉三个月工资。

那些必须测试的"危险分子"

根据我们营业部的数据统计,量化交易中最容易出问题的三个模块是:

  1. 数据清洗模块:去年有客户因为没处理停牌股票,导致策略在涨停板挂单失败
  2. 订单生成逻辑:曾经有个网格策略把"小于"写成"不大于",结果疯狂追涨杀跌
  3. 资金计算单元:最经典的手滑——有人忘记扣除手续费,实盘时发现收益率对不上

建议给每个危险函数都配上"报警测试":

def test_handle_halted_stock(self):
    # 模拟停牌股票数据
    halted_data = {'volume': 0, 'close': 10}
    self.assertRaises(TradingHaltError, clean_data, halted_data)

用mock对象避开实盘流血测试

新手常犯的错误是拿真金白银测试网络请求——我有客户因此被券商限制API调用。Python的unittest.mock能模拟交易所响应:

from unittest.mock import patch

class TestOrder(unittest.TestCase):
    @patch('exchange_api.place_order')
    def test_order_limit(self, mock_order):
        # 设置模拟返回值
        mock_order.return_value = {'order_id': 'test123'}
        result = send_order('BTC', 'buy', 100)
        self.assertEqual(result['order_id'], 'test123')

这相当于在虚拟战场练兵,等测试全部通过再上真实战场。我们营业部给量化客户准备的模拟交易系统就是这个原理。

测试覆盖率是你的防弹衣

光有测试不够,还得知道测试得多全面。安装coverage模块,运行:

coverage run -m unittest discover
coverage report -m

理想情况要覆盖80%以上核心代码。有个做CTA策略的客户,覆盖率从40%提升到75%后,实盘异常减少了90%。就像开车系安全带,可能一辈子用不上,但用上就是救命时刻。

持续集成:你的自动哨兵

最后教你个绝活:把测试挂到GitHub Actions上。每次push代码都自动运行测试,就像雇了个24小时盯盘的保安。这是我的.github/workflows/test.yml配置模板:

name: Strategy Tests
on: [push]
jobs:
  test:
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@v2
    - name: Set up Python
      uses: actions/setup-python@v2
    - name: Run tests
      run: |
        python -m pip install -r requirements.txt
        python -m unittest

上周这个配置帮一个客户发现了节假日数据处理的bug,避免了下周一开盘的灾难。

开户前先给你的代码体检

说了这么多,其实就想告诉你:量化交易不是比谁策略聪明,而是比谁少犯错。在我们营业部开户的量化客户,我都会建议他们先完成这三步:

  1. 给现有策略补全单元测试
  2. 把覆盖率提到70%以上
  3. 设置持续集成警报

等你把这些基础设施搭好,欢迎来找我开通机构级量化交易通道——我们会提供专属的模拟交易环境,带历史tick数据回放的那种。毕竟,用真钱测试代码的时代早就过去了。

Logo

北京人形旗下天工造物具身智能开源社区,聚焦具身天工与慧思开物两大平台

更多推荐