QuantWeft量化经纬
English
本章小节

第 1 章/ 45

量化金融与量化行业(Quantitative Finance and Quant Industry)

先修:初等代数、百分数与基础逻辑推理能力。编程部分可先读逻辑,第 2 章再系统练习环境与语法。

1. 本章目标

完成本章,你应能区分量化金融(Quantitative Finance)、金融工程(Financial Engineering)、系统化交易(Systematic Trading)与算法交易(Algorithmic Trading);说明研究、交易、开发、风险、衍生品和执行岗位各自解决什么问题。你还要能画出一个策略从假设到结论的流程,并指出每一步依赖哪些信息、输出什么对象、怎样发生错误。

具体验收有三项:给定一个“过去表现分化的资产未来收益存在持续性”的经济想法,写出可检验假设;把特征、信号、预测、目标权重、订单、成交、实际持仓和损益(Profit and Loss, PnL)分别记录;在含交易成本的两资产例子中核对损益。职业名称只是入口,能把工作对象分清才算掌握。

2. 为什么 Quant 需要它

你看到一张历史净值曲线,夏普比率(Sharpe Ratio)很高。曲线本身没有告诉你研究员在买入前知道什么,也没有告诉你该价格是否可成交、是否把退市公司删掉,或者研究员试过多少方案。你需要先理解曲线背后的生产过程,再判断结果。

本章示例用一个构造研究解释工作对象。你应把待检验假设、计算规则与市场证据分开;一个技术指标可以是待检验输入,但仅凭它的名称或图形不能得出有效性结论。

Princeton ORFE 的官方本科介绍把概率、统计与随机过程、优化列为共同核心,并把金融、计量经济学和计算方法列为应用方向。这对应一个很实用的训练顺序:先学如何表示不确定性、如何估计、如何在约束下决策,再讨论策略。在岗位上,你可能只负责其中一段;在研究报告中,你仍应解释其他段的假设。Princeton ORFE

证券交易委员会(Securities and Exchange Commission, SEC)的算法交易报告同时讨论投资决策、订单大小、报价和交易风险等算法用途。因此,“程序自动下单”只是算法应用的一类,不能据此推断研究员是否找到了新的预期收益。SEC 算法交易报告

3. 直觉

从权利、数量和报价开始

金融工具(Financial Instrument)约定持有人与对手方的权利和义务。对持有人有经济价值的现金、证券或合约权利,可以构成金融资产(Financial Asset)。资产和工具不是两套互斥分类:一只股票既是一种工具,也可以是账户中的资产。下面只建立计算需要的背景;具体交易机制见第10章。

对象 你持有什么 数量与价格的单位 哪些变化影响财富
股票(Stock) 公司的一份股权;分配取决于公司和权利安排 股;报价货币/股 股价、归属股息、股份数量变化
债券(Bond) 约定的债权;支付仍有违约风险 份或面值;报价约定须核验 利息、偿还、价格、违约
基金份额(Fund Unit) 对基金资产的相应份额 份;报价货币/份 底层资产、费用、分配
衍生工具(Derivative) 随标的与合约条件变化的权利/义务 合约;需另列乘数 标的、时间与合约条件;保证金不等于名义敞口

价格(Price)是特定时点、币种和报价单位下的数值;成交价、买方报价、卖方报价与估值价各有用途,不能互换。持有数量 qq 股、每股估值 PP 元时,市值 qPqP 的单位才是元。单价100元不能告诉你账户投入多少,也不能单独表示便宜或昂贵。

收益(Return)把财富变化除以起始财富,便于比较不同投入。无现金流、数量不变时,100元变102元:先算增加2元,再算 2/100=0.02=2%2/100=0.02=2\%。持100股的货币损益是200元,百分比仍为2%。风险(Risk)涉及这些结果的不确定性和损失可能性,也涉及需要卖出时能否成交;后文的贝塔只计量一种线性敏感度。

多头(Long)在本章现货例中指持有正数量,价格上涨使市值增加。空头(Short)的简化股票例先借券卖出,形成归还证券的义务;价格上涨会提高买回成本。真实借券、担保与融资另有条件。本章先用正负权重计算方向,不能据此推定现金可自由使用。

考虑一个教学想法:资产在宏观需求与基本面冲击下的信息扩散存在时滞,过去表现相对较好的资产可能在下一期继续相对较好。你不能直接把这句话当买入指令。先要确定“表现”用哪种收益计算,“过去”指几个月,“继续”指下一天还是下一个月,以及股票池是否包含后来退市的公司。

随后,你在每个决策日计算历史收益。这个数是特征(Feature)。按特征把资产排序后,你得到一个信号(Signal);把排序映射成对未来收益的估计,才得到预测(Forecast)。再考虑风险、交易成本和持仓限制,你决定目标权重;目标权重是决策,不是已经发送或成交的订单。执行将目标转成订单,实际成交(Fill)会记录成交数量、价格和时点;实际持仓(Position)由成交后数量形成。持仓经历价格和现金流变化,才产生损益(Profit and Loss, PnL)。

一项研究可以在任意步骤失败:规律不存在,数据无法支持假设,信号预测能力太弱,成本吃掉收益,风险太集中,或成交比回测假设困难。记录失败点能帮助你选择下一项工作。增加模型复杂度并不会自动修复这些问题。

一条完整生命周期

图表源文
flowchart LR
  I[Idea 想法] --> D[Data 数据]
  D --> Fe[Feature 特征]
  Fe --> S[Signal 信号]
  S --> F[Forecast 预测]
  F --> W[Target Weight 目标权重]
  W --> O[Order 订单]
  O --> X[Fill 成交]
  X --> Pos[Position 实际持仓]
  Pos --> N[PnL 损益]
  N --> R[Risk 风险]
  R --> V[Evaluation 评价]
  V -. 修订假设并登记新试验 .-> I

箭头表示输入依赖,而不是“完成一遍就必然赚钱”。九个环节环环相扣:

  1. Idea(投资想法):基于经济机制(如信息粘性或风险补偿)提出的可证伪假说。
  2. Data(数据):按时点可用信息(Point-in-Time, PIT)契约整理、带时间戳与单位的结构化行情与基本面记录。
  3. Signal(信号):在决策时点 t−1t-1 仅利用已知特征生成的方向或排序评分。
  4. Forecast(预测):将信号映射为下一期收益分布的条件估计值。
  5. Portfolio(目标权重):在资金预算、风险上限和换手约束下求解出的期望持仓比例。
  6. Execution(执行与成交):生成订单,在交易所完成撮合,记录实际成交量价与时间。
  7. PnL(损益):根据生效持仓与实际价格/现金流核算出的货币盈亏与无量纲收益。
  8. Risk(风险):检查组合的因子暴露、尾部损失预算与极端情景压力。
  9. Evaluation(评价):对比基准、扣减摩擦成本、检验统计与经济显著性,并记录实验版本。

你每次根据评价改变设计,都在增加研究自由度;应登记新版本,并保留之前的结果。

4. 数学基础

组合的一个持有区间收益,在不换仓且现金流口径正确时为

Rp,t=∑i=1nwi,t−1heldRi,t+wc,t−1heldRc,t. R_{p,t}=\sum_{i=1}^{n}w^{\mathrm{held}}_{i,t-1}R_{i,t}+w^{\mathrm{held}}_{c,t-1}R_{c,t}.

pp表示组合;nn是风险资产数;wi,t−1heldw^{\mathrm{held}}_{i,t-1}与wc,t−1heldw^{\mathrm{held}}_{c,t-1}分别是收益区间[t−1,t][t-1,t]开始时、开盘成交后已实际持有的风险资产和现金权重;RcR_c是同区间现金收益。这里明确按期初实际持仓计收益,不用区间末才知道的目标权重。

例如,你把60%资金配置给收益2%的资产,把20%配置给收益−1%的资产,其余20%留现金且现金收益为零,那么组合毛收益是1%。每项权重的分母都是同一个起始净资产值(Net Asset Value, NAV),所以才能直接相加。

毛收益(Gross Return)减去交易与资金成本,得到净收益(Net Return)。本章采用简化的区间成本比例ctc_t:

Rp,tnet=Rp,tgross−ct. R^{\mathrm{net}}_{p,t}=R^{\mathrm{gross}}_{p,t}-c_t.

成本在区间初始NAV上计量,区间没有外部申购赎回,成本扣除的时点与再投资影响先简化。第29、35章会改用现金账本,避免把不同现金流时点压成一个比例。

5. 正式定义

5.1 四个领域的工作对象

领域 核心对象 典型问题 产物与检验
量化金融(Quantitative Finance) 金融问题的数学、统计和计算表达 怎样定价、衡量风险、配置资产或检验规律? 模型、估计、数值方法和可检验结论
金融工程(Financial Engineering) 金融合约、风险转移与实现结构 怎样复制期权,怎样设计对冲和融资结构? 定价/对冲方案,检查无套利与风险条件
系统化交易(Systematic Trading) 用明确规则形成投资与交易决策 在何时、按哪些信息、持有哪些资产? 可重跑规则、持仓和样本外评价
算法交易(Algorithmic Trading) 用程序执行交易相关决策 怎样拆分订单、报价、控制速度或决定交易? 算法、订单、成交与执行风险评价

这些领域可以重叠。一个基金用模型挑选股票,再用执行算法成交,既涉及系统化研究,也涉及算法交易。一个衍生品定价模型可以没有主动交易策略,但仍属于量化金融。

高频交易(High-Frequency Trading, HFT)通常涉及短持有期、低延迟基础设施和频繁订单交互。没有统一阈值能把所有机构的HFT划成一类。你应具体描述延迟、订单频率、持有期和策略机制,而不是凭“每秒几次交易”判断研究水平。

基本面量化(Fundamental Quant)把报表、估值、经营和其他基本面信息编码成可检验信号。关键是信息可用时间与会计口径,而不只是把人工选股流程搬进代码。

5.2 岗位划分是一种工作地图

岗位 主要责任 举例 常见协作界面
量化研究(Quant Research) 假设、估计、实验与证据 检查动量是否在成本后仍有预测意义 数据、组合、验证、报告
量化交易(Quant Trading) 交易状态、风险和实施决策 面对流动性下降调整交易计划 研究信号、仓位与执行
量化开发(Quant Development) 数据/计算/交易系统的可靠实现 防止数据错位或重复下单 API、代码、日志、部署
风险量化(Risk Quant) 风险度量、模型和约束 检查因子集中、压力亏损和保证金需求 持仓、市场、风险限额
衍生品量化(Derivatives Quant) 定价、校准、敏感性与对冲 估计期权价格和Greeks 市场报价、数值方法、交易台
执行量化(Execution Quant) 成交成本与执行算法 在冲击与等待风险间选择订单节奏 父订单、盘口、成交记录

机构可能把这些责任合并或重新命名。表中不是招聘资格或全球统一分类,而是帮助你定义工作边界:谁决定假设,谁保证数据可靠,谁承担实际成交,谁验证风险。

5.3 把容易混淆的对象拆开

阿尔法(Alpha)在回归归因中表示相对指定模型的截距;在研究口语中也可能指预期主动收益或预测信号。你必须说明用的是哪种含义。贝塔(Beta)是对市场或因子的线性敏感度,不是“所有风险”。因子(Factor)既可指用于排序的公司特征,也可指共同收益或可交易组合;“低P/E”与“价值因子组合收益”不是同一个数据对象。

对象 定义与例子 数学表示 可用时间和单位
Feature 特征 过去11个月累计收益 xi,tx_{i,t} 形成区间结束后可计算,无量纲
Signal 信号 同日历史收益的百分位排名 si,ts_{i,t} 使用当日可得股票池,通常范围0–1
Forecast 预测 对下一月收益的条件估计 μ^i,t+1∣t\widehat{\mu}_{i,t+1\mid t} 在t产生,预测区间为t到t+1,小数收益
Target Weight 目标权重 再平衡希望达到的资本分配 wi,ttargetw^{\mathrm{target}}_{i,t} 风险/成本约束后的决策,无量纲
Order 订单 要求买入或卖出的指令,可含数量、限价和有效条件 订单编号及提交参数 提交时记录;尚未成交,不能据此记为持仓
Fill 成交 订单实际执行的部分或全部数量、价格和时点 (Δqi,t,Ei,t,trade_time)(\Delta q_{i,t},E_{i,t},trade\_time) 成交记录;部分成交可多次出现
Position 持仓 实际成交后累积持有的数量 成交后数量=成交前数量+本次成交数量 每个成交时点按实际成交更新,份或合约数
Exposure 暴露 对资产/行业/因子的规模或敏感度 权重、金额或B⊤wB^\top w 指明资金口径或风险模型
PnL 损益 持仓和现金产生的价值变化 终值−初值−外部净流入 有币种和收益区间

BB在B⊤wB^\top w中是资产×因子的暴露矩阵,ww为资产×1权重,所以结果是因子×1。第5、15、21章详细推导。现阶段只需知道:同样的资金权重可能对应不同的市场风险。

6. 推导

6.1 从资金到收益

初始资本为V0V_0。你分给资产ii的金额是V0wiV_0w_i,其区间终值是V0wi(1+Ri)V_0w_i(1+R_i)。现金终值为V0wc(1+Rc)V_0w_c(1+R_c)。若预算满足∑iwi+wc=1\sum_iw_i+w_c=1,合计终值为

V1=V0(1+∑iwiRi+wcRc). V_1=V_0\left(1+\sum_iw_iR_i+w_cR_c\right).

两边除以V0V_0再减1,就得到第4节的组合收益公式。这里没有根据区间末价格重新设定权重;计算用的是区间起点已经持有的资金配置。

6.2 从交易量到成本

设再平衡前权重为wibeforew_i^{\mathrm{before}},成交后权重为wiafterw_i^{\mathrm{after}}。本节把风险资产买卖合计、不折半的名义交易总比例定义为

T=∑i=1n∣wiafter−wibefore∣. T=\sum_{i=1}^{n}\left|w_i^{\mathrm{after}}-w_i^{\mathrm{before}}\right|.

TT是风险资产买入与卖出名义金额之和相对初始NAV的比例,求和不含现金自身权重变化。若每单位风险资产交易金额支付费率kk,成本金额为C=V0kTC=V_0kT,成本比例为c=C/V0=kTc=C/V_0=kT。k=0.001k=0.001表示每单位交易名义金额10个基点(Basis Points, bps),即0.1%,而不是10%。不同资料可能把该总交易量称为换手率或将其折半;比较成本前必须先核对口径。

6.3 Alpha与Beta的解释范围

单市场回归可写为

Ri,t−Rf,t=αi+βi(Rm,t−Rf,t)+ϵi,t. R_{i,t}-R_{f,t}=\alpha_i+\beta_i(R_{m,t}-R_{f,t})+\epsilon_{i,t}.

RiR_i是资产收益,RfR_f是同币种同频率无风险收益,RmR_m是市场收益;αi\alpha_i是该样本与模型的截距,βi\beta_i是市场超额收益的敏感度,ϵi\epsilon_i是未解释部分。所有收益使用小数,不能把日度截距直接当年收益。

这是对回归对象的介绍,不是此处对资本资产定价模型(Capital Asset Pricing Model, CAPM)均衡假设的证明。第8章推导估计,第14、15章讨论定价与实证。即使估计得到正截距,你仍需检验不确定性、其他因子、交易成本和选择偏差。

6.4 部分成交:从数量回到现金

7. 金融解释

你预测到未来收益,并不自动知道应该投入多少资本。持仓取决于预测不确定性、资产相关性、损失预算、交易成本、流动性与可融资性。对两只高度相关股票同时给高权重,可能把一个经济风险集中两次。

Beta说明对风险源的共同敏感度。假设组合的市场Beta为1.5,市场超额收益上升1个百分点时,回归模型对应约1.5个百分点的组合变化,其他因素固定。这个线性条件解释不保证下一次实际变化,尤其在危机和杠杆约束下。

成本后的Alpha才接近你能实施的主动收益讨论,但“净”也需要定义。只扣佣金而没有借券、融资、价差与冲击,仍可能低估实施成本。第35章会展开成本模型;本章先要求报告哪几项已计、哪几项未计。

8. Numerical Example

以下全为教学构造,不是市场观测或策略绩效。我们用一个完整的小研究闭环贯穿 9 个阶段:

所有时刻采用协调世界时(Coordinated Universal Time, UTC),以下为构造时刻,不代表真实日历:D0 16:00前端价格A98、B101;D1 16:00末端价格A100、B100,16:01公开、16:02入库,16:05形成信号。D2 09:30两者以构造价格100成交,收益测量从D2 09:30至D3 16:00,末价A102、B99,无股息。

阶段输入 A B 下一步用途
D0→D1历史价格收益 100/98−1≈2.040816% 100/101−1≈−0.990099% 比较两者历史表现
按高/低手动给定的信号s +1 −1 进入明示预测映射
下一持有期预测 1.5% 0.5% 作为组合决策输入之一
D2→D3实现收益 2% −1% 持有期结束后核损益

预测与实现值分列:D1时不能读取最后一行。目标权重0.6/0.2是本例给定的资本规则,未声称从这两个预测唯一推导出最优配置。

  1. Idea(想法):假设两只风险资产 A 与 B 存在宏观行业需求分化,前期景气度高的资产在下期存在信息传导粘性与短期惯性。
  2. Data(数据):前期决策点 t−1t-1,获取已入库的资产收盘价与前期收益,保证 available_at 与 ingested_at 均不晚于决策时刻。
  3. Signal(信号):根据前期收益生成横截面强弱信号:A 相对强势(信号为 +1+1),B 相对弱势(信号为 −1-1)。
  4. Forecast(预测):人为指定教学映射 μ^i=0.01+0.005si\widehat{\mu}_i=0.01+0.005s_i,得到下一持有期收益预测A为1.5%、B为0.5%,现金为0%。常数的单位是每持有期小数收益;这条映射没有拟合或市场证据,排序本身没有收益单位,后面的实际2%与−1%是另外给定的结果。
  5. Portfolio(目标权重):在本例只做多、另留现金的约定下,决定再平衡目标权重:wAtarget=0.60w_A^{\mathrm{target}} = 0.60,wBtarget=0.20w_B^{\mathrm{target}} = 0.20,留存现金权重 wctarget=0.20w_c^{\mathrm{target}} = 0.20。
  6. Execution(执行):
    • 调仓前持仓权重为 wAbefore=0.50w_A^{\mathrm{before}} = 0.50,wBbefore=0.30w_B^{\mathrm{before}} = 0.30,现金 wcbefore=0.20w_c^{\mathrm{before}} = 0.20;初始 NAV 为 V0=100,000V_0 = 100{,}000 资金单位。
    • 调仓前A500股、B300股、现金20,000;按D2每股100的价格,订单买A100股、卖B100股,买卖各10,000资金单位。构造假设全部成交,实际数量变为A600股、B200股。单位是股和货币,不把“买10,000单位”混作股数。
    • 在收益区间开始时完成成交(Fill),买卖合计不折半的风险资产交易总比例为 T=∣0.60−0.50∣+∣0.20−0.30∣=0.20T = |0.60 - 0.50| + |0.20 - 0.30| = 0.20(交易金额 20,000 资金单位)。
    • 实际持仓生效:wAheld=0.60w_A^{\mathrm{held}} = 0.60,wBheld=0.20w_B^{\mathrm{held}} = 0.20,wcheld=0.20w_c^{\mathrm{held}} = 0.20。
  7. PnL(损益计算):
    • 持有期结束,实现收益:A 为 +2%+2\%,B 为 −1%-1\%,现金收益为 0%0\%。
    • 毛收益:Rpgross=0.60×0.02+0.20×(−0.01)+0.20×0.0=0.01R_p^{\mathrm{gross}} = 0.60 \times 0.02 + 0.20 \times (-0.01) + 0.20 \times 0.0 = 0.01,即 1.00%1.00\%。
    • 交易成本:费率为每单位风险资产交易名义金额 10 bps(k=0.001k = 0.001)。成本金额为 C=100,000×0.001×0.20=20C = 100{,}000 \times 0.001 \times 0.20 = 20 资金单位,占初始 NAV 的 0.02%0.02\%。
    • 净收益:Rpnet=1.00%−0.02%=0.98%R_p^{\mathrm{net}} = 1.00\% - 0.02\% = 0.98\%。
    • 期末 NAV:V1=100,000×(1+0.0098)=100,980V_1 = 100{,}000 \times (1 + 0.0098) = 100{,}980 资金单位。
    • 净损益:PnL=100,980−100,000=980\text{PnL} = 100{,}980 - 100{,}000 = 980 资金单位。
  8. Risk(风险检查):
    • 风险资产总暴露(Gross Exposure)=0.60+0.20=0.80= 0.60 + 0.20 = 0.80;净暴露(Net Exposure)=0.80= 0.80;现金缓冲 20%20\%。
    • 评估集中度:资产 A 占比 60%,若A单独下跌10%、B和现金不变,毛收益为0.6×(−0.10)=−6%;这是构造压力情景,不是发生概率估计。
  9. Evaluation(研究评价):
    • 同期给定的50% A/50% B零现金基准毛收益为0.5%,策略毛差为0.5个百分点;基准费用未给出,不能称净差。一期观察不能检验均值显著性;若未来市场费率上升至 50 bps(成本达 0.10%0.10\%),净收益将压缩至 0.90%0.90\%。实验记录冻结,保留参数设置,防止未来反复调试造成过拟合。

本例假定成交在收益区间开始时按约定价格完成、没有额外冲击或外部资金流、成本按初始NAV另扣且不影响资产资金配置。正式自融资账本会把成本资金来源与实际数量计清;本例用来核对单位与对象,不是交易引擎。

如果在区间结束后才看到A涨2%、B跌1%,再把权重改成0.6、0.2并用于这个已经结束的区间,就发生前视偏差(Look-ahead Bias)。相同数字、相同乘法,也可以表达错误实验。

9. Python Implementation

本读者版的默认运行入口

本样章共享I3已接受读者包的实现。从克隆后的仓库根目录(quantweft/)建立环境,再运行:

.venv/bin/python run_notebook.py notebooks/ch01_lifecycle.ipynb

默认构造Notebook不读取未随包提供的French数据、不下载数据;新输出写入唯一runs/子目录。以下历史CLI、测试和数据路径以课程根为工作目录;其中French路线须自备符合授权与manifest契约的输入,本批未运行。I3可搬移CLI默认写入新UUID的runs目录、拒绝覆盖;已位于读者根时不再执行cd quantweft。安装与可选数据说明见接受读者安装入口和可选数据契约。构造检查通过不代表真实市场计算已重新执行。

本章脚本为code/ch01_lifecycle.py,Notebook为ch01_lifecycle.ipynb。运行环境和步骤见环境说明。脚本明确记录教学构造与资金口径,不发出交易指令。

cd quantweft
.venv/bin/python code/ch01_lifecycle.py

下列小程序可以独立运行,帮助你先理解计算;公共函数的测试与其他章的复用由src完成。

from math import isclose

def one_period_net_return(
    weights: tuple[float, ...],
    returns: tuple[float, ...],
    prior_weights: tuple[float, ...],
    cost_rate: float,
) -> tuple[float, float, float]:
    if not (len(weights) == len(returns) == len(prior_weights)):
        raise ValueError("weights and returns must have the same length")
    if cost_rate < 0:
        raise ValueError("cost_rate must be nonnegative")
    gross_return = sum(w * r for w, r in zip(weights, returns))
    turnover = sum(abs(w - old) for w, old in zip(weights, prior_weights))
    cost = cost_rate * turnover
    return gross_return, cost, gross_return - cost

gross, cost, net = one_period_net_return(
    weights=(0.6, 0.2), returns=(0.02, -0.01),
    prior_weights=(0.5, 0.3), cost_rate=0.001,
)
assert isclose(gross, 0.01)
assert isclose(cost, 0.0002)
assert isclose(net, 0.0098)
print({"gross": gross, "cost": cost, "net": net})

浮点计算可能显示0.009800000000000001;这不是经济差异。你用容差检查,而不是字符串比对。该局部函数假设现金收益为零,不能直接用于融资空头或复杂再平衡;第29章会用账本替代。

以下自包含片段按本例简化口径核账:成交后资金配置先给定,20单位费用在终点另扣,忽略扣费时点对再投资的影响。第29章再处理自融资约束。

from math import isclose
initial_nav = 100000.0
stock_end = 600 * 102.0 + 200 * 99.0
trade_amount = 100 * 100.0 + 100 * 100.0
cost_currency = trade_amount * 0.001
cash_end = 20000.0 - cost_currency
ending_nav = stock_end + cash_end
pnl_currency = ending_nav - initial_nav
assert isclose(stock_end, 81000.0)
assert isclose(cost_currency, 20.0)
assert isclose(ending_nav, 100980.0)
assert isclose(pnl_currency / initial_nav, 0.0098)
print(stock_end, cash_end, ending_nav, pnl_currency)

时间契约

假设用周一收盘之前的历史信息形成特征,信号在周一收盘之后产生,周二交易开始时成交。你只能对周二成交后到持有区间结束的价格变化计收益。周一收盘到周二开盘的跳空,不属于“周二才买入”的持仓收益。

第2章将用shift示范索引对齐;一个移位操作仍需建立在相同价格端点上。用日收盘收益去近似开盘成交的持有收益,需要单独披露误差,不能靠“shift过一行”宣称执行完全正确。

10. Visualization

毛收益、简化交易成本与净收益

横轴是本例的Gross、Cost、Net三种量,纵轴是收益百分比。Cost柱画成−0.02%,表示从毛收益扣除的贡献;费用本身是正的0.02%。你应检查成本是否与净收益差额一致,并观察0.02个百分点成本与1%毛收益的量级。这张图只解释教学构造的算术,不证明动量或任何策略存在优势。

生命周期图的横向箭头则表示研究对象的依赖。一个节点失败,需要沿输入回查;例如净收益错误可能来自成交价格,也可能来自持仓时点、公司行动或成本单位。

11. Real Market Example

Kenneth French 数据库公开提供行业组合和因子收益。课程保存了真实的10个行业组合数据快照,来源为10 Industry Portfolios,下载与哈希见data manifest。

官方说明在每年6月底按标准行业分类(Standard Industrial Classification, SIC)分配股票,随后计算7月到次年6月的组合收益。你现在看到的是已构造组合的收益序列,不是一份可直接下单的逐股持仓,也不是开盘/最高/最低/收盘价和成交量(Open, High, Low, Close, Volume, OHLCV)记录。这使它适合练习收益面板和后续回归,但不能证明你能复制所有历史股票的成交。

把这一来源映射到生命周期:Idea可以是行业收益差异;Data是官方月度组合收益;Feature是历史行业收益;Signal是行业排序;Portfolio是对这些收益序列的研究权重。然而Execution没有由这个文件提供可成交价格、成分与数量。因此你可以做统计研究,暂不能把结果标为已验证的可投资策略。

本章没有对该真实样本执行动量回测,不报告策略Sharpe。第2章展示读取与单位,第15章完成因子回归;Project 1和后续策略项目分别处理描述与策略验证。官方数据库还会修订历史计算,快照与当前网页不是同一版本。French 数据库与格式变更说明

12. Common Mistakes

错误一:把预测与真实未来收益放在同一列

错误做法是forecast = next_month_return,再根据forecast选股。未来收益可作为标签(Label)用于训练已经完成的历史样本,但不能在预测时作为输入。正确做法是保留三列:signal_time时可得feature、当时产生forecast,以及之后形成的realized_return。即使三列最终按同一日期展示,其可用时间不同。

past_return = -0.02
next_return = 0.03
# 错误:用未来目标作当期决策
wrong_weight = 1.0 if next_return > 0 else 0.0
# 正确的对象关系:历史信息先形成决策,再测量未来
correct_weight = 1.0 if past_return > 0 else 0.0

此段用教学构造定义了输入;编程答案进一步对照实现的收益。真实实验中的next_return和past_return还必须来自明确定义的时间区间。

错误二:把净敞口零称为没有风险

多A50%、空B50%,净敞口(Net Exposure)为零,总敞口(Gross Exposure)为100%。若A上涨10%、B上涨20%,忽略成本时组合收益为0.5×0.1−0.5×0.2=−5%0.5\times0.1-0.5\times0.2=-5\%。美元中性不是Beta中性,更不是免疫亏损。

错误三:成本费率的单位多乘或少乘100

10bps是10/10000=0.00110/10000=0.001。把10写进公式会算成1000%的费率;把0.1当小数会算成10%。正确做法把费率单位记在配置名称和数据字典里,并用20个资金单位这个手算值测试。

错误四:看到回归Alpha就宣布有优势

一项回归的截距取决于模型、样本、频率、风险因子与估计误差。你还要核查多重检验(Multiple Testing)、成本与样本外。统计显著性(Statistical Significance)与经济显著性(Economic Significance)分开讨论。

错误五:系统每次都给同样结果,所以研究可靠

程序可复现只证明同输入同程序得到同输出。错误数据、未来信息、遗漏退市或错误公式也能被稳定复现。你需要输入有效性和实验设计的检验。

13. Quant Research Application

把初始动量想法写成一个最小研究协议:

  1. 经济假设:信息反应可能分步发生;过去相对强势与未来收益可能相关。这是待检验解释,不是已证明机制。
  2. 样本:先用真实行业组合练习方法;如果转向逐股策略,重新核验PIT股票池、价格现金流和借券。
  3. 形成区间:写出每个信号用了哪些月份、是否跳过最近月。第25章精确讲12-1动量。
  4. 决策与成交:历史数据截至t可得;交易在t后的可执行时点;收益端点与成交一致。
  5. 对照:比较等权或指定基准,避免只给最佳策略图。
  6. 实验冻结:在最终样本外之前确定窗口、权重、成本和评价项,保存所有试验。
  7. 评价与限制:报告毛/净收益、风险、暴露、换手、失效窗口、统计不确定性与无法验证的成交假设。

你没有学完回归和回测引擎,也能先练习写研究问题与数据契约。复杂工具等到它解决具体问题时再加入。

14. Chapter Summary

研究员把经济问题转成假设和可检验对象;开发人员让数据与计算可重复;交易和执行人员把目标权重转成订单与实际成交;成交更新持仓,风险人员检查资本可能承受什么损失,随后用持仓和现金流计算 PnL。你用生命周期把这些工作接起来。

特征是输入,信号是决策提示,预测是未来目标的条件估计,目标权重是资本配置决策,订单是交易指令,成交是实际执行记录,持仓是成交后资产数量,暴露是风险或资本计量,PnL是之后的货币结果。Alpha和Beta必须附模型与频率。下一章学习实现工具,第3章学习数据何时可用,这两项决定你能否正确记录这条链。

15. Exercises

1-E01:一个程序每隔一分钟把大订单拆成小订单,投资方向由人工给出。它体现哪个领域的工作?还能否称为Quant Research?

1-E02:解释Feature、Signal、Forecast、Target Weight、Order、Fill和Position。给一个历史收益驱动的例子,并分别标注决策、提交订单、实际成交和持仓生效时间。

1-E03:资金多A50%、空B50%是否没有市场风险?说明需知道什么信息。

1-E04:行业组合数据能用于收益回归,却不足以验证逐股订单执行。列三项缺失信息。

1-E05:资金权重0.4、0.4,现金0.2;两资产收益3%、−2%,现金收益0.1%。计算毛收益。

1-E06:风险资产权重从0.3、0.5变到0.5、0.3,费率为每单位风险资产交易名义金额5bps,初始NAV为200,000个资金单位(例如元)。按本章买卖合计、不折半的名义交易总比例计算成本。

1-E07:A收益10%、B收益20%;持仓多A0.5、空B0.5,现金权重1,现金收益0。计算净/总敞口和毛收益。

1-N01(识别):每股报价100元、持有100股、信号评分+1、预测下一期收益1.5%,分别是哪种对象、用什么单位?信号评分能否直接当1%的预测?订单在哪个阶段产生,何时才更新持仓?

1-N02(单步):某策略初始 NAV 为 50,000 资金单位。在再平衡时刻,风险资产 A 和 B 的期初持有权重为 (0.40,0.40)(0.40, 0.40),期初现金权重为 0.200.20。假设订单全部成交,成交后实际权重变为 (0.70,0.10)(0.70, 0.10),现金权重保持 0.200.20。费率为每单位风险资产交易名义金额 10 bps。单步计算:

  1. 风险资产买卖合计、不折半的名义交易总比例 TT;
  2. 实际交易产生的总名义金额(货币单位);
  3. 应扣除的交易成本金额与成本比例。现金自身权重是否参与交易比例计算?

1-N03(完整演算):某教学策略初始净资产 V0=100,000V_0 = 100{,}000 资金单位。

  • 调仓前持仓权重:A 资产 0.500.50,B 资产 0.300.30,现金 0.200.20。
  • 调仓后生效权重:A 资产 0.600.60,B 资产 0.200.20,现金 0.200.20。
  • 实现收益:A 资产 +2.0%+2.0\%,B 资产 −1.0%-1.0\%,现金收益 0.0%0.0\%。
  • 费率:每单位风险资产交易金额 10 bps。 完整列出从调仓交易量、成本扣除、毛收益、净收益、期末 NAV 到最终净 PnL 的端到端演算步骤与单位,并给出风险资产总暴露与净暴露。

1-B01(部分成交核账):按第6.4节成交状态,列成交后现金、数量、NAV及期末净PnL。为什么不能用目标600股计算A的损益?

16. Programming Exercises

1-P01:运行本章脚本,核对gross=0.01、cost=0.0002、net=0.0098。把费率改成50bps,解释结果。

1-P02:使用过去收益−2%及未来收益3%,对照“按未来正负决定是否持仓”和“按过去正负决定是否持仓”的结果。定义所有变量并运行。

1-P03:给定signal_time为某交易日16:05,trade_time为同日16:00,写一个检查函数使其失败;改为下一交易日开盘后通过。时间使用带时区UTC对象。

1-N04(代码诊断):目标风险资产权重为(0.6,0.2),原实际持仓为(0.5,0.3),但订单全部未成交。现金0.2,期间无其他交易,费率只对实际成交金额收费;收益A2%、B−1%、现金0。下面有两处错误,分别是什么?算出按真实持仓的毛/净收益,再修复代码并给断言。

target_weights = (0.6, 0.2)
prior_weights = (0.5, 0.3)
returns = (0.02, -0.01)
cost_rate = 10  # 错误地把10bps当小数
planned_turnover = sum(abs(w - old) for w, old in zip(target_weights, prior_weights))
gross = sum(w * r for w, r in zip(target_weights, returns))
net = gross - cost_rate * planned_turnover
print(gross, net)

17. Challenge Problems

1-C01:设计一个最小动量研究协议。哪些假设能先登记,哪些数据不足使你无法给可投资性结论?提出一个可能推翻初始解释的对照。

1-C02:上述简化成本扣除例子在真实自融资账本中有哪些缺口?说明至少三项,并提出核账等式。

1-N05(研究判断):一个历史收益排序研究使用今天的证券名单,并在收盘价定稿后形成信号,却按同一收盘价成交;报告只给一个不扣成本的高夏普结果。指出已能确认的时间/样本问题、仍需补的费用和试验范围证据,并说明现有材料能否证明真实净盈利或证明规律不存在。

18. Solutions / Solution Hints

概念与手算答案

1-E01:这是执行算法,也是算法交易的一种。研究执行参数与冲击可能属于Execution Quant研究;仅按既定计划执行不证明进行了Alpha研究。投资方向来自人工并不妨碍执行系统自动化。

1-E02:Feature可为t之前累计收益;Signal是t时据此排名;Forecast是t时对未来区间收益的估计;Target Weight是希望达到的资本比例;Order是提交的交易指令;Fill是实际成交记录;Position是成交后实际持有的股数。排名不是未来收益估计,目标权重或未成交订单都不是持仓。 例如构造D1 16:05决定目标,D2 09:29提交订单,D2 09:30成交回报确认数量;该已成交数量才在D2 09:30生效,收益随后测量。Order、Fill和Position分别记录三个动作,未成交时仍保留原数量。

1-E03:净资金敞口零。若两资产Beta不同,市场Beta不为零;还存在行业、个股、价差扩大、借券与融资风险。需要资产Beta、相关性、因子暴露、交易和资本约束。

1-E04:历史成分/每股数量、可成交报价与深度、借券及融资条件。逐股公司行动、交易日历、成本也需核验。组合收益文件不等于这些资料。

1-E05:0.4×0.03+0.4×(−0.02)+0.2×0.001=0.00420.4\times0.03+0.4\times(-0.02)+0.2\times0.001=0.0042,即0.42%。现金收益贡献0.02个百分点。

1-E06:T=∣0.5−0.3∣+∣0.3−0.5∣=0.4T=|0.5-0.3|+|0.3-0.5|=0.4;5bps=0.0005。成本比例0.0002=0.02%,金额40个资金单位。若改用折半交易量定义,费率的计量口径也须同步调整。

1-E07:风险资产net=0.5−0.5=0,gross=1;毛收益=5%−10%=−5%。现金权重1使含现金预算满足1,但不抵消两腿价格变化。真实卖空资金是否可自由使用取决于抵押与融资安排,本题作简化。

1-N01 解答:100元/股是价格,100股是持仓数量;两者相乘才是10,000元市值。+1是本例无量纲信号评分,1.5%是针对下一持有期的收益预测。只有给出映射与条件后,才能把评分转成收益估计。订单在Execution中提交,实际成交Fill才更新Position;未成交订单不增加持仓。

1-N02 解答:

  1. 风险资产名义交易总比例(不折半):

    T=∣0.70−0.40∣+∣0.10−0.40∣=0.30+0.30=0.60. T = |0.70 - 0.40| + |0.10 - 0.40| = 0.30 + 0.30 = 0.60.
  2. 实际名义交易金额为:50,000×0.60=30,00050{,}000 \times 0.60 = 30{,}000 资金单位(买入 A 15,000 单位,卖出 B 15,000 单位)。

  3. 费率 k=10 bps=0.001k = 10\text{ bps} = 0.001。成本比例 c=0.001×0.60=0.0006=0.06%c = 0.001 \times 0.60 = 0.0006 = 0.06\%;成本金额 C=50,000×0.0006=30C = 50{,}000 \times 0.0006 = 30 资金单位。现金自身权重的再平衡(若有)不属于风险资产交易,不计入 TT。

1-N03 解答:

  1. 调仓交易总比例:T=∣0.60−0.50∣+∣0.20−0.30∣=0.10+0.10=0.20T = |0.60 - 0.50| + |0.20 - 0.30| = 0.10 + 0.10 = 0.20。
  2. 交易成本:费率 k=10 bps=0.001k = 10\text{ bps} = 0.001;成本比例 c=0.001×0.20=0.0002=0.02%c = 0.001 \times 0.20 = 0.0002 = 0.02\%;成本金额 C=100,000×0.0002=20C = 100{,}000 \times 0.0002 = 20 资金单位。
  3. 组合毛收益:Rpgross=0.60×0.02+0.20×(−0.01)+0.20×0.0=0.012−0.002=0.010=1.00%R_p^{\mathrm{gross}} = 0.60 \times 0.02 + 0.20 \times (-0.01) + 0.20 \times 0.0 = 0.012 - 0.002 = 0.010 = 1.00\%。
  4. 组合净收益:Rpnet=Rpgross−c=1.00%−0.02%=0.98%R_p^{\mathrm{net}} = R_p^{\mathrm{gross}} - c = 1.00\% - 0.02\% = 0.98\%。
  5. 期末净资产:V1=100,000×(1+0.0098)=100,980V_1 = 100{,}000 \times (1 + 0.0098) = 100{,}980 资金单位。
  6. 净 PnL:PnL=V1−V0=100,980−100,000=980\text{PnL} = V_1 - V_0 = 100{,}980 - 100{,}000 = 980 资金单位。
  7. 暴露指标:总风险敞口(Gross Exposure)=0.60+0.20=0.80= 0.60 + 0.20 = 0.80(80%80\%);净风险敞口(Net Exposure)=0.60+0.20=0.80= 0.60 + 0.20 = 0.80(80%80\%)。

1-B01 解答:A540股、B200股;实际交易14,000,费用14,现金25,986;成交后NAV99,986,期末NAV100,866,净PnL866,按初始NAV收益0.866%。价格损益880减费用14为866。目标尚有60股未成交,用600股会多计120的收益。各资产扣费后权重应用99,986作分母,三项金额和为该NAV。

编程参考解

1-P01:50bps=0.005,风险资产交易总比例0.2,成本0.001即0.1%;净收益0.009即0.9%。用第9节函数替换cost_rate=0.005,断言isclose(net, 0.009)。相同毛收益并不保证相同净收益。

1-P02:下面可独立运行。错误规则获得3%,历史规则空仓得到0;这个差异来自是否知道未来,不是错误规则更好的预测能力。

past_return = -0.02
next_return = 0.03
wrong_weight = float(next_return > 0.0)
correct_weight = float(past_return > 0.0)
wrong_pnl_fraction = wrong_weight * next_return
correct_pnl_fraction = correct_weight * next_return
assert wrong_pnl_fraction == 0.03
assert correct_pnl_fraction == 0.0
print(wrong_pnl_fraction, correct_pnl_fraction)

1-P03:用有时区对象比较真实时刻,不能比较日期字符串。下面只验证时间先后,不证明交易所那一时刻开放;第3章再引入日历。

from datetime import datetime, timezone

def check_trade_time(signal_time: datetime, trade_time: datetime) -> None:
    if signal_time.tzinfo is None or trade_time.tzinfo is None:
        raise ValueError("timezone required")
    if trade_time <= signal_time:
        raise ValueError("trade must follow signal")

signal = datetime(2026, 6, 1, 16, 5, tzinfo=timezone.utc)
wrong_trade = datetime(2026, 6, 1, 16, 0, tzinfo=timezone.utc)
try:
    check_trade_time(signal, wrong_trade)
except ValueError:
    pass
else:
    raise AssertionError("look-ahead timing was not rejected")
check_trade_time(signal, datetime(2026, 6, 2, 13, 30, tzinfo=timezone.utc))

日历和时刻为教学构造的UTC演示,不声明对应某证券的真实开盘。

1-N04 解答:第一,10bps应为10/10000=0.001;整数10把费率放大10,000倍。第二,目标权重不是实际持仓,计划交易量也不是成交量。全部未成交时持仓保持(0.5,0.3),本题实际交易量为0,费用为0。毛收益0.5×0.02+0.3×(−0.01)=0.007,净收益同为0.7%。修正为:

from math import isclose
held_weights = (0.5, 0.3)
returns = (0.02, -0.01)
actual_traded_fraction = 0.0
cost_rate = 10 / 10000.0
gross = sum(w * r for w, r in zip(held_weights, returns))
cost = actual_traded_fraction * cost_rate
net = gross - cost
assert isclose(gross, 0.007)
assert cost == 0.0
assert isclose(net, 0.007)
print(gross, cost, net)

本题只演示已给成交状态,不是撮合模型;真实系统还需记录拒单、未成交机会成本与其他可能费用。

挑战题参考与评分

1-C01:可接受协议写清经济逻辑、股票/行业样本、窗口端点、信号和收益区间、基准、成本、验证和搜索范围。反证可比较不同子样本或引入预先指定反转窗口,但对照也要事先记录。行业数据不足以支持逐股借券、冲击和全市场PIT结论。评分:时间与数据范围40%,可证伪假设/对照30%,验证与限制30%;不能按正收益评分。

1-C02:缺口包括成本何时扣、交易后的现金余额、权重与数量换算、未成交、分红/融资、交易间价格漂移。核账可用NAVt=CASHt+∑iqi,tPi,t−LIABtNAV_t=CASH_t+\sum_iq_{i,t}P_{i,t}-LIAB_t,其中CASH为现金,q为实际数量,P为估值价,LIAB为负债;外部净流入和交易现金流另记。每笔买卖的资产与现金变化必须成对记录,成本使净资产下降。评分:明确至少三项缺口50%,有维度一致的核账式和事件顺序50%。

1-N05 解答:最终收盘输入须先到达并处理,信号之后才能提交订单;同一收盘成交没有先后证据。今天的名单不能代表历史成员,需历史成员、退出和可交易状态。应补实际交易量、费率、价差/冲击/融资与成交记录,以及搜索过的方案、基准和样本外设计。高夏普本身既不证明真实净盈利,也不能证明经济规律不存在;目前只能说该回测不足以支持可执行结论。评分10分:时点3、证券池2、费用/试验证据3、结论范围2。

19. Further Reading

  • Must Know:Princeton ORFE官方课程概述,了解数学与应用的组织;SEC算法交易报告的定义与交易用途部分。
  • Should Know:MIT Finance Theory I课程概览,认识资产估值、投资与风险的主题。MIT OCW
  • Optional:阅读机构职位描述时,用本章工作对象比较责任;职位名称随机构不同,不能当统一资格标准。

20. References

  1. Princeton ORFE,Undergraduate Program。官方网页,2026-10-05读取课程核心概述。链接。来源键ORFE。
  2. SEC,Staff Report on Algorithmic Trading in U.S. Capital Markets,2020。官方PDF,读取算法决策用途;本章没有引用未验证统计数字。链接。来源键SEC_ALGO。
  3. Kenneth R. French,Detail for 10 Industry Portfolios。官方组合构造说明及下载数据;本章只解释数据适用范围。链接。来源键FRENCH_10。
  4. Kenneth R. French,Data Library。格式和历史计算修订说明。链接。来源键FRENCH。

搜索教材

输入关键词开始搜索。