Python 风格的设计模式
开场 某私募周四下午,团队为沪深300 ETF 期权准备了四个定价器口味——Black Scholes 看涨、Black Scholes 看跌、二叉树、蒙特卡洛。研究主管开了一次代码评审,发现生产代码里有一个 StrategyFactoryAbstract 抽象类、两个 AbstractPricerBuilder 子类、Confluence 上一张 60 行...
打开 →GLOBAL SEARCH
搜索在服务端完成,题目解析与答案不会进入搜索结果。登录后可搜索自己的收藏题单。
找到 30 个结果
中文题目开场 某私募周四下午,团队为沪深300 ETF 期权准备了四个定价器口味——Black Scholes 看涨、Black Scholes 看跌、二叉树、蒙特卡洛。研究主管开了一次代码评审,发现生产代码里有一个 StrategyFactoryAbstract 抽象类、两个 AbstractPricerBuilder 子类、Confluence 上一张 60 行...
打开 →某私募的研究员把一个 Jupyter notebook 推过来:他们在沪深300成份股上扫了 500 万个 (S, K, σ, t) 参数组合,目标是给隐含波动率曲面拟合做敏感度分析。纯 Python + scipy.stats.norm.cdf 跑了 47 分钟,他要的是把这一步压到 5 分钟以内,但策略迭代仍然由他在 notebook 里驱动——研究员不...
打开 →上海一家 私募 的初级 quant 刚完成 3.6.4 的 capstone:三个 Python 文件、一个 run.sh 、一份装满了沪深300 ETF tick 的 TimescaleDB 仓库。PM 很满意;平台组不太满意。部署评审会上他们问的第一个问题是「wheel 在哪?」第二个问题是「锁定文件 在哪?」那段在开发者笔记本上跑得完美的脚本,没有办法...
打开 →周三晚上九点,你在一家上海私募的策略组里,把白天调好的 A 股因子算子打包发给同事,让他在另一台机器上跑同样的回测。他 git clone 完,进到目录里直接 python main.py ,立刻就崩了: ModuleNotFoundError: No module named 'xyzprice' 。你叫他先 cd src && python main.p...
打开 →旁边那台的同事盯沪深300 ETF 的日内 tick 流。早上 10 点,她已经积了 8 万条 tick 行的 CSV;她的开盘脚本只是一段 Python:把每行读进来,过滤掉 volume 100] [364100.0, 4860.0, 546090.0, 3654.0] 二十行删到四行,懂语法的同事五秒就能审完——这是要追的标准。 练习 Given pr...
打开 →周二上午十点的滚动均值 某私募研究台周二上午十点。你刚把 3.2.2 收尾那条 8 步管道交给量化团队,篮子是沪深300 ETF(510300.SH)和三只 A 股票面 ,日收益矩阵 (252, 4) 。PM 把它拉到全市场场景版本——篮子扩到 100 只票、回溯 100 个交易日——结果纯 Python 嵌套循环算出来的 20 日滚动均值跑了 11 秒,下...
打开 →周日晚上 11 点的消息 某私募的中后台周日晚上甩来一条消息:风控组明早要用你写的 summarise.py 跑一份沪深300成分股的 tick 滚动 VWAP,他们那台服务器装的是干净的 Python 3.11、没装你电脑上的任何包。你抓起脚本一看,它现在还是 notebook 里那个用 print 打日志、入口写在最后一格、依赖装在 /anaconda3...
打开 →早上 7:42,做市台。研究员在群里丢了一句:「把跳空分类脚本重跑一下,阈值改成 5%。」打开她的笔记本,屏幕上是十几行 Python——没有 import、没有类,只有一段 if/elif/else 在判断 stdin 读进来的收益率。新人立刻问了一句:「Python 凭什么知道 if 到哪一行结束?」这门课就从这里讲起。学完之后你能默写出同样的脚本:st...
打开 →Hook 周二下午三点,一家上海私募的量化研究员要在 T+1 风控窗口前把沪深300 成分股当日的分钟线快照拉下来,作为隔夜组合 VaR 的输入。上节课用 ThreadPoolExecutor 把 100 个同步 requests.get 压到了 1.8 秒;现在策略组想把每天的拉取面扩到 1500 只 A 股、外加 200 只港股通(Stock Conne...
打开 →Hook 周一下午四点收盘后,私募研究服务器上挂着两份待跑的任务:先把 100 只沪深300 成分股最近 30 个交易日的日线从米筐风格接口同步下来,再用 100 万条蒙特卡洛路径给一张 510300.SH 看涨期权定价。一颗八核 CPU 跑了二十多分钟,T+1 风控报表迟迟出不来。问题不在算法,在于代码全程单线程。这两份任务该交给的并发原语其实不同:线程池...
打开 →某私募的固定收益研究员要把过去三个月的 10 年期中国国债收益率拉成时间序列,放进久期模型的样本。AKShare 的公开接口 ak.bond china yield 不要 token、本地能跑、数据按日更新——但研究 notebook 一旦在用户面前演示时撞上 429,整场会议就要等十分钟手动 retry。本课把 AKShare 调用包成一个 fetch y...
打开 →周一早盘前,你接手了一笔策略回测:沪深300 ETF(510300.SH)一年的日线,要算每日对数收益率(daily log return)。上一课你已经能把 CSV 流过来、用生成器逐行解析、再用 dataclass 装好。可一旦真要算数,你写下的还是那段熟悉的循环: 十二行能写完,对一年 252 个交易日尚可。可同样一段逻辑会出现在每一份回测脚本里——一...
打开 →周二下午两点,某上海私募的股票池经理把你叫到工位前:要 600519.SH 对沪深300 ETF(510300.SH)的市场 β,日简单收益(daily simple return),近252个交易日窗口,今晚9点前要见。教科书答案一行就能解决: beta = Cov(r stock, r mkt) / Var(r mkt) 。工程答案稍长:把 [1, r ...
打开 →周一开盘前一刻钟,你在私募的研究服务器上 merge 了一段对 mean price 的「无害重构」——只是把 sum(...) / len(...) 拆成两步,方便在中间加日志。脚本照常跑完,回测照常出图。下午两点你才发现 PnL 报表上 XYZ001.SH 的当日均价对不上:你在重构时把 sum 与 len 的参数搞反了,函数对所有非空输入都返回 1 。...
打开 →周一上午十点,你坐在一家中型私募的研究台。3.2.2 收尾那张 tear sheet 昨晚跑完了,落到磁盘的中间产物里有一行 returns = (closes['510300.SH'].pct change().dropna()).to numpy() ——一根长度 252 的 np.ndarray ,是沪深300 ETF(510300.SH)在 2024...
打开 →周二上午 9 点半,上证刚开盘。你坐在一家中型私募的研究台,手边是一段从 3.2.1 留下的 NumPy 代码:一个 (T, N) 的日对数收益矩阵, T = 244 , N = 3 ,列依次是 510300.SH、600519.SH、000001.SZ。你想把 600519.SH 在 2024 02 08(春节休市前最后一个交易日)这天的收益单独捞出来——...
打开 →在台子上坐了三周,你接手的策略组发现一个尴尬场面:那段计算 stylized P&L 的代码 (p1 p0) shares fee 被复制粘贴到了七个文件里。今天 A 股印花税口径调整(卖出方向 0.03% 的一个示例性常数,真实税率以监管口径为准),你要在收盘前把这条修改打到七个地方。你改了六个,漏了第七个,周一对账时某条策略的 P&L 偏了三块钱。修法不...
打开 →周二下午两点,私募研究台。你手里堆着三张表:一张是 20 个交易日 × 3 只票( 600519.SH 、 000001.SZ 、 600036.SH )的长格式日收益,共 60 行 (date, ticker, return) ;一张是申万一级行业查找表( 600519.SH → 食品饮料 、 000001.SZ → 银行 、 600036.SH → 银行...
打开 →某私募的量化基础设施工程师把一个棘手问题摆到桌上:回测代码一份要在 CI 上跑(必须 deterministic、必须秒级、必须无网络),另一份要在研究 notebook 里跑(必须真接口、必须有缓存),两边的调用点不能动。本课把前三节的全部产物——L1 的 simulate basket 、L2 的 make cohort ,L3 的 fetch yiel...
打开 →周五晚上,某私募量化研究员要对一个 20 只股票的行业轮动策略做半年回测,需要一个 (T=252, N=20) 的日收益矩阵。问题是平台的合规决策写得很清楚:不接行情数据牌照,所有训练样例只能跑合成数据。CSV 里没有,卖方接口也没有,只能自己生成。这一课给出最小可复现的配方:一颗确定的随机种子、对数欧拉离散化的 GBM 一步、用 Cholesky 分解构造...
打开 →某家私募的因子研究员要演示一个多因子打分模型,需要 200 家"虚拟公司"的横截面:每家要有行业、市值、贝塔、价值/动量/质量三个因子分,且这些字段之间的相关结构得接近真实 A 股名单。另一边,执行成本组要演示成本拆解,需要一段带买卖价差与成交大小的合成 tick 流。两段需求都不能动行情数据牌照——上一课只能产价格路径,这一课要把它扩成横截面与微观结构。本...
打开 →开场 某私募周二上午九点三十一,沪深300 ETF(510300.SH)刚收完集合竞价,团队的 tick 处理器跑了九十秒。两个生产者线程在排空一个 Tushare 风格的行情 websocket——一个分片走 SSE(上海)回报,一个分片走 SZSE(深圳)回报——四个消费者线程各跑一个下游策略。九十三秒时,四个策略共写的盈亏累计器显示 1400000 元...
打开 →开场 某私募周五下午。研究团队内部的「自动研究 UI」——一个小网页,列出库里每个定价器并渲染一个表单可以调它的参数——挂了。一位初级开发上周新加了一个 GARCH 波动率定价器,可这个定价器的表单从未出现在页面上。这页本来不需要维护,注册表应该是在 import 时被填好的。资深开发打开定价器模块一看,发现忘了注册:新类从未进 PRICERS 。半年前同一...
打开 →周一早晨九点,你在一家私募的研究台上收到上游数据团队推过来的 510300 2024.csv ——沪深300 ETF 在 2024 年 1 月的日线行情。你打算直接 df = pd.read csv(path) 然后开始写信号,结果跑出来的 DataFrame 漏洞密布: close 列的 dtype 是 object 而不是 float64 (因为有三行写...
打开 →下午两点,私募研究台。你拉到一份 510300.SH(沪深300 ETF)近 10 个 SSE 交易日的分钟 bar,存储里的时间戳是 UTC,列只有 price (这一分钟末的成交价)与 volume (这一分钟的成交股数)。任务很短:把它降到日 bar,算每天的简单收益(simple return)与 5 日年化滚动波动(rolling annualiz...
打开 →周三晚上 11 点,你在某 私募 量化组里维护着一个内部小包 xyzprice :封装 涨跌停 价计算、复权因子拼接、T+1 持仓核算这三件每周都要做的事。组里另外两位 PM 想直接 pip install xyzprice 就能用,而不是每次复制粘贴你脚本里那几个函数。 pyproject.toml 已经写好,pytest 测试全绿——下一步只剩四件事:构...
打开 →周五下午——日内流改完后第三周。风险口要你每天产出的同一个 P&L 数字,但要求改成「他们的收盘脚本能 import 进去用的函数」。所以那个一直被你贴到每个文件里的 pnl(p0, p1, ...) 得从「笔记本里的片段」升级成「另一个组按名导入的模块」。雪上加霜的是上午一条沪深300 ETF 的 tick 飞来一个 price = 0 ,你的除法直接抛 ...
打开 →Hook 周三晚上九点,深圳一家私募的波动率小组要在 T+1 风控窗口前更新沪深300 ETF(510300.SH)覆盖期权组合的隔夜 VaR 输入。研究员把上节课的 ProcessPoolExecutor 推到了 32 颗核,但每个标的 5,000 个交易日的 GARCH(1,1) 方差递推单跑仍要 0.8 秒——把 800 只 A 股一起标定就是 10 ...
打开 →周一上午 9 点 40 分,浦东陆家嘴一家中型私募的研究台。PM 转过头来:「上周那个 A 股小篮子—— 600519.SH 、 000001.SZ 、 600036.SH ——把 2024 年全年的因子摘要(tear sheet)给我,按申万一级行业把夏普汇总一下,下午三点的月会要用。」你看了一眼磁盘:L4 那道时间序列流水线吐出的 closes.parq...
打开 →周五下午两点半,浦东陆家嘴一家中型私募的风控会上,PM 把昨晚跑出来的 tear sheet 推过来:「食品饮料这只 600519.SH 的 63 日滚动 夏普比率 (Sharpe ratio)样本期均值是 0.86,银行那两只 000001.SZ 和 600036.SH 是 0.42。0.44 的差,可信吗?」你脑子里第一反应是 3.2.2 L5 那...
打开 →