
自动化交易不是神秘黑盒,拆开看就四件事
很多人一听到编程炒股,脑子里浮现的是电影里满屏跳动的数字和红绿线条。其实扒掉那层高科技外衣,自动化交易干的事跟你在手机上手动点买卖没有本质区别。区别只在于:你用手和眼睛,它用代码和网线。
要把这件事跑通,你只需要凑齐四块拼图。第一块叫数据,得让程序知道现在股票或者期货合约是什么价格。第二块叫策略,程序得知道什么条件下该买、什么条件下该卖。第三块叫执行,程序得能把买卖指令送到券商或者期货公司的服务器上。第四块叫风控,程序得知道亏多少该收手,不能由着性子乱来。

这四块拼图缺一不可。很多人只盯着策略那块,觉得找到一个神奇的指标就能躺赚,结果数据延迟一秒钟、下单接口卡一下,账户就绿得发亮。
数据从哪来,别一开始就花钱买
写程序第一件事是喂数据。对股票来说,最省事的办法是用开源库。akshare 或者 tushare 这类 Python 库能免费拉取日线、分钟线甚至实时快照。你只需要写几行代码调用接口,就能把一只股票过去几年的收盘价拿到手。
期货数据稍微麻烦一点,因为期货合约有到期换月的问题。免费渠道拿连续合约数据容易有拼接误差,这时候要么用文华财经或者博易大师导出历史数据,要么花点小钱买一份清洗好的数据。
数据到手第一件事不是急着算指标,而是检查有没有缺失值和异常值。某天收盘价突然是 0 或者比前一天翻了十倍,大概率是数据源出错。这种脏数据喂给策略,回测收益能给你画出天际线,实盘一秒打回原形。
策略逻辑用大白话写出来,再翻译成代码
策略不需要多复杂。拿最经典的均线交叉举例:五日均线向上穿过二十日均线就买入,向下穿过就卖出。这句话用大白话讲给任何人都能听懂。
翻译成 Python 代码无非是这样:
import pandas as pd
df['ma5'] = df['close'].rolling(5).mean()
df['ma20'] = df['close'].rolling(20).mean()
df['signal'] = 0
df.loc[df['ma5'] > df['ma20'], 'signal'] = 1
df.loc[df['ma5'] < df['ma20'], 'signal'] = -1
这段代码的意思就是:算五日均线和二十日均线,前者在上就标记为持仓信号,后者在上就标记为空仓信号。最后根据信号变化算出手续费后的净值曲线。
但这里有个坑。回测的时候你用的是收盘价信号,实盘里你不可能刚好在收盘那一秒成交。第二天开盘跳空高开,你的买入成本直接比回测高了两个点,策略的利润空间瞬间被吃掉一大块。
执行环节才是分水岭,券商接口各有各的门槛
策略回测赚钱只是万里长征第一步。真正决定自动化交易能不能落地的,是执行接口。
股票这边,大部分券商不提供直接下单的 API 给散户。你要么用券商官方提供的量化交易终端,要么走第三方平台比如聚宽、米筐,它们对接了部分券商的交易通道。门槛最低的方式是使用模拟盘接口先跑通流程,比如雪球组合或者券商的模拟交易环境。
期货这边相对开放。上期技术的 CTP 接口是行业标准,期货公司基本都支持。你用 Python 的 vnpy 或者 ctpbee 这类框架,填上期货公司给的经纪商代码、账号密码、服务器地址,就能连上仿真环境下单。仿真环境跟实盘环境几乎一模一样,区别只是钱是假的。
这里必须提醒一句:股票实盘接口的合规要求非常高,很多个人开发者写的自动下单程序踩了券商的風控红线,账户直接被限制交易。期货 CTP 接口虽然开放,但程序化交易报备是硬性规定,不报备就等着被交易所请喝茶。
风控不是可选项,是保命符
程序化交易最怕的不是亏钱,是失控。手动交易你看到跳水会手抖,程序不会。程序只会忠实地执行你写的逻辑,哪怕这个逻辑在极端行情里是自杀式操作。
所以风控模块必须在策略上线前就焊死在代码里。至少要包含三层:单笔最大亏损限制、总仓位上限、连续亏损后的冷却期。
单笔最大亏损的意思是:这一笔交易亏掉账户总资金的百分之一,程序必须无条件平仓。总仓位上限的意思是:不管信号多强烈,最多只能动用五成资金。冷却期的意思是:连续亏三次,程序自动休眠一天,让你有机会检查是不是市场环境变了。
这三条写起来就几十行代码,但能在极端行情里救你的命。
回测曲线漂亮不等于实盘赚钱
所有刚接触自动化交易的人都会经历一个阶段:调参数调到回测收益曲线完美得不像话。把均线周期从五和二十改成七和二十三,收益翻一倍。再加一个 RSI 过滤条件,回撤减半。
这种操作叫过拟合。你是在用历史数据反向雕刻策略,让它完美贴合过去三年的走势。但未来的走势不会重复过去三年的每一个细节。
检验过拟合最简单的办法是样本外测试。拿最近半年的数据完全不参与参数调整,用前面调好的策略跑这半年,看收益是否还站得住。如果样本外收益跟样本内差了三倍以上,这个策略基本可以扔了。
还有一个被很多人忽略的成本:滑点。回测里你假设成交价就是收盘价,实盘里买单挂出去要等对手盘,价格稍微动一下你就得多付钱。期货还好,流动性好的合约滑点小。股票小盘股滑点能吃掉你一半利润。回测时把滑点设成千分之一到千分之三,看看策略还活不活得下来。
从模拟盘到实盘,步子迈小一点
真金白银上线之前,至少跑一个月模拟盘。模拟盘的目的不是验证策略赚不赚钱,是验证代码会不会在半夜两点因为网络抖动重复下单,是验证券商接口在开盘集合竞价时段会不会返回超时错误。
这些工程问题不解决,策略再好也白搭。很多人回测年化百分之三十,实盘第一个月亏百分之十,不是因为策略失效,是因为信号重复触发多买了两倍仓位。
期货 CTP 仿真环境是个很好的练手场。申请一个仿真账号,用 vnpy 的图形界面或者自己写脚本连上去,让程序自动跑一个月。这期间你会遇到各种报错:连接断开、委托被拒、持仓不匹配。把每个报错都处理掉,你的代码才算有了上实盘的资格。
写给想动手的人
自动化交易不是圣杯。它只是一个工具,把你想好的规则用代码固化下来,让你不用盯盘也能执行纪律。纪律本身不保证赚钱,但没纪律一定亏钱。
如果你真想动手,路线图很简单:先用 akshare 拉数据写一个均线策略回测,跑通流程。再把策略逻辑写成函数,每天收盘后自动计算信号并发送到你的微信或者邮箱。然后用期货仿真接口写一个自动下单脚本,跑一个月模拟盘。最后用小资金实盘跑三个月,亏了就当交学费,赚了也别急着加仓。
这条路没有捷径,但每一步都踩实了,比听消息追涨杀跌靠谱得多。