<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>生产系统与运维 on 云栖</title><link>http://airyv.com/quant/12-ops/</link><description>Recent content in 生产系统与运维 on 云栖</description><generator>Hugo -- gohugo.io</generator><language>zh-cn</language><atom:link href="http://airyv.com/quant/12-ops/index.xml" rel="self" type="application/rss+xml"/><item><title>量化系统架构：研究层、数据层与交易层</title><link>http://airyv.com/quant/quant-system-architecture/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>http://airyv.com/quant/quant-system-architecture/</guid><description>&lt;p&gt;策略代码只占量化系统的 20%——剩下 80% 是让研究可持续、交易可信赖的基础设施。本篇讲架构的两个根本决策：&lt;strong&gt;研究与生产怎么分离&lt;/strong&gt;、&lt;strong&gt;系统怎么分层&lt;/strong&gt;，以及单体/微服务的务实选型。&lt;/p&gt;
&lt;p&gt;&lt;img src="http://airyv.com/img/quant/quant-arch.svg" alt="量化系统三层架构图" title="数据层、研究层、交易层之间只以发布流程相通" loading="lazy" decoding="async"&gt;&lt;/p&gt;
&lt;h2 id="第一原则研究环境与生产环境的分离"&gt;第一原则：研究环境与生产环境的分离
&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;研究环境&lt;/strong&gt;：交互式（Notebook）、数据宽松（可以全量拉取）、允许试错、性能不重要。&lt;strong&gt;生产环境&lt;/strong&gt;：无人值守、数据严格（只走校验过的管道）、拒绝意外（任何变更走发布流程）、可靠性至上。&lt;/p&gt;
&lt;p&gt;两者隔离的原因不是洁癖，而是&lt;strong&gt;保护研究结论的可信度与生产系统的稳定性&lt;/strong&gt;：研究代码直接连生产数据库 → 一次探索性的重查询拖垮生产；生产逻辑随手改 → 回测环境与实盘环境漂移，「回测通过」失去意义。&lt;strong&gt;连接两个世界的唯一通道是「发布流程」&lt;/strong&gt;：研究代码 → 代码审查 + 回测复核 → 打版本 → 部署到生产（流程见&lt;a
 class="link"
 href="http://airyv.com/quant/strategy-deployment/"&gt;&lt;span class="markdown-link-inner"&gt;策略上线&lt;/span&gt;&lt;/a&gt;
）。&lt;/p&gt;
&lt;p&gt;环境一致性的三个保证：&lt;strong&gt;依赖锁定&lt;/strong&gt;（同一份 lock 文件，见&lt;a
 class="link"
 href="http://airyv.com/quant/code-quality/"&gt;&lt;span class="markdown-link-inner"&gt;代码质量&lt;/span&gt;&lt;/a&gt;
）、&lt;strong&gt;同一因子代码&lt;/strong&gt;（研究与回测共用实现，禁止「研究版重写一遍」）、&lt;strong&gt;数据快照版本&lt;/strong&gt;（回测引用的数据版本在生产可追溯，见&lt;a
 class="link"
 href="http://airyv.com/quant/factor-storage-quality/"&gt;&lt;span class="markdown-link-inner"&gt;因子存储&lt;/span&gt;&lt;/a&gt;
）。&lt;/p&gt;
&lt;h2 id="三层架构数据层研究层交易层"&gt;三层架构：数据层、研究层、交易层
&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;数据层&lt;/strong&gt;（完整设计见&lt;a
 class="link"
 href="http://airyv.com/quant/factor-storage-quality/"&gt;&lt;span class="markdown-link-inner"&gt;因子存储&lt;/span&gt;&lt;/a&gt;
与&lt;a
 class="link"
 href="http://airyv.com/quant/scheduling-databases/"&gt;&lt;span class="markdown-link-inner"&gt;调度&lt;/span&gt;&lt;/a&gt;
）：核心 SLA 是「17:00 前完成当日数据落地与质量校验」——它是全系统的时间锚点，迟到会连锁推迟信号、调仓与监控。数据层的事故是全系统事故之母：一条复权因子错误会让所有量价因子、所有策略同时出错，且难以追溯——所以数据层的质量检查投入产出比最高。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;研究层&lt;/strong&gt;：重点不是算力而是&lt;strong&gt;可复现性&lt;/strong&gt;——每个实验可追溯到代码版本 + 数据版本 + 参数；算力按需加（向量化因子计算用不了多少），管理不当的研究环境才是时间黑洞。研究层的常见病不是「算力不够」而是「实验不可考」：跑过 200 个实验却说不清哪个对应哪份代码哪份数据——实验登记表 + manifest 是解药。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;交易层&lt;/strong&gt;的关键设计：&lt;strong&gt;信号服务与执行服务的解耦&lt;/strong&gt;——信号服务输出「目标组合」（策略逻辑），执行服务负责「从当前持仓到目标组合」（下单、拆单、重试）。解耦的好处：换券商只改执行层；同一策略换执行算法不用动信号代码；风控检查插在两层之间天然清晰（限额校验作用于「订单流」而不是「目标权重」）。&lt;/p&gt;
&lt;h2 id="微服务-vs-单体诚实的选型"&gt;微服务 vs 单体：诚实的选型
&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;微服务的适用条件&lt;/strong&gt;：多团队并行开发（模块边界 = 团队边界才有效）、不同模块的伸缩/部署节奏差异大（信号服务日频部署、行情网关毫秒级稳定性）、故障隔离要求高（执行故障不能拖垮监控）。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;单体的适用条件&lt;/strong&gt;：1–3 人团队、策略数少、变更频率低——一个「模块化单体」（清晰的目录结构 + 接口分离 + 单进程内分模块）的运维成本是微服务的十分之一。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;最常见的错误&lt;/strong&gt;是反过来：个人研究者搭了一个五节点的「分布式量化平台」，然后花 80% 时间修基础设施、20% 时间研究——&lt;strong&gt;架构复杂度必须与研究规模匹配&lt;/strong&gt;（第 04 章因子库的同款元原则）。个人量化的推荐形态：一个进程内的模块化单体（数据/策略/执行/风控四模块）+ cron 调度 + 外部推送告警，见&lt;a
 class="link"
 href="http://airyv.com/quant/learning-paths/"&gt;&lt;span class="markdown-link-inner"&gt;学习路径&lt;/span&gt;&lt;/a&gt;
的工程极简版。&lt;/p&gt;
&lt;h2 id="演进路径什么时候升级架构"&gt;演进路径：什么时候升级架构
&lt;/h2&gt;&lt;p&gt;触发升级的信号（对应升级动作）：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;因子数 &amp;gt; 50 或计算时长影响决策 → 数据层独立 + 增量计算（见&lt;a
 class="link"
 href="http://airyv.com/quant/scheduling-databases/"&gt;&lt;span class="markdown-link-inner"&gt;调度与数据库&lt;/span&gt;&lt;/a&gt;
）；&lt;/li&gt;
&lt;li&gt;策略数 &amp;gt; 3 且共享标的池 → 信号/执行解耦 + 子账户记账（见&lt;a
 class="link"
 href="http://airyv.com/quant/multi-strategy-allocation/"&gt;&lt;span class="markdown-link-inner"&gt;多策略&lt;/span&gt;&lt;/a&gt;
）；&lt;/li&gt;
&lt;li&gt;出现第一次「生产事故找不到原因」 → 结构化日志与监控先行补课（见&lt;a
 class="link"
 href="http://airyv.com/quant/logging-monitoring/"&gt;&lt;span class="markdown-link-inner"&gt;日志与监控&lt;/span&gt;&lt;/a&gt;
）——&lt;strong&gt;监控比任何架构升级都优先&lt;/strong&gt;；&lt;/li&gt;
&lt;li&gt;团队 &amp;gt; 5 人 → 模块边界正式化（接口契约 + 独立部署），此时微服务才开始划算。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;反向的忠告同样重要：如果上面四条信号一个都没出现，你现在的「简陋」架构就是最优架构——&lt;strong&gt;为不存在的规模设计系统，是把研究时间兑换成工程快感的慢性手术&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;关联阅读&lt;/strong&gt;：各层的工程细节&lt;a
 class="link"
 href="http://airyv.com/quant/scheduling-databases/"&gt;&lt;span class="markdown-link-inner"&gt;调度与数据库&lt;/span&gt;&lt;/a&gt;
、&lt;a
 class="link"
 href="http://airyv.com/quant/quant-devops/"&gt;&lt;span class="markdown-link-inner"&gt;DevOps&lt;/span&gt;&lt;/a&gt;
；交易层的执行引擎&lt;a
 class="link"
 href="http://airyv.com/quant/execution-algorithms/"&gt;&lt;span class="markdown-link-inner"&gt;执行算法&lt;/span&gt;&lt;/a&gt;
；可靠性的底线&lt;a
 class="link"
 href="http://airyv.com/quant/dr-and-security/"&gt;&lt;span class="markdown-link-inner"&gt;灾备与安全&lt;/span&gt;&lt;/a&gt;
。&lt;/p&gt;</description></item><item><title>策略上线流程：审查、仿真、灰度与回滚</title><link>http://airyv.com/quant/strategy-deployment/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>http://airyv.com/quant/strategy-deployment/</guid><description>&lt;p&gt;「回测通过」与「可以上实盘」之间隔着四道关卡，每道都在过滤一类回测看不见的风险。跳关的个人量化者与跳关的机构一样多，后果也一样。&lt;/p&gt;
&lt;h2 id="关卡一代码审查与回测复核"&gt;关卡一：代码审查与回测复核
&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;审查的重点不是代码风格&lt;/strong&gt;（那是 CI 的事），而是&lt;strong&gt;策略逻辑的三类高危错误&lt;/strong&gt;：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;前视与时序错误&lt;/strong&gt;：信号时间协议逐行核（T 信号 → T+1 成交）；财报数据的公告日对齐（见&lt;a
 class="link"
 href="http://airyv.com/quant/data-cleaning/"&gt;&lt;span class="markdown-link-inner"&gt;数据清洗&lt;/span&gt;&lt;/a&gt;
）——研究代码里「顺手」写的对齐，上线后就是前视偏差的实弹；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;口径漂移&lt;/strong&gt;：研究时的因子实现 vs 上线时的实现必须&lt;strong&gt;同一份代码&lt;/strong&gt;（禁止重写，见&lt;a
 class="link"
 href="http://airyv.com/quant/quant-system-architecture/"&gt;&lt;span class="markdown-link-inner"&gt;架构&lt;/span&gt;&lt;/a&gt;
）；参数从研究配置到生产配置的搬运要有 diff 审查（参数抄错是最经典的上线事故）；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;边界与异常路径&lt;/strong&gt;：停牌/涨跌停/资金不足/数据缺失时策略的行为——研究回测里没触发的分支，实盘总会触发（Murphy 定律的量化版）。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;回测复核（独立复现）&lt;/strong&gt;：由另一个人/另一套代码（至少另一份配置）从原始数据重跑该策略——结果与研究报告的偏差 &amp;gt; 阈值（如年化 ±2%）即打回。&lt;strong&gt;它防的是「研究不可复现」与「报告选择性展示」&lt;/strong&gt;——这是机构投研流程里最值得个人借鉴的一道闸（个人版：一个月后自己换个环境盲重跑一次）。&lt;/p&gt;
&lt;h2 id="关卡二仿真盘paper-trading"&gt;关卡二：仿真盘（Paper Trading）
&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;定义&lt;/strong&gt;：用真实行情、真实信号逻辑生成交易，但不下单（或下单到模拟账户）——它是「策略在当下的真实世界里会怎么做」的实时预演。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;仿真要验证的三件事&lt;/strong&gt;：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;工程正确性&lt;/strong&gt;：数据管道、信号生成、目标组合的生成是否每日准点无误——回测里不存在的「运维正确性」只有仿真能测（见&lt;a
 class="link"
 href="http://airyv.com/quant/logging-monitoring/"&gt;&lt;span class="markdown-link-inner"&gt;日志与监控&lt;/span&gt;&lt;/a&gt;
）；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;信号的当下有效性&lt;/strong&gt;：策略逻辑在最近（未参与研究的）市场里是否仍然成立——防「回测过拟合 + 市场已变」的双重风险；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;预测的实现路径&lt;/strong&gt;：仿真记录「目标持仓 → 假设成交价」，与未来的真实执行对照，校准执行假设（见&lt;a
 class="link"
 href="http://airyv.com/quant/tca/"&gt;&lt;span class="markdown-link-inner"&gt;TCA&lt;/span&gt;&lt;/a&gt;
）。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;时长与通过标准要预注册&lt;/strong&gt;（防「跑两周感觉不错就上」）：常规建议 4–8 周（≥ 20 个调仓截面），通过标准含工程可用率（&amp;gt; 99%）与信号质量（滚动 IC 不低于历史 25 分位，见&lt;a
 class="link"
 href="http://airyv.com/quant/factor-library/"&gt;&lt;span class="markdown-link-inner"&gt;因子库&lt;/span&gt;&lt;/a&gt;
的监控口径）。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;仿真的固有局限要心里有数&lt;/strong&gt;：无真实冲击（你的仿真成交价不含自己的市场影响）、无成交失败（限价单仿真里常「理想成交」）、无资金交互（保证金、T+1 资金链）——这些缺口正是关卡三要补的。&lt;/p&gt;
&lt;h2 id="关卡三灰度与逐步放量"&gt;关卡三：灰度与逐步放量
&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;阶梯设计&lt;/strong&gt;（以目标资金为 100%）：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;10%（2–4 周）→ 30%（2–4 周）→ 60% → 100%
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;每级升级条件：该级绩效 vs 预期偏差 &amp;lt; 阈值 &amp;amp;&amp;amp; 执行指标（滑点、成交率）达标 &amp;amp;&amp;amp; 无风控违规
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;每级降级条件：偏差超阈值 → 停在该级排查；触发熔断 → 退回上一级（见[事中风控](/quant/real-time-risk/)）
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;&lt;strong&gt;灰度期重点观察的三组对照&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;实盘 vs 仿真&lt;/strong&gt;：缺口应主要来自执行成本（可解释）——缺口不可解释 = 有东西在仿真里是假的；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;实盘 vs 回测同期&lt;/strong&gt;：分年度式的小段对照，超额衰减在预期范围内（30%–50% 的衰减是常态，见&lt;a
 class="link"
 href="http://airyv.com/quant/backtest-biases/"&gt;&lt;span class="markdown-link-inner"&gt;回测偏差&lt;/span&gt;&lt;/a&gt;
）；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;执行指标趋势&lt;/strong&gt;：滑点随规模放大 vs 容量曲线的预测（见&lt;a
 class="link"
 href="http://airyv.com/quant/rebalancing-capacity/"&gt;&lt;span class="markdown-link-inner"&gt;再平衡与容量&lt;/span&gt;&lt;/a&gt;
）——放量到某级滑点突增 = 摸到容量边界。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;灰度的心理纪律&lt;/strong&gt;：每一级的停留时间按预注册的日历执行，&lt;strong&gt;不因「跑得好」提前升级&lt;/strong&gt;（好绩效可能是运气，灰度期本就不该按绩效决策）——这条被违反的概率超过 90%，违反的代价在下一轮回撤时结算。&lt;/p&gt;
&lt;h2 id="关卡四回滚预案"&gt;关卡四：回滚预案
&lt;/h2&gt;&lt;p&gt;上线那天就要能回答：「如果下个月要撤下这个策略，需要几步、多久、会遗留什么？」&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;版本回滚&lt;/strong&gt;：策略代码/参数/因子版本的三位一体快照（git tag + 配置快照 + 因子库版本号），回滚 = 恢复快照 + 重建持仓对齐（见&lt;a
 class="link"
 href="http://airyv.com/quant/git-collaboration/"&gt;&lt;span class="markdown-link-inner"&gt;Git&lt;/span&gt;&lt;/a&gt;
）；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;持仓清算预案&lt;/strong&gt;：下线时的清仓计划（分几天、按什么流动性约束、对市场的冲击预估）——大资金策略的「退出成本」必须在上线前算过（清仓冲击的估算同&lt;a
 class="link"
 href="http://airyv.com/quant/liquidity-and-icebergs/"&gt;&lt;span class="markdown-link-inner"&gt;流动性分析&lt;/span&gt;&lt;/a&gt;
）；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;依赖解耦&lt;/strong&gt;：策略下线不能拖垮共享基础设施（数据管道、监控、其他策略的因子库）——下线清单里逐项核对共享依赖。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;关联阅读&lt;/strong&gt;：上线的架构前提&lt;a
 class="link"
 href="http://airyv.com/quant/quant-system-architecture/"&gt;&lt;span class="markdown-link-inner"&gt;系统架构&lt;/span&gt;&lt;/a&gt;
；上线后的持续保障&lt;a
 class="link"
 href="http://airyv.com/quant/dr-and-security/"&gt;&lt;span class="markdown-link-inner"&gt;灾备与安全&lt;/span&gt;&lt;/a&gt;
；灰度期的实验方法论&lt;a
 class="link"
 href="http://airyv.com/quant/experiment-ab/"&gt;&lt;span class="markdown-link-inner"&gt;实验设计与 A/B&lt;/span&gt;&lt;/a&gt;
。&lt;/p&gt;</description></item><item><title>任务调度与时序数据库</title><link>http://airyv.com/quant/scheduling-databases/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>http://airyv.com/quant/scheduling-databases/</guid><description>&lt;p&gt;量化系统的每日运转是一条定时流水线：行情落地 → 校验 → 因子计算 → 信号 → 订单 → 归档。&lt;strong&gt;「几点跑什么」的可靠性直接等于策略的可靠性&lt;/strong&gt;——本篇讲流水线的组织方式（调度）与底下的存储选型（数据库）。&lt;/p&gt;
&lt;h2 id="调度从-cron-到-dag"&gt;调度：从 cron 到 DAG
&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;cron 的问题&lt;/strong&gt;：用「猜时间」表达依赖——「17:05 跑因子计算」隐含假设「数据 17:00 前一定就绪」，一旦数据迟到，因子计算用的是残缺数据（且无人知晓）。&lt;strong&gt;DAG 调度（Airflow/Prefect/Dagster）的正确姿势&lt;/strong&gt;：&lt;strong&gt;声明依赖而不是猜时间&lt;/strong&gt;——&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Airflow 风格的依赖声明（伪代码）&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;data_landing&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;data_quality_check&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;factor_compute&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;signal_gen&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;orders&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;每个任务的触发条件是「上游任务成功」，而不是「到了某个钟点」。数据的迟到不再是事故（流水线自动顺延），而是&lt;strong&gt;可告警的异常&lt;/strong&gt;（SLA 超时告警，见&lt;a
 class="link"
 href="http://airyv.com/quant/logging-monitoring/"&gt;&lt;span class="markdown-link-inner"&gt;日志与监控&lt;/span&gt;&lt;/a&gt;
）。&lt;/p&gt;
&lt;p&gt;DAG 的四个实务要点：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;每个任务幂等且可重跑&lt;/strong&gt;：任务失败重跑不能产生重复数据（写临时表 + 原子切换，见&lt;a
 class="link"
 href="http://airyv.com/quant/factor-storage-quality/"&gt;&lt;span class="markdown-link-inner"&gt;因子存储&lt;/span&gt;&lt;/a&gt;
）——幂等是「放心重跑」的前提，而重跑是流水线的日常；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;质量校验是 DAG 的显式节点&lt;/strong&gt;：校验失败 → 下游全部短路 + 告警——「宁可今天不交易，不可用坏数据交易」（检查项见&lt;a
 class="link"
 href="http://airyv.com/quant/data-cleaning/"&gt;&lt;span class="markdown-link-inner"&gt;数据清洗&lt;/span&gt;&lt;/a&gt;
）；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;回填（backfill）是一等公民&lt;/strong&gt;：数据源修复后「重算某区间的因子」是高频操作——DAG 支持按日期区间重跑（前提是任务幂等）；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;个人量化的最小版&lt;/strong&gt;：一个带依赖检查与失败告警的 Python 调度脚本（&lt;code&gt;检查上游文件时间戳 → 失败则通知并退出&lt;/code&gt;）就能覆盖 90% 需求——cron + 防御式脚本，晚于需要再上 Airflow。&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="存储选型按访问模式选库"&gt;存储选型：按访问模式选库
&lt;/h2&gt;&lt;p&gt;量化数据的核心访问模式是「按日期截面读全部股票」+「按股票读全部历史」，两类负载的最佳载体不同：&lt;/p&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;存储&lt;/th&gt;
 &lt;th&gt;适合&lt;/th&gt;
 &lt;th&gt;特点&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;Parquet 文件 + 本地盘&lt;/td&gt;
 &lt;td&gt;个人/小团队的一切&lt;/td&gt;
 &lt;td&gt;按日期分区的宽表，Pandas/Polars 直读，零运维；文件即快照，版本管理容易&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;ClickHouse / DuckDB&lt;/td&gt;
 &lt;td&gt;因子数多、需要切片查询&lt;/td&gt;
 &lt;td&gt;列存 OLAP，长表（date, code, factor, value）亿行级秒查；DuckDB 单机零运维，ClickHouse 需要服务化&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Arctic/ArcticDB（Mongo 系）&lt;/td&gt;
 &lt;td&gt;时序面板为主&lt;/td&gt;
 &lt;td&gt;tick/分钟级高频面板的专用形态，版本化内置&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;PostgreSQL / MySQL&lt;/td&gt;
 &lt;td&gt;元数据、订单、账户&lt;/td&gt;
 &lt;td&gt;事务型账本（订单流、持仓、审计记录）——&lt;strong&gt;交易账本不用 OLAP 库&lt;/strong&gt;，要事务保证&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Redis / 内存&lt;/td&gt;
 &lt;td&gt;盘中实时状态&lt;/td&gt;
 &lt;td&gt;行情缓存、实时信号状态、秒级刷新的监控指标&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;选型的两条经验：&lt;strong&gt;先文件后数据库&lt;/strong&gt;（Parquet 阶段撑到因子数过百、数据量过 TB 再上 OLAP——大多数个人研究者永远停在 Parquet 就够了）；&lt;strong&gt;账本与行情分离&lt;/strong&gt;（订单/持仓/资金是法律意义上的记录，进事务库并备份，与行情库的故障域隔离）。&lt;/p&gt;
&lt;h2 id="每日流水线参考蓝图"&gt;每日流水线参考蓝图
&lt;/h2&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;span class="lnt"&gt;6
&lt;/span&gt;&lt;span class="lnt"&gt;7
&lt;/span&gt;&lt;span class="lnt"&gt;8
&lt;/span&gt;&lt;span class="lnt"&gt;9
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;15:30 行情接收（收盘后）
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;15:45 数据落地（行情表 + 复权因子更新）
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;16:00 质量校验（新鲜度/缺失/极值，任一失败 → 短路+告警）
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;16:15 财报/公告事件增量（PIT 追加）
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;16:30 因子计算（增量）→ 因子库版本切换
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;16:50 信号生成（目标组合）
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;17:00 风控预检（限额校验）+ 订单生成
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;17:05 日报推送（净值/持仓/信号/异常）+ 心跳
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;（次日）开盘：订单执行 → 成交回报落账 → 当日 TCA
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;三个设计细节：&lt;strong&gt;所有节点写「运行指纹」&lt;/strong&gt;（输入数据版本 + 代码版本 + 输出版本，见&lt;a
 class="link"
 href="http://airyv.com/quant/git-collaboration/"&gt;&lt;span class="markdown-link-inner"&gt;Git&lt;/span&gt;&lt;/a&gt;
）——三个月后任何一天的信号可完整追溯；&lt;strong&gt;人工干预的入口预设计&lt;/strong&gt;（「今日跳过交易」「手动覆盖目标持仓」要有一键且留痕的通道——总有引擎判断不了的日子）；&lt;strong&gt;盘后流水线的总时长预算&lt;/strong&gt;（从收盘到日报 &amp;lt; 2 小时），超时即优化信号（流水线太长 = 数据迟到时的应对余量太小）。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;关联阅读&lt;/strong&gt;：流水线上游&lt;a
 class="link"
 href="http://airyv.com/quant/data-cleaning/"&gt;&lt;span class="markdown-link-inner"&gt;数据清洗&lt;/span&gt;&lt;/a&gt;
与&lt;a
 class="link"
 href="http://airyv.com/quant/factor-storage-quality/"&gt;&lt;span class="markdown-link-inner"&gt;因子存储&lt;/span&gt;&lt;/a&gt;
；下游&lt;a
 class="link"
 href="http://airyv.com/quant/strategy-deployment/"&gt;&lt;span class="markdown-link-inner"&gt;策略上线&lt;/span&gt;&lt;/a&gt;
；全链路的 CI 化&lt;a
 class="link"
 href="http://airyv.com/quant/quant-devops/"&gt;&lt;span class="markdown-link-inner"&gt;DevOps&lt;/span&gt;&lt;/a&gt;
。&lt;/p&gt;</description></item><item><title>低延迟基础（选读）</title><link>http://airyv.com/quant/low-latency-basics/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>http://airyv.com/quant/low-latency-basics/</guid><description>&lt;p&gt;延迟优化是量化里投入产出比最极端的领域：对某些策略，每快 1 微秒都是真金白银；对另一些策略，快 100 毫秒一文不值。本篇的价值不在「怎么优化」，而在&lt;strong&gt;帮你判断自己是否在需要优化的阵营里&lt;/strong&gt;——多数人不在，而知道这一点省钱省心。&lt;/p&gt;
&lt;h2 id="延迟的解剖一条链路的完整预算"&gt;延迟的解剖：一条链路的完整预算
&lt;/h2&gt;&lt;p&gt;一笔「行情进来 → 订单出去」的端到端延迟，逐段拆开（数字为国内期货/股票高频的典型量级）：&lt;/p&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;段&lt;/th&gt;
 &lt;th&gt;内容&lt;/th&gt;
 &lt;th&gt;典型延迟&lt;/th&gt;
 &lt;th&gt;优化手段&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;①&lt;/td&gt;
 &lt;td&gt;交易所撮合 → 你的网卡（物理）&lt;/td&gt;
 &lt;td&gt;机房内 1–5 μs / 城内专线 30–300 μs / 跨城 5–30 ms&lt;/td&gt;
 &lt;td&gt;托管（colocation）是唯一解&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;②&lt;/td&gt;
 &lt;td&gt;网卡 → 内核 → 应用（协议栈）&lt;/td&gt;
 &lt;td&gt;内核态 5–20 μs / 内核旁路 0.5–2 μs&lt;/td&gt;
 &lt;td&gt;OpenOnload/DPDK、SR-IOV&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;③&lt;/td&gt;
 &lt;td&gt;行情解析（二进制 → 结构化）&lt;/td&gt;
 &lt;td&gt;0.3–2 μs/条&lt;/td&gt;
 &lt;td&gt;零拷贝、预编译解析器、FPGA&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;④&lt;/td&gt;
 &lt;td&gt;策略计算&lt;/td&gt;
 &lt;td&gt;0.5–10 μs&lt;/td&gt;
 &lt;td&gt;无堆分配、无锁队列、缓存友好&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;⑤&lt;/td&gt;
 &lt;td&gt;风控检查&lt;/td&gt;
 &lt;td&gt;0.2–2 μs&lt;/td&gt;
 &lt;td&gt;热路径最小化（预计算限额位图）&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;⑥&lt;/td&gt;
 &lt;td&gt;订单构造 + 发出&lt;/td&gt;
 &lt;td&gt;0.3–1 μs&lt;/td&gt;
 &lt;td&gt;预序列化订单模板&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;⑦&lt;/td&gt;
 &lt;td&gt;你的网卡 → 交易所撮合&lt;/td&gt;
 &lt;td&gt;同 ①&lt;/td&gt;
 &lt;td&gt;同 ①&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;读懂这张表的两个推论&lt;/strong&gt;：其一，优化永远从「占比最大者」下手——没测过链路分布就优化代码，是延迟工程的第一浪费（典型错误：花两周把策略计算从 5μs 压到 3μs，而行情链路占了 300μs）；其二，①⑦ 的物理段占了大头，&lt;strong&gt;机房位置比代码快慢重要一个数量级&lt;/strong&gt;——这就是托管费贵过工程师工资的原因。&lt;/p&gt;
&lt;h2 id="微秒级竞争的门槛清单"&gt;微秒级竞争的门槛清单
&lt;/h2&gt;&lt;p&gt;低延迟高频（做市、抢单类）的完整门槛，按投入排序：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;托管（colocation）&lt;/strong&gt;：服务器放交易所机房内——入场券（几十万/年起），机房内物理距离都在微秒级；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;网络硬件&lt;/strong&gt;：交易所专线、内核旁路（Solarflare/OpenOnload 或 DPDK，绕过操作系统网络栈）、FPGA/ASIC 行情解析与订单编码（硬件线路完成处理，纳秒级）；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;软件栈&lt;/strong&gt;：C++（无 GC、无系统调用热路径）、无锁数据结构、CPU 亲和性（isolated core + 大页内存）、极简风控（风控逻辑在热路径上每加一层检查都是微秒）；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;持续军备&lt;/strong&gt;：对手在升级，你必须跟着升级——&lt;strong&gt;低延迟不是一次性投入而是持续折旧&lt;/strong&gt;。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;这个清单的用途是自检：如果任何一项对你不可及，「拼速度」的赛道直接排除——能做的是「速度不敏感的高频」（统计型日内回归、非抢单类空间策略），避开与顶级机构的军备竞赛。&lt;/p&gt;
&lt;h2 id="一个微秒的价值算例"&gt;一个「微秒的价值」算例
&lt;/h2&gt;&lt;p&gt;做市商的盈亏与排队位置的关系值得算一次：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;某期货品种：日成交 200 万手，做市商日均成交 2 万手（吃单方对手盘的 1%）
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;买单排队第 1 位 vs 第 3 位的差异：成交率差约 30%，且第 1 位能挑到「反向单」
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;（知情单更常打穿厚档）→ 每手期望差 ≈ 0.3 跳 × 跳值 1 元 = 0.3 元
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;年差值 = 2 万手/日 × 240 日 × 0.3 元 = 144 万元/年
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;为这 144 万买的设备 + 托管年成本 80–150 万 → 微秒的生意账成立
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;而同一个「5 微秒」卖给日频多因子策略：价值 = 0。&lt;strong&gt;延迟的价值 = 策略 alpha 的时效性 × 抢到与抢不到的概率差&lt;/strong&gt;——公式两侧都要算。&lt;/p&gt;
&lt;h2 id="什么策略值得为延迟付费"&gt;什么策略值得为延迟付费
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;做市&lt;/strong&gt;：排队位置直接决定成交率与被逆向选择的比例——延迟就是库存管理的武器，值得微秒级投入；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;跨市场套利&lt;/strong&gt;（期现、跨所）：价差存在的时间以毫秒计——谁先到谁吃肉，纯粹的延迟竞赛；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;统计型日内/短反转&lt;/strong&gt;：信号半衰期以分钟计——&lt;strong&gt;百毫秒级&lt;/strong&gt;的执行差异已足够，微秒无意义；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;日频多因子&lt;/strong&gt;：信号半衰期以天计——延迟优化价值趋近于零，把预算花在成本与容量上（见&lt;a
 class="link"
 href="http://airyv.com/quant/execution-algorithms/"&gt;&lt;span class="markdown-link-inner"&gt;执行算法&lt;/span&gt;&lt;/a&gt;
）。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;一个反直觉的提醒：&lt;strong&gt;中低频策略的「延迟」瓶颈常在分钟到小时级&lt;/strong&gt;——数据落地时间、信号计算时长、人工审批环节。把「决策到下单」从 40 分钟压到 5 分钟（自动化流水线，见&lt;a
 class="link"
 href="http://airyv.com/quant/scheduling-databases/"&gt;&lt;span class="markdown-link-inner"&gt;调度&lt;/span&gt;&lt;/a&gt;
）的收益，远大于任何微秒级工程——&lt;strong&gt;先优化自己的流程延迟，再考虑机器延迟&lt;/strong&gt;。&lt;/p&gt;
&lt;h2 id="个人可及的延迟卫生"&gt;个人可及的「延迟卫生」
&lt;/h2&gt;&lt;p&gt;不进军高频也有低分位的延迟改进空间（目标：把可控的秒级浪费清零）：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;时钟同步&lt;/strong&gt;：NTP 对齐本机时钟（日志时间戳可信的前提）——排查「信号与成交的时序」时这是地基；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;行情落地的及时性&lt;/strong&gt;：收盘数据的获取时间从「晚上十点」提到「收盘后十分钟」（数据源与定时任务优化）——它决定次日信号的生成窗口；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;下单路径的精简&lt;/strong&gt;：信号 → 订单之间去掉人工环节（邮件、Excel 中转）；API 直连券商优于网页端手工；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;监控延迟指标&lt;/strong&gt;：记录「行情时间戳 → 订单时间戳」的分布——先有度量，才知道哪里值得改（日志体系见&lt;a
 class="link"
 href="http://airyv.com/quant/logging-monitoring/"&gt;&lt;span class="markdown-link-inner"&gt;日志与监控&lt;/span&gt;&lt;/a&gt;
）。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;关联阅读&lt;/strong&gt;：速度竞赛的商业本质&lt;a
 class="link"
 href="http://airyv.com/quant/hft-and-market-making/"&gt;&lt;span class="markdown-link-inner"&gt;高频交易概论&lt;/span&gt;&lt;/a&gt;
；延迟敏感的策略类型&lt;a
 class="link"
 href="http://airyv.com/quant/strategy-frequencies/"&gt;&lt;span class="markdown-link-inner"&gt;策略频率分类&lt;/span&gt;&lt;/a&gt;
；工程栈的选择&lt;a
 class="link"
 href="http://airyv.com/quant/other-languages/"&gt;&lt;span class="markdown-link-inner"&gt;其他语言生态&lt;/span&gt;&lt;/a&gt;
。&lt;/p&gt;</description></item><item><title>灾备与安全：密钥、权限与审计</title><link>http://airyv.com/quant/dr-and-security/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>http://airyv.com/quant/dr-and-security/</guid><description>&lt;p&gt;量化系统的两类致命故障：&lt;strong&gt;技术性猝死&lt;/strong&gt;（进程崩溃、断网、机房故障——持仓无人管理）与&lt;strong&gt;安全性事故&lt;/strong&gt;（密钥泄露、误操作、账实不符——损失直接且难追回）。本篇按「故障模式 → 预案」的结构给出「不猝死」的工程清单。&lt;/p&gt;
&lt;h2 id="技术灾备故障模式清单"&gt;技术灾备：故障模式清单
&lt;/h2&gt;&lt;p&gt;逐项预案化（每项都要有「检测 → 自动/手动响应 → 恢复」三步）：&lt;/p&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;故障&lt;/th&gt;
 &lt;th&gt;检测&lt;/th&gt;
 &lt;th&gt;响应预案&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;策略进程崩溃&lt;/td&gt;
 &lt;td&gt;心跳超时（见&lt;a
 class="link"
 href="http://airyv.com/quant/logging-monitoring/"&gt;&lt;span class="markdown-link-inner"&gt;日志监控&lt;/span&gt;&lt;/a&gt;
）&lt;/td&gt;
 &lt;td&gt;自动重启 + 状态恢复（从账本重建持仓）；重启失败 → Kill Switch + 电话&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;行情断流&lt;/td&gt;
 &lt;td&gt;最后 tick 时间戳超时&lt;/td&gt;
 &lt;td&gt;切备用行情源（主备双源是底配）；全断 → 撤全部未成交委托 + 冻结新单（用旧价格下单是重大事故源）&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;券商通道故障&lt;/td&gt;
 &lt;td&gt;委托回报超时/废单率激增&lt;/td&gt;
 &lt;td&gt;切备用券商通道；同时段禁止「盲目重发订单」（重复下单比不下单更糟）——&lt;strong&gt;每笔订单带唯一 ID，重发前先查单&lt;/strong&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;服务器/机房故障&lt;/td&gt;
 &lt;td&gt;健康检查&lt;/td&gt;
 &lt;td&gt;云上双可用区部署；个人至少「本地 + 云端应急脚本」（云端能执行撤单与平仓清单）&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;数据错误（上游污染）&lt;/td&gt;
 &lt;td&gt;质量校验（见&lt;a
 class="link"
 href="http://airyv.com/quant/data-cleaning/"&gt;&lt;span class="markdown-link-inner"&gt;数据清洗&lt;/span&gt;&lt;/a&gt;
）&lt;/td&gt;
 &lt;td&gt;短路流水线 + 冻结交易——「宁可停一天」写进制度&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;每一条都对应真实事故的形态：行情断流时「用最后一条行情继续发单」的僵尸策略、通道故障后盲目重发导致的双倍持仓、上游数据污染引发的连环错误交易——每一种都比「不下单」贵得多。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;演练是灾备的灵魂&lt;/strong&gt;：每季度一次「故障演习」（拔网线、杀进程、停行情源，验证自动响应与人工流程）——没演练过的预案在真故障时的可用性接近于零（与 Kill Switch 的演练纪律同源，见&lt;a
 class="link"
 href="http://airyv.com/quant/real-time-risk/"&gt;&lt;span class="markdown-link-inner"&gt;事中风控&lt;/span&gt;&lt;/a&gt;
）。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;备份的最小集&lt;/strong&gt;：每日收盘后备份「账本 + 配置 + 因子库 + 代码仓库」四件套到独立介质——账本（订单、成交、持仓、资金）是法律与对账的根基，优先级最高（3-2-1 原则：三份副本、两种介质、一份异地）。&lt;/p&gt;
&lt;h2 id="交易安全四道门"&gt;交易安全：四道门
&lt;/h2&gt;&lt;h3 id="-密钥管理"&gt;① 密钥管理
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;密钥不入仓库&lt;/strong&gt;（API key、券商密码、数据商账号——&lt;code&gt;.gitignore&lt;/code&gt; 的第一行，见&lt;a
 class="link"
 href="http://airyv.com/quant/git-collaboration/"&gt;&lt;span class="markdown-link-inner"&gt;Git&lt;/span&gt;&lt;/a&gt;
）；环境变量或加密配置注入，不写在代码里；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;最小权限&lt;/strong&gt;：下单 API 密钥尽量申请「只交易不提现」权限（多数券商 API 天然无提现能力，这是结构性的安全垫）；交易密钥与查询密钥分开；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;定期轮换&lt;/strong&gt;：每季度轮换交易密钥；员工离职即作废全部权限（机构场景）；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;泄露即作废&lt;/strong&gt;：任何疑似泄露（误提交、日志打印、截图外发）——&lt;strong&gt;立即作废重置，不要抱侥幸&lt;/strong&gt;。判断标准不是「有没有人真的看到」，而是「有没有可能被看到」。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="-权限分离"&gt;② 权限分离
&lt;/h3&gt;&lt;p&gt;个人量化的最低形态也适用：&lt;strong&gt;「看」与「动」分离&lt;/strong&gt;——日常监控仪表盘只读；下单操作走独立通道（且加二次确认）；风控参数的修改与策略代码的部署用不同的 git 权限/审批。机构版再加：交易员与风控的物理权限分离（风控能 Kill 却不能下单，见&lt;a
 class="link"
 href="http://airyv.com/quant/roles/"&gt;&lt;span class="markdown-link-inner"&gt;角色分工&lt;/span&gt;&lt;/a&gt;
）。&lt;/p&gt;
&lt;h3 id="-审计日志"&gt;③ 审计日志
&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;每一笔交易决策都要能回答「谁、何时、依据什么信息、经过什么审批」&lt;/strong&gt;：订单全生命周期日志（信号版本、风控检查结果、人工干预记录）不可篡改地留存（append-only + 定期归档异地）。它的用途是三重的：监管合规（机构刚需，程序化报备时代尤其如此）、纠纷仲裁（「那天为什么买了它」）、事故复盘（见&lt;a
 class="link"
 href="http://airyv.com/quant/post-trade-review/"&gt;&lt;span class="markdown-link-inner"&gt;事后风控&lt;/span&gt;&lt;/a&gt;
）。个人版的最小实现：结构化日志 + 每日快照上传云端——「不留痕的操作不做」应该成为肌肉记忆。&lt;/p&gt;
&lt;h3 id="-对账reconciliation"&gt;④ 对账（Reconciliation）
&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;账实相符是安全体系的最终裁判&lt;/strong&gt;：每日收盘后三方对账——本地账本 vs 券商对账单 vs 交易所结算数据。任何差异（哪怕一分钱）当日排查。对账能抓住的安全问题：误下单、重复下单、未预期的持仓变动、甚至盗用——&lt;strong&gt;它是最朴素也是最可靠的最后防线&lt;/strong&gt;（对账流水线接入 DAG，见&lt;a
 class="link"
 href="http://airyv.com/quant/scheduling-databases/"&gt;&lt;span class="markdown-link-inner"&gt;调度&lt;/span&gt;&lt;/a&gt;
）。一个实操细节：对账脚本发现的差异要分档（金额差异 vs 数量差异 vs 持仓差异），持仓差异（券商有仓、本地无记录）优先级最高——那可能是账户被盗用的信号。&lt;/p&gt;
&lt;h2 id="个人的灾备底线一小时能建完"&gt;个人的灾备底线（一小时能建完）
&lt;/h2&gt;&lt;ol&gt;
&lt;li&gt;云端应急脚本：能查持仓、能撤全部委托、能按清单平仓（存在手机可达的地方）；&lt;/li&gt;
&lt;li&gt;券商手机 App 保持登录可用（终极后备通道）；&lt;/li&gt;
&lt;li&gt;每日自动备份账本与配置到云盘；&lt;/li&gt;
&lt;li&gt;一张纸写清「系统挂了的三步流程」贴在墙上（慌乱时的执行靠的是预写好的清单，不是聪明）。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;关联阅读&lt;/strong&gt;：故障的检测机制&lt;a
 class="link"
 href="http://airyv.com/quant/logging-monitoring/"&gt;&lt;span class="markdown-link-inner"&gt;日志与监控&lt;/span&gt;&lt;/a&gt;
；Kill Switch 的工程&lt;a
 class="link"
 href="http://airyv.com/quant/real-time-risk/"&gt;&lt;span class="markdown-link-inner"&gt;事中风控&lt;/span&gt;&lt;/a&gt;
；事故的复盘方法&lt;a
 class="link"
 href="http://airyv.com/quant/post-trade-review/"&gt;&lt;span class="markdown-link-inner"&gt;事后风控&lt;/span&gt;&lt;/a&gt;
。&lt;/p&gt;</description></item><item><title>DevOps 与 CI/CD</title><link>http://airyv.com/quant/quant-devops/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>http://airyv.com/quant/quant-devops/</guid><description>&lt;p&gt;软件工程的 CI/CD（持续集成/持续部署）在量化里有一个特殊的翻译：&lt;strong&gt;每一次代码变更，都要自动证明「回测结果没有意外变坏」&lt;/strong&gt;。本篇讲量化 CI 的特有检查项与部署自动化——它对个人研究者的价值不是「专业感」，而是&lt;strong&gt;把「我不记得上次改了什么」从根源上消灭&lt;/strong&gt;。&lt;/p&gt;
&lt;h2 id="量化-ci-的检查流水线"&gt;量化 CI 的检查流水线
&lt;/h2&gt;&lt;p&gt;每次 git push / PR 触发，依次通过四层：&lt;/p&gt;
&lt;h3 id="第一层代码质量快速反馈秒级"&gt;第一层：代码质量（快速反馈，秒级）
&lt;/h3&gt;&lt;p&gt;lint（ruff）+ 格式（black）+ 类型检查（mypy）+ 单元测试（pytest）——与一般软件工程相同（工具链见&lt;a
 class="link"
 href="http://airyv.com/quant/code-quality/"&gt;&lt;span class="markdown-link-inner"&gt;代码质量&lt;/span&gt;&lt;/a&gt;
），失败即终止，反馈周期要短（&amp;lt; 5 分钟）——&lt;strong&gt;反馈越慢，越有人绕过它&lt;/strong&gt;。&lt;/p&gt;
&lt;h3 id="第二层策略特有的静态检查量化独有"&gt;第二层：策略特有的静态检查（量化独有）
&lt;/h3&gt;&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;前视模式扫描&lt;/strong&gt;：规则化的代码检查——「信号计算函数内访问了当日/未来列」「merge 后未校验对齐」「shift 方向错误」的高危模式清单。规则只能抓常见形态，但抓到一个都是真事故。可执行的起步版：一个 ruff 自定义规则 + 一份「禁用 API 清单」（如禁止在信号函数内调用 &lt;code&gt;shift(-n)&lt;/code&gt;）；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;魔法数字与口径审计&lt;/strong&gt;：成本费率、涨跌停幅度等制度参数是否引用统一配置（而非散落硬编码，见&lt;a
 class="link"
 href="http://airyv.com/quant/ashare-execution/"&gt;&lt;span class="markdown-link-inner"&gt;A 股执行&lt;/span&gt;&lt;/a&gt;
的参数卡）——「印花税从 0.1% 降到 0.05%」的政策变更（2023 年 8 月真实发生），散落硬编码的仓库要改十处、漏三处；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;依赖注入检查&lt;/strong&gt;：因子/策略函数的输入是否全部显式传参（禁止隐式读全局数据——它是「研究环境对、生产环境错」的常见根源）。&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="第三层回测回归测试核心闸门分钟级"&gt;第三层：回测回归测试（核心闸门，分钟级）
&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;固定基准数据集 + 固定策略集&lt;/strong&gt;：对一组「守门策略」（1–2 个简单已验证策略）在基准数据上跑回测，与&lt;strong&gt;上次通过版本的净值曲线 diff&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;diff 为零或极小（&amp;lt; 数值噪声）→ 通过；&lt;/li&gt;
&lt;li&gt;有变化 → 必须能解释：本次变更预期影响什么？变化的方向与幅度是否匹配？&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;这条闸门的杀手级用途&lt;/strong&gt;：它把「我只是改了一行工具代码，不影响策略」变成自动证伪——无数「顺手的小改动」造成的静默策略变化，都在这里现形。一个典型场景：重构数据加载模块时顺手改了默认复权方式，三个策略的净值曲线同时漂移 2%——没有回归测试，这要在实盘偏差出现后才被发现（那时已经亏了）。守门策略的选择要点：覆盖主要代码路径（至少一条含财务因子、一条纯量价）、绩效指标稳定（本身不是高方差的策略）。&lt;/p&gt;
&lt;h3 id="第四层性能与数据契约"&gt;第四层：性能与数据契约
&lt;/h3&gt;&lt;p&gt;因子计算的运行时长上限（超时报警——计算退化常暗示数据结构变化）；输出数据的 schema 校验（列名/类型/日期连续性）——&lt;strong&gt;数据契约是研究层与生产层之间的合同&lt;/strong&gt;（见&lt;a
 class="link"
 href="http://airyv.com/quant/quant-system-architecture/"&gt;&lt;span class="markdown-link-inner"&gt;架构&lt;/span&gt;&lt;/a&gt;
的环境一致性）。&lt;/p&gt;
&lt;h2 id="部署自动化"&gt;部署自动化
&lt;/h2&gt;&lt;p&gt;CI 全绿之后的 CD（持续部署）按风险分级：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;数据管道与因子计算&lt;/strong&gt;：自动部署（夜车流水线，见&lt;a
 class="link"
 href="http://airyv.com/quant/scheduling-databases/"&gt;&lt;span class="markdown-link-inner"&gt;调度&lt;/span&gt;&lt;/a&gt;
）——前提是第二、三、四层全绿；部署后自动跑一次「冒烟回测」（最近 20 日）验证；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;信号/策略代码&lt;/strong&gt;：半自动——CI 绿 + 人工点批准（审批记录留痕，见&lt;a
 class="link"
 href="http://airyv.com/quant/dr-and-security/"&gt;&lt;span class="markdown-link-inner"&gt;安全&lt;/span&gt;&lt;/a&gt;
）；部署后先影子模式运行一个交易日（与旧版本并行对比信号 diff）再正式接管；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;风控参数与限额&lt;/strong&gt;：最高审查级别——双人审批 + 变更窗口（不在盘中改限额）；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;回滚&lt;/strong&gt;：每次部署保留「一键回滚到上一版本」（镜像/快照化），回滚也是部署、也要走审计（与&lt;a
 class="link"
 href="http://airyv.com/quant/strategy-deployment/"&gt;&lt;span class="markdown-link-inner"&gt;回滚预案&lt;/span&gt;&lt;/a&gt;
衔接）。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;部署频率的真相&lt;/strong&gt;：量化系统的正确节奏是「低频而严格」——策略代码的变更以周/月计（每笔变更都过全闸门），数据与监控的变更可以日频。&lt;strong&gt;「持续部署」在量化里的正确读法是「持续验证、谨慎部署」&lt;/strong&gt;。&lt;/p&gt;
&lt;h2 id="一个人的-cigithub-actions-最小配置"&gt;一个人的 CI：GitHub Actions 最小配置
&lt;/h2&gt;&lt;p&gt;个人研究者半天可建的最小 CI（GitHub Actions / Gitea Actions / 本地 pre-commit + 定时跑）：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;span class="lnt"&gt;6
&lt;/span&gt;&lt;span class="lnt"&gt;7
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;# .github/workflows/quant-ci.yml 核心步骤示意&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;on&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="l"&gt;pull_request]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;jobs&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;lint&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c"&gt;# ruff + mypy （1 分钟）&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;unit&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c"&gt;# pytest 单元测试 （2 分钟）&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;regression&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c"&gt;# 守门策略回测回归 （10 分钟，结果与基准 diff）&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;smoke&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c"&gt;# 最近 20 日因子冒烟 （5 分钟）&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;&lt;strong&gt;投入产出的账&lt;/strong&gt;：搭建 1 天 + 每次变更多等 15 分钟 ↔ 换来「任何历史版本可复现、任何静默破坏被拦截」——对以年为单位的策略资金，这是整个工程体系里性价比最高的单项投资。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;关联阅读&lt;/strong&gt;：闸门背后的检查依据&lt;a
 class="link"
 href="http://airyv.com/quant/backtest-biases/"&gt;&lt;span class="markdown-link-inner"&gt;回测偏差&lt;/span&gt;&lt;/a&gt;
与&lt;a
 class="link"
 href="http://airyv.com/quant/code-quality/"&gt;&lt;span class="markdown-link-inner"&gt;代码质量&lt;/span&gt;&lt;/a&gt;
；部署的完整流程&lt;a
 class="link"
 href="http://airyv.com/quant/strategy-deployment/"&gt;&lt;span class="markdown-link-inner"&gt;策略上线&lt;/span&gt;&lt;/a&gt;
；变更的版本管理&lt;a
 class="link"
 href="http://airyv.com/quant/git-collaboration/"&gt;&lt;span class="markdown-link-inner"&gt;Git&lt;/span&gt;&lt;/a&gt;
。&lt;/p&gt;</description></item></channel></rss>