返回上一页

量化指挥中心

一套部署在本地的多市场量化面板。行情采集、指标计算、状态判定和纪律提醒,全部在自己的电脑上完成,不依赖任何在线服务。

量化指挥中心启动面板,显示六块独立面板的运行入口
启动面板:整套系统的总开关。状态灯亮绿,面板才算活着。

为什么想到开发这个本地工具

进入金融市场之后,我很快发现自己的信息是散装的:行情在券商 App 里,指标在行情网站上,持仓记录在我自己的表格里。想确认一件事,要在四五个地方之间来回横跳,跳完往往忘了最初想确认什么。

更有意思的是,这些 App 有一个共同点:个个都热情洋溢地展现着眼花缭乱的数据,却没有一个主动告诉我,数据背后隐藏的趋势。现在市场的行情是单边还是震荡?个股的剧烈拉升是诱多还是升浪?回调了30%到底够便宜了吗?如果我现在启动,止盈与止损的界限在哪?

一开始的野心其实不小——我想用过往数据与优秀的策略,找出必胜的法则。于是开始了不断地制定策略,回溯过往数据,否决;调整策略,继续尝试回溯的循环。

调整回溯了不知道多少轮之后,我绝望地发现,这个世界上不存在绝对必胜的金融法则(想想也是)。因此我改变了方向,把这套工具的定位从「直接告诉我买什么能一定大赚特赚」改成「它是座舱,不是阿尔法引擎。它不负责替我躺着赚钱,只负责让我看清楚自己在干什么,愤怒时让我冷静;恐惧时让我贪婪;贪婪时让我清醒,这个状态下应该要去做什么,而不是把缰绳交给情绪,一错再错」——事实证明,后者难得多,也有用得多。

开发过程中的曲折

  1. 第一个策略,死于我自己定的规则。

    为了防止“调参数直到回测好看”这种自欺,我给策略验证定了预注册制度:开跑之前先把验收标准白纸黑字写死——最大回撤、年化收益、必须跑赢随机入场的对照组——中途不许改。

    第一套均线择时策略雄赳赳地进去,三项全部不达标出来;复盘发现 2020 年那场著名的暴跌恰好落在它的退出缓冲区里,它在下跌全程保持满仓,纹丝不动。

    按照事先定好的规则,我把它毙了。

  2. 然后是 macOS 三连击。

    系统坚持用 x86 模式启动 Python,而我的数学库只认 arm;把项目放在桌面,系统权限直接给你锁门;某次升级之后,某个数据库依赖的 JavaScript 引擎学会了一门新技能——把整个进程无声带走,连句报错都不留,面板就像被外星人接走了一样凭空消失。

  3. 时区,程序员的永恒之敌。

    日股面板一度用美东时间判断东京的交易日。后果是:东京的凌晨,程序坚信“今天还没收盘”,于是死活不去抓昨天的收盘价。

    一个面板管三个市场、横跨三个时区之后我才真正理解,“今天”是个需要定义的词。

  4. 程序不懂休假。

    面板起初不认识节假日,只知道周一到周五该上班。

    于是中国端午节与美国独立日后,它看着一切正常的数据,坚定地打上了“数据陈旧”的红色标签——像一个不知道今天放假、到了公司发现一个人没来,气急败坏地向领导打小报告的滑稽员工。

    后来它接入了真实的交易日历。

  5. 以及那颗被点击了 1747 次的刷新按钮。

    有段时间 A 股面板的“立即刷新”点了没反应:按钮闪一下“抓取中”,随即若无其事地弹回原样。

    翻日志才发现真相残忍——那颗按钮累计被点了 1747 次,全部落空。

    根因是一个全市场行情快照接口在每轮抓取里被重复调用了十几次,一次完整刷新要跑八分钟,锁一直被占着;而前端收到“正在忙”的回复后,选择默默咽下,一个字不提。

    修完之后,一轮抓取从 477 秒降到 42 秒,按钮也终于学会了汇报进度。

这些坑各不相同,但指向同一条教训:

工具出错不可怕,可怕的是它出了错还装作没事。

后来整套系统的改造,基本都围绕这一条展开。

整体构造

系统由一个启动器和六块独立面板组成,各面板互不依赖,从启动器统一启停。

板块构成

六块面板分别承担不同市场与不同决策层级的观察任务。

  1. 日美股面板

    长期持有方向。跟踪权重偏离与减仓提示,不产生买卖时机信号。

  2. A股面板 2.0

    从波段试错仓,到与美股、日股同等对待的主战场。大盘水位、板块轮动、财经日历、吊灯止损纪律、同业横截面,再加一层要被记分的 AI 解读——判断仍然只属于人,面板负责把事实一次摆齐。

    A股面板 1.0(已迭代)
  3. 外汇面板

    以单一货币对为交易轴心,其余品种仅监控。

  4. 差价合约面板

    覆盖指数、黄金、原油与加密资产的决策支持,成本模型采用券商实际公布的点差。

  5. 宏观热力面板

    汇总宏观指标,给出整体环境的冷热读数。

  6. 牛熊状态面板

    用事先冻结的固定权重(市场结构 / 宏观 / 叙事)合成市场状态判定,权重不随行情调整。

数据采集

  • 各市场使用免费与延迟数据源,不接付费实时行情——这是自用工具,延迟报价足够。
  • 每个市场配置多个数据源做链式兜底:首选源失败自动切换备选,并记录实际使用了哪一个;某一源连续失败时本轮直接短路跳过,不做无谓等待。
  • 交易日判定按各市场本地时区独立进行,并接入真实交易日历,正确处理节假日与调休。
  • 抓取分两种:各市场收盘后的定时抓取,与随时可发起的手动强制刷新。抓取在后台线程执行,界面实时显示进度,数据逐支落库、分批提交——中途断电也不会丢掉已完成的部分。
  • 数据落在本地 SQLite,低频名录类数据持久化缓存,接口不稳时回退旧副本并明确标注副本日期。

每一项数据都带新鲜度状态:

  • 盘中延迟
  • 已收盘
  • 数据陈旧 · 抓取失败

抓取失败一律明示。

系统中不存在“静默拿旧数据顶上”的路径。

本地的量化逻辑

这套系统不做预测。

所有计算都服务于两件事:描述现状,和执行事先定好的规则。

  1. 长持逻辑(日美股)

    等权配置,定期定额建仓;权重偏离超过阈值时只做减仓修正(TRIM),不做完整再平衡。

  2. A股逻辑

    入场看动量——二十日新高配合放量,或多头排列配合 MACD 确认;离场只认吊灯移动止损(阶段高点回撤 3×ATR,外加硬底),不设固定止盈,让止损线自己追——这是全系统唯一的机械纪律。其余一切,大盘水位、板块轮动、同业横截面、财经日历,只描述现状,不给判断;AI 解读可以有观点,但每条观点都要在 T+5/T+20 被实际涨跌记分。

  3. 外汇逻辑(USD/JPY)

    港币钉住美元,三个货币对实际只有一个独立方向,所以只保留 USD/JPY 作为唯一交易轴,港币降级为只监测。仓位由风险占比与止损距离反推手数,而不是由保证金能开多少决定;同时逐日累计 carry,并把距离强平还有多远显式摆出来。

  4. 差价合约逻辑(成本优先)

    先算成本,再谈信号。每个标的都按券商公布的实际点差建模,输出往返成本、盈亏平衡幅度与盈亏平衡胜率;当可达幅度覆盖不了成本时,直接标记为不可交易。行情源只负责告诉我价格在哪,成本永远按券商那本盘口算。

  5. 状态判定(两块雷达)

    一块汇总宏观指标,给出环境的冷热读数;一块用市场结构、宏观与叙事三类指标按固定权重合成牛熊状态。权重在启用前冻结,此后只输出读数,不做事后调整。

  6. 策略准入制度

    任何新策略上线前必须走预注册回测——先写死验收标准再跑数据,通过才能进面板,不通过就连同过程一起归档。

    目前的归档数量大于通过数量,我认为这恰恰说明制度在起作用。

可视化

  • 全部面板基于 Flask 构建为本地网页,浏览器即用户界面;启动器为原生窗口,带各面板的运行状态灯与一键启停。
  • 界面元素围绕“快速读取状态”设计:动量信号徽章、情绪温度计、纪律提醒横幅、数据新鲜度标签,均可一眼扫过。
  • 视图定时轻刷新与数据抓取彻底分离:前者只重绘界面,后者才碰网络,互不干扰。
  • 手动刷新时按钮实时显示抓取进度(如“12/27”),完成后自动重绘并汇报结果;任何失败都会在页面上明确说明原因,绝不静默复位。