从零开始:用Python实现量化项目的单元测试
从零开始:用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)
这个简单测试能防止你把金叉死叉逻辑写反——我见过有人因此一晚上亏掉三个月工资。
那些必须测试的"危险分子"
根据我们营业部的数据统计,量化交易中最容易出问题的三个模块是:
- 数据清洗模块:去年有客户因为没处理停牌股票,导致策略在涨停板挂单失败
- 订单生成逻辑:曾经有个网格策略把"小于"写成"不大于",结果疯狂追涨杀跌
- 资金计算单元:最经典的手滑——有人忘记扣除手续费,实盘时发现收益率对不上
建议给每个危险函数都配上"报警测试":
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,避免了下周一开盘的灾难。
开户前先给你的代码体检
说了这么多,其实就想告诉你:量化交易不是比谁策略聪明,而是比谁少犯错。在我们营业部开户的量化客户,我都会建议他们先完成这三步:
- 给现有策略补全单元测试
- 把覆盖率提到70%以上
- 设置持续集成警报
等你把这些基础设施搭好,欢迎来找我开通机构级量化交易通道——我们会提供专属的模拟交易环境,带历史tick数据回放的那种。毕竟,用真钱测试代码的时代早就过去了。
更多推荐
所有评论(0)