第 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)是特定时点、币种和报价单位下的数值;成交价、买方报价、卖方报价与估值价各有用途,不能互换。持有数量
收益(Return)把财富变化除以起始财富,便于比较不同投入。无现金流、数量不变时,100元变102元:先算增加2元,再算
多头(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
箭头表示输入依赖,而不是“完成一遍就必然赚钱”。九个环节环环相扣:
- Idea(投资想法):基于经济机制(如信息粘性或风险补偿)提出的可证伪假说。
- Data(数据):按时点可用信息(Point-in-Time, PIT)契约整理、带时间戳与单位的结构化行情与基本面记录。
- Signal(信号):在决策时点
仅利用已知特征生成的方向或排序评分。 - Forecast(预测):将信号映射为下一期收益分布的条件估计值。
- Portfolio(目标权重):在资金预算、风险上限和换手约束下求解出的期望持仓比例。
- Execution(执行与成交):生成订单,在交易所完成撮合,记录实际成交量价与时间。
- PnL(损益):根据生效持仓与实际价格/现金流核算出的货币盈亏与无量纲收益。
- Risk(风险):检查组合的因子暴露、尾部损失预算与极端情景压力。
- Evaluation(评价):对比基准、扣减摩擦成本、检验统计与经济显著性,并记录实验版本。
你每次根据评价改变设计,都在增加研究自由度;应登记新版本,并保留之前的结果。
4. 数学基础
组合的一个持有区间收益,在不换仓且现金流口径正确时为
例如,你把60%资金配置给收益2%的资产,把20%配置给收益−1%的资产,其余20%留现金且现金收益为零,那么组合毛收益是1%。每项权重的分母都是同一个起始净资产值(Net Asset Value, NAV),所以才能直接相加。
毛收益(Gross Return)减去交易与资金成本,得到净收益(Net Return)。本章采用简化的区间成本比例
成本在区间初始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个月累计收益 | 形成区间结束后可计算,无量纲 | |
| Signal 信号 | 同日历史收益的百分位排名 | 使用当日可得股票池,通常范围0–1 | |
| Forecast 预测 | 对下一月收益的条件估计 | 在t产生,预测区间为t到t+1,小数收益 | |
| Target Weight 目标权重 | 再平衡希望达到的资本分配 | 风险/成本约束后的决策,无量纲 | |
| Order 订单 | 要求买入或卖出的指令,可含数量、限价和有效条件 | 订单编号及提交参数 | 提交时记录;尚未成交,不能据此记为持仓 |
| Fill 成交 | 订单实际执行的部分或全部数量、价格和时点 | 成交记录;部分成交可多次出现 | |
| Position 持仓 | 实际成交后累积持有的数量 | 成交后数量=成交前数量+本次成交数量 | 每个成交时点按实际成交更新,份或合约数 |
| Exposure 暴露 | 对资产/行业/因子的规模或敏感度 | 权重、金额或 |
指明资金口径或风险模型 |
| PnL 损益 | 持仓和现金产生的价值变化 | 终值−初值−外部净流入 | 有币种和收益区间 |
6. 推导
6.1 从资金到收益
初始资本为
两边除以
6.2 从交易量到成本
设再平衡前权重为
6.3 Alpha与Beta的解释范围
单市场回归可写为
这是对回归对象的介绍,不是此处对资本资产定价模型(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是本例给定的资本规则,未声称从这两个预测唯一推导出最优配置。
- Idea(想法):假设两只风险资产 A 与 B 存在宏观行业需求分化,前期景气度高的资产在下期存在信息传导粘性与短期惯性。
- Data(数据):前期决策点
,获取已入库的资产收盘价与前期收益,保证 available_at 与 ingested_at 均不晚于决策时刻。 - Signal(信号):根据前期收益生成横截面强弱信号:A 相对强势(信号为
),B 相对弱势(信号为 )。 - Forecast(预测):人为指定教学映射
,得到下一持有期收益预测A为1.5%、B为0.5%,现金为0%。常数的单位是每持有期小数收益;这条映射没有拟合或市场证据,排序本身没有收益单位,后面的实际2%与−1%是另外给定的结果。 - Portfolio(目标权重):在本例只做多、另留现金的约定下,决定再平衡目标权重:
, ,留存现金权重 。 - Execution(执行):
- 调仓前持仓权重为
, ,现金 ;初始 NAV 为 资金单位。 - 调仓前A500股、B300股、现金20,000;按D2每股100的价格,订单买A100股、卖B100股,买卖各10,000资金单位。构造假设全部成交,实际数量变为A600股、B200股。单位是股和货币,不把“买10,000单位”混作股数。
- 在收益区间开始时完成成交(Fill),买卖合计不折半的风险资产交易总比例为
(交易金额 20,000 资金单位)。 - 实际持仓生效:
, , 。
- 调仓前持仓权重为
- PnL(损益计算):
- 持有期结束,实现收益:A 为
,B 为 ,现金收益为 。 - 毛收益:
,即 。 - 交易成本:费率为每单位风险资产交易名义金额 10 bps(
)。成本金额为 资金单位,占初始 NAV 的 。 - 净收益:
。 - 期末 NAV:
资金单位。 - 净损益:
资金单位。
- 持有期结束,实现收益:A 为
- Risk(风险检查):
- 风险资产总暴露(Gross Exposure)
;净暴露(Net Exposure) ;现金缓冲 。 - 评估集中度:资产 A 占比 60%,若A单独下跌10%、B和现金不变,毛收益为0.6×(−0.10)=−6%;这是构造压力情景,不是发生概率估计。
- 风险资产总暴露(Gross Exposure)
- Evaluation(研究评价):
- 同期给定的50% A/50% B零现金基准毛收益为0.5%,策略毛差为0.5个百分点;基准费用未给出,不能称净差。一期观察不能检验均值显著性;若未来市场费率上升至 50 bps(成本达
),净收益将压缩至 。实验记录冻结,保留参数设置,防止未来反复调试造成过拟合。
- 同期给定的50% A/50% B零现金基准毛收益为0.5%,策略毛差为0.5个百分点;基准费用未给出,不能称净差。一期观察不能检验均值显著性;若未来市场费率上升至 50 bps(成本达
本例假定成交在收益区间开始时按约定价格完成、没有额外冲击或外部资金流、成本按初始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%,忽略成本时组合收益为
错误三:成本费率的单位多乘或少乘100
10bps是
错误四:看到回归Alpha就宣布有优势
一项回归的截距取决于模型、样本、频率、风险因子与估计误差。你还要核查多重检验(Multiple Testing)、成本与样本外。统计显著性(Statistical Significance)与经济显著性(Economic Significance)分开讨论。
错误五:系统每次都给同样结果,所以研究可靠
程序可复现只证明同输入同程序得到同输出。错误数据、未来信息、遗漏退市或错误公式也能被稳定复现。你需要输入有效性和实验设计的检验。
13. Quant Research Application
把初始动量想法写成一个最小研究协议:
- 经济假设:信息反应可能分步发生;过去相对强势与未来收益可能相关。这是待检验解释,不是已证明机制。
- 样本:先用真实行业组合练习方法;如果转向逐股策略,重新核验PIT股票池、价格现金流和借券。
- 形成区间:写出每个信号用了哪些月份、是否跳过最近月。第25章精确讲12-1动量。
- 决策与成交:历史数据截至t可得;交易在t后的可执行时点;收益端点与成交一致。
- 对照:比较等权或指定基准,避免只给最佳策略图。
- 实验冻结:在最终样本外之前确定窗口、权重、成本和评价项,保存所有试验。
- 评价与限制:报告毛/净收益、风险、暴露、换手、失效窗口、统计不确定性与无法验证的成交假设。
你没有学完回归和回测引擎,也能先练习写研究问题与数据契约。复杂工具等到它解决具体问题时再加入。
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 的期初持有权重为
- 风险资产买卖合计、不折半的名义交易总比例
; - 实际交易产生的总名义金额(货币单位);
- 应扣除的交易成本金额与成本比例。现金自身权重是否参与交易比例计算?
1-N03(完整演算):某教学策略初始净资产
- 调仓前持仓权重:A 资产
,B 资产 ,现金 。 - 调仓后生效权重:A 资产
,B 资产 ,现金 。 - 实现收益:A 资产
,B 资产 ,现金收益 。 - 费率:每单位风险资产交易金额 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:
1-E06:
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 解答:
-
风险资产名义交易总比例(不折半):
-
实际名义交易金额为:
资金单位(买入 A 15,000 单位,卖出 B 15,000 单位)。 -
费率
。成本比例 ;成本金额 资金单位。现金自身权重的再平衡(若有)不属于风险资产交易,不计入 。
1-N03 解答:
- 调仓交易总比例:
。 - 交易成本:费率
;成本比例 ;成本金额 资金单位。 - 组合毛收益:
。 - 组合净收益:
。 - 期末净资产:
资金单位。 - 净 PnL:
资金单位。 - 暴露指标:总风险敞口(Gross Exposure)
( );净风险敞口(Net Exposure) ( )。
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:缺口包括成本何时扣、交易后的现金余额、权重与数量换算、未成交、分红/融资、交易间价格漂移。核账可用
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
- Princeton ORFE,Undergraduate Program。官方网页,2026-10-05读取课程核心概述。链接。来源键ORFE。
- SEC,Staff Report on Algorithmic Trading in U.S. Capital Markets,2020。官方PDF,读取算法决策用途;本章没有引用未验证统计数字。链接。来源键SEC_ALGO。
- Kenneth R. French,Detail for 10 Industry Portfolios。官方组合构造说明及下载数据;本章只解释数据适用范围。链接。来源键FRENCH_10。
- Kenneth R. French,Data Library。格式和历史计算修订说明。链接。来源键FRENCH。