先说结论:这套东西我折腾了大概两个月,从第一版只会机械执行网格策略的“呆瓜脚本”,到现在的自动量化终端,核心变化不是加了多少指标,而是把大模型接进了决策链路,让它替代人去做信息判断和模式识别。
标题里既然敢写“24H在线实盘”,我就先把丑话说在前面:实盘有风险,任何自动交易系统都有可能亏钱,我自己磨合期间也吃过回撤。写这篇文章不是劝你拿真金白银冲进去,而是把整个系统的设计思路、实现细节、踩过的坑全部开源讲清楚。源码在GitHub上,你可以直接拿去跑回测,也可以根据自己的策略改。
我始终觉得,量化交易给人最大的误解是“靠模型躺赚”,实际上90%的精力都花在数据清洗、特征工程、风控和运维上。这篇文章就把这些“不性感但致命”的过程摊开讲。
1. 为什么传统指标策略越来越不赚钱:滞后性与同质化的恶性循环
先讲一个我这几年做量化的真实感受。如果你打开任何一款交易软件,随便挑一个标的,叠加MACD、KDJ、布林带这些经典指标,你会发现一个规律:当均线金叉出现的时候,往往行情已经走了一半;当RSI进入超买区,回调往往已经开始了。这不是指标设计得不好,而是所有基于历史价格的计算公式,本质上都在用过去推算未来,必然存在滞后。
更麻烦的是同质化问题。当一个策略被写进无数散户的交易软件里,它的超额收益就会快速衰减。用均线策略的人多了,均线金叉之后追进去的人就会互相踩踏,滑点变大,胜率下降。这不是我拍脑袋说的,你可以用任何回测框架验证:2015年胜率不错的双均线策略,放到现在的市场里,参数再怎么优化,年化收益也很难看。
所以我的判断是:传统技术指标的死板,死板在“公式固定”。它不管市场当下处于什么状态——是趋势行情、震荡行情还是消息驱动的行情,一律用一个固定函数去算买卖点。真实交易里的信息维度远远超过价格和成交量,政策消息、市场情绪、板块联动、资金流向,这些在传统指标里根本无法体现。
这也是我决定引入大模型来做自动量化终端的最初动机:与其手工设计几百个规则去模拟“对市场的理解”,不如让模型自主学习“什么状态下该怎么做”。大模型擅长的事情正好是处理多模态信息、捕捉非线性关系、理解上下文语境,这些东西恰恰是传统指标最缺失的。
1.1 传统量化系统的典型路径依赖
我见过不少个人量化玩家,包括我自己早期,一开始最喜欢用现成的量化框架:写几个指标函数,定义买入卖出条件,然后跑一遍历史数据,看到资金曲线向上,就觉得大功告成。但这类系统的核心缺陷是:
- 特征工程靠人工拍脑袋,你觉得什么指标有用就加什么,主观性太强
- 规则一旦写好就不变了,市场风格切换之后策略迅速失效
- 缺少对“状态”的识别,震荡和趋势用同一套逻辑在跑
这个认知很重要,因为它决定了后面整个系统的设计方向。如果我只是把大模型当成另一个“指标生成器”,那本质上还是老路子。真正应该改的是决策范式。
1.2 大模型量化不是简单预测涨跌
很多人一听“用大模型做交易”,第一反应是让AI预测明天涨还是跌。但我在实际测试中发现,直接让模型输出涨跌概率,效果非常差。原因很简单:价格波动中噪音占比太高,短周期预测本质上接近随机。
我采用的思路是让大模型去判断市场状态和风险等级,而不是直接给买卖点。相当于模型不是那个“喊单的人”,而是站在旁边观察的“参谋”,给主策略提供决策依据。传统策略负责执行,大模型负责判断当前环境适不适合执行。
这套分工逻辑后面会有详细展开,先给出两个关键数字:直接预测涨跌的模型,我测试了多种结构,胜率大多在50%到55%之间徘徊,扣掉手续费基本不赚钱;而改成状态识别之后,虽然单次交易的胜率提升不多,但盈亏比大幅改善——因为策略能在高波动风险状态下自动降低仓位甚至停止交易,避免了那种连续止损的大坑。
2. 终端整体架构:决策层、执行层、风控层怎么分工
这套自动量化终端,代码量大概一万多行,但核心架构并不复杂,分三个层次:决策层、执行层、风控层。
先看我画的整体数据流(文字版描述):大模型接收行情快照与多维特征 → 输出当前市场状态与风险评分 → 策略引擎基于状态信号计算目标仓位 → 风控模块校验订单是否合规 → 券商API执行下单 → 执行回报回传 → 监控面板展示所有状态。
这里最核心的一个设计原则是:大模型绝不直接下单。它输出的永远是建议和评分,真正决定下单的是策略引擎和风控模块。这个隔离非常重要,因为大模型不是100%正确的,如果让它直接操作账户,出问题的时候你连干预的机会都没有。
2.1 决策层:轻量级大模型与状态机
决策层里跑的是一个微调过的轻量级Transformer模型。为什么不用那些超大参数的模型?两个原因:一是推理延迟高,行情变化按毫秒算,模型憋两秒才给结果根本来不及;二是部署成本高,总不能为了跑量化随身带一个数据中心。
我用的是大概1.5B参数量的模型,量化后压缩到几百MB,单次推理延迟在100毫秒左右。这个速度对日级别以下、分钟级别的交易完全够用,但直接搞高频肯定不行。模型输出结构不是简单一个数字,而是多维度的JSON格式,包括:
- 市场状态分类:趋势向上、趋势向下、震荡、高波动
- 风险评分:0-100,越高代表当前市场环境越危险
- 置信度:模型对自己判断的信心程度,用于仓位调节
这个设计的好处是你可以用传统策略的思路去约束大模型的输出。比如置信度低于0.6的时候,即便模型说要加仓,策略引擎也可以选择不执行或半仓执行。
2.2 执行层:策略引擎与仓位管理
策略引擎不是直接用模型输出下单,而是把模型输出作为输入,再结合传统策略逻辑做综合判断。我核心的仓位管理逻辑类似凯利公式的改良版,但加了一个“模型风险评分”的惩罚项:
target_position = base_position * confidence * (1 - risk_score / 200)如果模型给出的风险评分是100,即使置信度高,仓位也会减半。这个公式看起来很简单,但实际效果非常明显——它让系统在剧烈波动行情中会自动降低风险敞口。
执行层还负责订单拆分。大单直接砸进去会造成比较大的冲击成本,所以系统会把一个大单拆成若干个小单,按照一定的间隔和时间窗口分步执行。这里我用了最简单的TWAP算法,并没有做太高深的东西,但在实际实盘中已经能有效降低滑点。
2.3 风控层:绝不妥协的那道防线
风控层是我在设计时要求自己“宁可错杀也不放过”的一个模块。系统里设置了多道硬性风控规则,任何一条触发都会直接终止交易或者拒绝订单,而不是“提醒一下就算了”:
- 单笔亏损超过账户净值2%时,立即平仓该仓位
- 日内累计亏损超过5%时,停止当日所有新开仓
- 持仓集中度超过30%时,拒绝继续买入
- 距离交易所限价偏差过大时,拒绝下单
- 模型连续输出高置信度但结果连续错误时,自动降权
其中最后一条是我在真实交易中吃过亏之后加上的。大模型和人类一样,会出现“蜜汁自信”的情况——连续几次判断对了之后,置信度输出得很高,结果下一次市场风格切换,模型还没适应过来,按照老经验继续下单,很容易连续亏损。所以我在决策层加了一个“连续错误衰减”机制:当模型近20次判断的胜率低于40%时,置信度输出会被乘以一个小于1的系数,让系统不敢重仓。
3. 数据与特征工程:决定模型上限的不是模型结构,而是喂给它的数据
很多人在这个环节翻车。大模型能力再强,你给它喂垃圾数据,它只会吐垃圾结论。我的数据管线经历了三个版本的迭代,花的时间比写整个交易逻辑还多。
3.1 多源数据的采集与清洗
自动量化终端的数据源我最终保留了三个:
- 行情数据:分钟级K线、逐笔成交,用于计算技术指标和波动率
- 资金流数据:主力资金净流入流出、北向资金变化(这里指可合法获取的公开数据)、板块资金排行
- 资讯情绪数据:对公开新闻标题做情感打分,再输入模型作为上下文特征
其中行情数据最容易获取,稳定性也最好。资金流数据稍微复杂一点,需要解析不同数据源的字段格式差异。最麻烦的是资讯情绪数据,因为新闻文本是非结构化的,你需要做实体识别、事件分类、情感打分,每一步都可能引入噪音。
我的处理方式是:资讯情绪数据不是喂给模型的唯一特征,而是作为辅助特征。模型的主输入仍然是结构化的行情技术指标序列,情感分数作为额外的特征通道拼进去。这样即使情感分析偶尔出错,对整体状态判断的影响也比较有限。
3.2 特征工程与时间窗口设计
在特征这一块,我没有用太花哨的方法,核心思路是“多尺度时间窗口 + 异构特征拼接”。每个样本包含过去5分钟、30分钟、4小时、1周这几个尺度下的统计特征,包括收益率、波动率、成交量变化率、价格相对位置等。
这里有一个很关键的细节:所有特征必须避免“未来函数”。比如你在计算某个技术指标时,用了当前时刻之后的数据,回测结果会异常漂亮,但实盘就会翻车。这个问题隐藏很深,我自己就踩过一次——用了一个基于全天数据的标准化函数,回测时表现惊艳,实盘发现数据是实时滚动变化的,逻辑完全不一样。
为了避免未来函数,我的做法是:所有特征在生成时只使用截至当前时刻的数据,并且做了一个严格的验证流程——把回测代码和实盘代码共用同一套特征函数,保证两者逻辑完全一致。
3.3 训练数据的标签如何定义
标签定义直接决定了模型学习的方向。我用的是三分类标签:未来一段时间上涨、下跌、震荡。但这里的“一段时间”不是随便拍的,而是根据策略的持仓周期来定。这套终端主要做短线波段,持仓周期大概在几个小时到几天,所以标签窗口设为未来4小时。
打标签的过程中还有一个比较隐蔽的问题:时间序列数据不能随机打乱。如果训练集和测试集的时间段交叉,模型就会“看到未来”,测试结果虚高。所以我的数据切分是按照时间顺序来的:前80%时间段做训练,中间10%做验证,最后10%做测试。
4. 大模型的选择与微调:从通用模型到“交易大脑”的训练实录
这里重点聊聊模型本身,因为这是整篇文章里我实验次数最多、踩坑最密集的部分。
4.1 为什么不直接调通用大模型的API
一开始图省事,我用过几家通用大模型的API,直接把行情数据文字化之后丢给它,让它给交易建议。结果很稳定,但稳定地不靠谱。主要问题有:
- 上下文长度限制,交易历史稍微长一点就装不下
- 输出不稳定,同一个行情,换个问法给的答案就变了
- 延迟不可控,网络抖动一下,实时性就废了
- 费用成本高,长期高频调用API,手续费还没赚回来先交模型费了
于是我转向了开源模型。先后测试了Qwen系列、Llama系列和TinyBERT类的轻量模型,最终主力用的是经过量化部署的开源模型,跑在一张消费级显卡上。选它的核心原因是:指令跟随能力不错、量化后体积可控、推理速度能接受。
4.2 微调数据的构造方法
模型微调不是直接用行情数据丢进去就行。我的做法是把行情特征转成文本描述,然后让模型输出指定的JSON结构。比如输入是:“过去30分钟价格上行,成交量较前时段放大15%,资金净流入为正向,波动率处于近期高位,请判断当前市场状态和风险评分。”对应的期望输出是:“状态: 趋势向上,风险评分: 45,置信度: 0.72,理由: 量价配合良好但波动率偏高需谨慎。”
为了让模型学会这种格式,我构造了大约10万条这样的样本。构造过程用了规则系统加人工校验:先用传统指标规则自动生成一批标签,再由人工抽检修正错误标注。
4.3 训练过程里最容易被忽略的细节
一个是学习率。用太大,模型直接灾难性遗忘,把通用的语言能力都忘了;用太小,又训练不到位。我最终用的是带warmup的余弦退火策略,峰值学习率设置在2e-5左右。
另一个是过拟合。因为金融市场数据的信噪比很低,模型非常容易把训练集里的噪音记住。我的做法是在训练时加入较大的Dropout比例,同时在验证集上严格监控,一旦验证loss连续多个epoch不降,就提前停止训练。即便如此,模型在模拟盘和实盘的表现还是会有一段衰减期,这不是训练能完全解决的,因为市场本身在变化。
4.3.1 关于“模型是否会过时”
金融市场的风格会在几个月内发生明显切换。我训练好的模型跑了一两个月后,准确率就有下降趋势。所以我还做了一个非常轻量的定期重训流程:每周从数据库里取最新数据,增量更新模型。这样能保证大模型对市场的新特征保持一定的敏感度。
5. 实盘部署与运维:从回测曲线稳定到真实账户稳定的鸿沟
如果你以为把模型训练好了就万事大吉,那接下来这一段能帮你省掉大量真金白银的学费。
5.1 回测到实盘,最大的三个差异
回测和实盘的差距,不是“有一点差别”,而是“本质不同”。我有三个印象最深的差异:
滑点与手续费。回测时你假设按收盘价成交,手续费固定万分之几。实盘中,大单进场会造成滑点,手续费最低5元起步,频繁交易后这部分开销非常可观。我的解决方案是在回测引擎里强制加入了保守的滑点模型和更高费率,让回测环境比实盘更苛刻。
数据延迟。回测里你觉得数据是即时的,但实盘中API推送延迟几十毫秒到几百毫秒都很正常。对于短线策略来说,几百毫秒可能就意味着入场价差了几个tick。我在程序里做了一层时间戳校验,凡是延迟超过阈值的行情快照直接丢弃,避免用过时数据做决策。
执行不确定性。回测里下单就成交,实盘里限价单可能半天不成交,市价单又可能成交在很差的价位。焊死系统的做法是采用“限价单+超时撤单重发”机制:先以盘口价加几个tick挂限价单,如果N秒内没成交就撤单,按时更新后的盘口重新挂。
5.2 24小时在线:进程守护与异常恢复
“24H在线实盘”听上去很酷,但里面全是运维的苦活。程序跑在服务器上,拜托,不是跑在你开发用的笔记本上,你得考虑进程崩溃、网络断线、内存泄漏、磁盘写满。
我的稳定运行方案分三层:
- 进程守护层:用systemd监听核心进程,如果进程异常退出,5秒内自动拉起
- 心跳监控层:每30秒向本地文件写一条心跳记录,外部监控脚本检测到心跳中断就报警(通过邮件和手机推送服务推给我)
- 数据持久化层:所有交易记录、模型输出、异常日志都实时写入数据库,即使程序崩溃重启后也能基于已落盘的数据恢复
除此之外,我还给系统加了一个“熔断开关”:如果连续多次连接到券商API失败,系统不会反复重试导致触发服务商的限流,而是直接暂停交易进入保护模式,等待人工介入。
5.3 交易时段与非交易时段的模式切换
很多人忽略了A股、美股、数字货币的交易时段差异。这套终端的核心市场设定在加密和海外市场,因为7x24小时不间断交易更适合自动量化,策略部署相对灵活。非交易时段和交易时段采用了不同的运行模式:
- 交易时段:全速运行,模型实时推理,策略引擎正常发单
- 非交易时段:模型停止推理,但数据采集和监控持续运行,为下一个交易时段做准备
这里有个比较巧妙的处理:在非交易时段做数据和模型的预热,尤其是计算好开盘时需要用到的所有特征缓存,保证开盘瞬间不会因为特征计算延迟而错过入场点。
6. 开源仓库怎么用:快速跑通回测,再决定要不要上实盘
终于到开源环节了。仓库地址在GitHub上,搜索项目名就能找到。代码组织分为几个子目录,包括数据处理、模型训练、回测引擎、实盘运行、监控面板几个独立模块,模块之间通过配置文件和消息队列对接,你完全可以只取其中一部分用在自己的项目里。
6.1 环境准备清单
先把环境说清楚。我的开发环境是Linux服务器,GPU为消费级显卡,显存要求不高,8GB以上就可以跑量化后的模型。软件依赖比较简单:
- Python 3.10以上
- PyTorch 2.x
- 自用轻量量化框架或直接用pandas+numpy
- 数据库建议SQLite起步,数据量大了之后可以换PostgreSQL
仓库里提供了requirements.txt和Dockerfile,如果你熟悉Docker可以直接用镜像跑,避免环境依赖问题。
6.2 十分钟快速回测流程
如果你是第一次用,我建议按这个顺序跑:
- 克隆仓库
- 下载示例历史数据,放回到data目录
- 运行特征生成脚本,把原始K线数据转成模型输入格式
- 运行回测脚本,看到资金曲线和交易明细
- 查看回测报告,关注最大回撤和盈亏比
这里重点强调:回测结果逼不逼真,取决于你设置的费率与滑点够不够保守。我仓库里默认给的是相对保守的参数:手续费双边千一加滑点每笔0.1%。如果你的策略在这种苛刻条件下还能跑出正收益,实盘至少不会因为交易成本莫名其妙地亏钱。
6.3 从回测到模拟盘,再到实盘的切换步骤
我强烈建议所有人按照“回测 → 模拟盘 → 小额实盘 → 正常实盘”这个顺序走。仓库里有一个运行模式配置项,三种模式共用一个策略内核,只是订单执行的目标不同。
- 回测模式:订单记录到本地数据库,不真实发出
- 模拟盘模式:连接到模拟交易API,按真实行情撮合,但资金是虚拟的
- 实盘模式:连接真实交易API,真金白银下单,建议先用最小资金跑通流程
我在模拟盘阶段跑了大概三周,确认系统的稳定性之后才切小额实盘。切实盘的第一周我还设置了“只开仓不平仓”的观察模式,确保所有执行细节没有问题之后,才放开全部交易权限。
6.4 你应该自己修改的三个地方
开源代码不是拿来就能躺赚的,我给你划三个必改点:
标的池的调整。代码默认的标的是流动性较好的主流币和指数,不同交易所的价格、深度差异很大,你需要根据自己的交易平台和资金量调整标的列表。
风控参数的调整。账户资金不一样,风控比例一定不一样。2%单笔止损对小账户来说可能没意义,因为最小下单量就占了很大比例。你需要根据自己的账户净值重新设定所有限额。
策略逻辑的调整。大模型只是提供状态判断,最终执行策略还是策略引擎决定的。如果你有自己的交易思路,可以修改策略引擎的信号合成逻辑,模型输出的JSON就是你对接的接口。
注意:金融交易天然存在不确定性与风险,任何开源代码都不能保证收益,请勿投入无法承受亏损的资金。本项目仅作为技术研究与学习用途,不构成任何投资建议。
7. 关于这套系统,我最想说的几件事
老实讲,写这套系统最难的环节不是模型训练,也不是策略设计,而是“承认不确定性存在”这件事。传统指标策略让人安心,是因为规则确定,你知道什么时候该买什么时候该卖;但大模型策略天然带概率性,同一套逻辑可能这次赚钱下次亏钱,这对心态的考验很大。
我个人的体会是:自动量化终端能不能长期稳定运行,数学模型占40%,剩下60%是风控纪律和运维意识。系统再聪明,如果你的风控形同虚设,或者服务器三天两头宕机,赚钱的期望再高也会被漏洞吞噬。开源这套代码不是想证明“AI能战胜市场”,而是想让更多人看到“把AI接进交易系统”的完整过程——包括那些不太光鲜的坑和教训。
如果你也准备做类似的系统,我有几个具体的建议:
- 先用最少的资金把流程跑通,哪怕是100美元或者你能承受的最小资金量,重要的是验证代码链路,而不是赚钱
- 回测参数宁可保守一些,不要为了曲线好看而调优越来越夸张的假设
- 任何时候都不要去掉风控层的硬性止损,它是你系统真正最后一道防线
- 保存所有交易记录和模型输出,出了问题才有迹可循
另外,这个项目我后续还在持续迭代。代码更新不是发一篇文章就结束了,接下来我会把更多的实盘统计数据和策略变更记录放在仓库的更新日志里,你有兴趣可以持续关注。如果在部署过程中遇到环境问题或者逻辑问题,可以在项目issues里提出来,我会尽量回复。