覆盖率、基于属性的测试与 Mock
周五下班前你在私募的 CI 仪表盘上看到一片绿: xyzprice 的 86 个测试全过,行覆盖率显示 95%。周一开盘九点二十,研究系统在喂一段空盘后行情时崩在了 mean price([]) 上——你写过的测试里,从来没有一个把空列表喂进去。覆盖率告诉你「这一行跑过」,但不会告诉你「这一行只在 happy path 上跑过」。上一课的 pytest 让你...
打开 →GLOBAL SEARCH
搜索在服务端完成,题目解析与答案不会进入搜索结果。登录后可搜索自己的收藏题单。
找到 30 个结果
中文题目周五下班前你在私募的 CI 仪表盘上看到一片绿: xyzprice 的 86 个测试全过,行覆盖率显示 95%。周一开盘九点二十,研究系统在喂一段空盘后行情时崩在了 mean price([]) 上——你写过的测试里,从来没有一个把空列表喂进去。覆盖率告诉你「这一行跑过」,但不会告诉你「这一行只在 happy path 上跑过」。上一课的 pytest 让你...
打开 →某沪深300指增私募的策略部署组组长周一早会带着三份交付物走进风控委员会。PM 刚审批通过一只新主动股票策略,研究组把 4.2 alpha 管线(截面动量 + 质量 + 价值的复合 alpha,样本内 IR 约 0.5)、4.3 因子暴露矩阵 B (Barra 风格 5 个 + 中信一级行业 10 个 + 国家因子)、4.4.2 Barra 风险模型 (Si...
打开 →python · packaging · pyproject · venv · uv · pip · dependencies · testing
打开 →portfolio-optimization · constrained-mv · quadratic-programming · qp · cvxpy · osqp · long-only · leverage-cap
打开 →国内某头部私募(类似鸣熙资产)C++ 团队的第二个 sprint,组长把一个迷你定价库交给你独立负责。上一任留给你一份 600 行的 main.cpp ,能编、能跑、打印三个数,零测试。下个 sprint 的任务清单里包括加上一个 put call parity 的健全性检查、把库挂到一个策略二进制里、并通过一次把「单文件 C++ 工程」列为 P2 反模式的...
打开 →周三晚上 11 点,你在某 私募 量化组里维护着一个内部小包 xyzprice :封装 涨跌停 价计算、复权因子拼接、T+1 持仓核算这三件每周都要做的事。组里另外两位 PM 想直接 pip install xyzprice 就能用,而不是每次复制粘贴你脚本里那几个函数。 pyproject.toml 已经写好,pytest 测试全绿——下一步只剩四件事:构...
打开 →周三下午两点。一家 A 股 私募 的资深同事打开你的 MR,标题是 feat(risk): 添加 沪深300 因子 z 列至业绩归因 。改了 12 个文件。二十秒之内审查线上铺满了「文件末尾多一个空行」「这个 import 没用到」「第 47 行行尾有空白」「import 没排序」之类的评论。你能感到审查时间正在漏走——这些评论没一条是关于你因子逻辑对不对的...
打开 →某 H 股 + A 股双地区运营私募的首席风险官:周五下午三件事压在桌上。(1) 风控部要把当前持仓在「2015 年 A 股股灾再来一次」情景下重定价——CEO 周一下午开战略会要听数;(2) 监管要求按 2023 年新修《商业银行资本管理办法》算 FRTB 市场风险资本(基金有港股账户接入银行同业柜台,部分敞口需要并表);(3) 投委会要一张「一页式风险报...
打开 →国内某私募中频组新加入的应届工程师周一第一天克隆了项目仓库。仓库的 Cargo.toml 声明一个 library crate 加一个 binary crate; src/lib.rs 暴露一个 pricing 模块; src/pricing.rs 装着 Lesson 2 写过的 510300.SH 沪深300 ETF 期权闭式 Black Scholes ...
打开 →周三晚上九点,你在一家上海私募的策略组里,把白天调好的 A 股因子算子打包发给同事,让他在另一台机器上跑同样的回测。他 git clone 完,进到目录里直接 python main.py ,立刻就崩了: ModuleNotFoundError: No module named 'xyzprice' 。你叫他先 cd src && python main.p...
打开 →周一开盘前一刻钟,你在私募的研究服务器上 merge 了一段对 mean price 的「无害重构」——只是把 sum(...) / len(...) 拆成两步,方便在中间加日志。脚本照常跑完,回测照常出图。下午两点你才发现 PnL 报表上 XYZ001.SH 的当日均价对不上:你在重构时把 sum 与 len 的参数搞反了,函数对所有非空输入都返回 1 。...
打开 →某沪深300指增私募的中级量化研究员把 L2 的成本感知优化器跑了三年。样本内纸面 Sharpe = 1.4,实盘 Sharpe = 0.7。她把回测净值拆开,发现两件事:12 1 截面动量 mu hat 的标准误差是均值的 3 5 倍——Chopra Ziemba(1993)《The effect of errors in means, variances...
打开 →语言基础 · 数据结构 · 错误处理 · 测试
打开 →某沪深300指增私募的中级量化研究员,用 L1 的「无成本」约束 MV 优化器跑 30 只 CSI 300 行业龙头基础上的 12 1 截面动量信号,样本内纸面 Sharpe(paper Sharpe)= 1.4。她把同样的换仓单丢进自家交易台的事后成本归因系统,扣掉佣金、印花税、半价差(half spread)和 Almgren Chriss 市场冲击之后...
打开 →某沪深300指增公募的高级量化研究员,把 4.4.1 的均值方差闭式解 w = (1/gamma) Sigma^ (mu lambda 1) 直接套到她管理的 30 只 CSI 300 成分股核心仓上。闭式解给出的结果:招商银行 600036 做空 300%、宁德时代 300750 多头 +250%、组合 78% 的仓位扎堆在前三只动量名上。她的产品合同写得...
打开 →周五下午——日内流改完后第三周。风险口要你每天产出的同一个 P&L 数字,但要求改成「他们的收盘脚本能 import 进去用的函数」。所以那个一直被你贴到每个文件里的 pnl(p0, p1, ...) 得从「笔记本里的片段」升级成「另一个组按名导入的模块」。雪上加霜的是上午一条沪深300 ETF 的 tick 飞来一个 price = 0 ,你的除法直接抛 ...
打开 →在台子上坐了三周,你接手的策略组发现一个尴尬场面:那段计算 stylized P&L 的代码 (p1 p0) shares fee 被复制粘贴到了七个文件里。今天 A 股印花税口径调整(卖出方向 0.03% 的一个示例性常数,真实税率以监管口径为准),你要在收盘前把这条修改打到七个地方。你改了六个,漏了第七个,周一对账时某条策略的 P&L 偏了三块钱。修法不...
打开 →旁边那台的同事盯沪深300 ETF 的日内 tick 流。早上 10 点,她已经积了 8 万条 tick 行的 CSV;她的开盘脚本只是一段 Python:把每行读进来,过滤掉 volume 100] [364100.0, 4860.0, 546090.0, 3654.0] 二十行删到四行,懂语法的同事五秒就能审完——这是要追的标准。 练习 Given pr...
打开 →早上 7:42,做市台。研究员在群里丢了一句:「把跳空分类脚本重跑一下,阈值改成 5%。」打开她的笔记本,屏幕上是十几行 Python——没有 import、没有类,只有一段 if/elif/else 在判断 stdin 读进来的收益率。新人立刻问了一句:「Python 凭什么知道 if 到哪一行结束?」这门课就从这里讲起。学完之后你能默写出同样的脚本:st...
打开 →周二上午,你坐在 CFFEX 张江 COLO 机房旁边的运维台前。你是一家头部私募 Rust 团队的开发,负责沪深300 ETF (510300.SH) 的做市策略,代码已经过编译、单元测试通过、回测看起来正常,但 profiler 显示热点循环把 70% 的周期花在了两个 AtomicU64::fetch add 调用上 —— 这两个调用按理每次只应消耗一...
打开 →某沪上 私募 量化 团队 第三周,基金经理把一份 Jupyter notebook 递给你,结果是:2010 2020 沪深300 + 中证500 全市场上 Sharpe = 2.4 ,问你为何 2022 以来实盘版本只跑出 Sharpe = 0.5 。你审数据,发现三个 bug:历史 成分股 表是按 今天的 沪深300 拉出来的(测试样本里每只标的都是...
打开 →上海一家 私募 的 quant 把 L2 产出的 feed handler:1.0.0 镜像推到 内部 registry,问 平台 组 怎么 把 它 部署 到 测试 集群。负责 工程师 直接 反 问:「你 的 docker compose.yml 本地 长 什么 样?你 的 manifests/ 在 测试 集群 长 什么 样?」quant 两份 都 没有,手...
打开 →某国内头部私募(类似幻方量化)的初级 quant 第一次用 C++ 写了一个五日滚动 VWAP 函数。它加载 510300.SH 收盘价、用 new double[5] 申一段 buffer、算滚动均值、返回结果。单元测试过。集成测试过。两周后,同一个函数被一段每秒跑一万次的热路径调用,交易进程在一天之内常驻内存悄悄涨到 80 GB,直到内核 OOM kil...
打开 →某私募的合规体检流程里有一项强制 HIV 筛查:某种检测试剂的灵敏度(sensitivity)99%、特异度(specificity)95%。一个员工拿到阳性报告,推门进来问"我得病的概率是不是 99%?"——医生告诉他大约 17%。表面上反直觉的差距,根源在于他混淆了两个量:公式 与 公式。这一节把条件概率与贝叶斯公式这两件"信息更新"的核心工具讲清楚,顺...
打开 →熔断开关、盘前风控与盘后控制 2012 年 8 月 1 日,周三,纽约时间 09:30:00。Knight Capital Group —— 美国头部做市商之一,承担约 10% 的零售股票订单流 —— 开盘。两周前一次代码部署中的路由标志位错配,激活了八台生产服务器中的一台上的休眠测试代码。这段休眠代码把每一笔进来的父订单都解读为在 上证 等价的小盘价格改进...
打开 →你在一家国内头部私募 quant 桌上,周末把一段单线程的沪深300成分股信号聚合器用 C++17 重写。重写"显然更快"——更少的分配、更紧的循环、通篇现代 C++17。周一集成测试都过,墙钟时间却慢了百分之四十。PM 问你为什么。你盯着 diff 看不出名堂,因为你写代码时感到的"更快",住在 C++ 标准之下的一层里:住在缓存层级里、住在一次栈指针挪动...
打开 →2012 年 8 月 1 日,纽约时间上午 9:30:00,纽约证券交易所开盘钟响。骑士资本是当时美国最大的零售订单批发商,承接约 10% 的美国零售股票订单流量。前一晚,骑士资本把一次软件更新推送到了 SMARS(智能市场准入路由系统)的 8 台服务器上。其中 1 台保留了一段 2003 年的「Power Peg」测试算法,原本是为测试订单路由而写的——发...
打开 →国内某 SSE 接入团队接到任务: 把老 C++ + Boost.Asio 写的行情接入网关重构成 Rust, 单台机器要同时维持 8000 条 TCP 长连接, 把 510300.SH (沪深300 ETF) 等几百只标的的 tick 流落到内部撮合面板。架构师扫一眼说: 上 tokio——别想着每条连接派一个 OS 线程, 8000 个 OS 线程在调度...
打开 →中信建投自营 IT 团队的同事把一份 C 的期权定价库 libquant pricer.so 扔到你桌上。"我们这套是十几年前用 C 写的,封装了 Abramowitz Stegun 7.1.26 标准正态 CDF 近似;你的 Rust 引擎要在中证 510300 期权上调它,先别想着重写。"——这就是 2026 年量化 Rust 开发者面对的现实: 没...
打开 →某私募的固定收益研究员要把过去三个月的 10 年期中国国债收益率拉成时间序列,放进久期模型的样本。AKShare 的公开接口 ak.bond china yield 不要 token、本地能跑、数据按日更新——但研究 notebook 一旦在用户面前演示时撞上 429,整场会议就要等十分钟手动 retry。本课把 AKShare 调用包成一个 fetch y...
打开 →