持仓与信号分析
当天持仓分析及交易建议
组合静态 ER
每日ER面板数据
>持仓口径净值
持仓口径累计收益率
组合规模
组合风险暴露
持仓口径回撤
组合各周期表现
每日持仓热力图
策略约束
关键业务口径说明>
本页面沿用旧主线回测看板展示结构;底层收益率、ER 和目标持仓来自 NSS 独立实验链路。
NSS拟合批次:nss_residual_interp_curve__nss_fit_20260610_054018_809327_step03_hold03_anchorstepIRS方法:当前生产口径:30Y 国债剔除活跃券IRS方法实验批次:irs_30y_auto_method2_20260610_054221NSS拟合审计页面:/Users/shin/bond_lab/BondIRSQuantExplorer/data/runs/20260610_053005_openclaw_multi_portfolio_service/nss_residual_interp_curve_openclaw_multi_portfolio_service/nss_residual_interp_curve_outputs/nss_fit_audit_step03_hold03_20260610_055232/NSS曲线拟合审计(残差修正).html期限步长:3个月ER持有期:3个月静态ER资金成本:IRS_3M + 15.0BP残差修正久期约束:平均久期 <= 5.0 年信号日是产生目标持仓和 ER 的日期,通常使用该日收盘后已经入库的正式参数和行情数据。记账日是收益归属日期,一行动态回测表示从信号日持有到记账日这一段区间。
自然计息天数 = 记账日 - 信号日
遇到周末、节假日或长假时,一行可能覆盖多个自然日;票息、骑乘和 FTP 资金成本都按这段自然天数折算。
页面和审计 Excel 按同一条计算链组织:先用行情和模型参数得到单标的底层字段,再拆出 Carry、骑乘、价格变动、凸性和资金成本,随后按本期持仓汇总为组合收益,最后连乘得到净值、年化和回撤。
行情/参数 -> 单标的底层字段 -> 单标的 realized 收益拆分 -> 持仓金额贡献 -> 组合每日汇总 -> 净值/年化/回撤
审计 Excel 中,外部行情、优化器输出和 Python/HTML 输出结果保留为值;凡是能由导出字段复刻 Python 逻辑的派生列,都尽量写成 Excel 公式,并用差异列核对。Python/HTML 输出指 Python 动态回测已经算出、并同时写入 HTML 页面路径的数据,不是 Excel 再次计算出来的列。
原始输入列 = 值;派生计算列 = Excel公式;Python/HTML输出列 = 值;差异列 = Excel公式
当前回测结果按组合名称展示:T组合-1Y 对应原全组合,A组合-1Y 对应原政府债组合,H组合-1Y 对应原政金债+AAA中票组合。名称里的 -1Y 表示同类资产之间相邻期限差为 1 年,也对应当前曲线精度为 1Y。
T组合-1Y = 农发债 + 国开债 + 国债 + 地方债 + AAA中短票 + AA+中短票 + 二级资本债AAA- + 二级资本债AA+
A组合-1Y = 国债 + 地方债
H组合-1Y = 农发债 + 国开债 + AAA中短票
FTP前不扣 FR007 资金成本,FTP后固定扣除数据库中的 FR007 资金利率,不叠加信号安全垫加点。当前年化审计按 0 交易成本口径展开,不再单列交易成本。
FTP后收益 = FTP前收益 - FTP资金成本
这个关系在每日金额层面严格成立;因为页面的净值和年化收益率是复利或年化展示,所以不能直接把周期年化收益率相减后简单等同于 FR007。
组合各周期表现会单独展示“持仓加权FTP”,它按周期内实际持仓规模和自然计息天数加权,更适合用来核对动态 FTP 是否等于 FR007。
持仓加权FTP年化 = ΣFTP资金成本(亿) / Σ[ABS(汇总规模(亿)) × 自然计息天数 / 365] × 100
页面顶部净值、累计收益率、回撤,以及“组合各周期表现”里的净值、累计收益率、年化收益率和最大回撤,统一使用持仓口径。持仓口径的分母是当日本期实际持仓规模。
持仓口径每日收益率_FTP前 = 组合收益_FTP前 / 当日本期实际持仓规模
持仓口径每日收益率_FTP后 = 组合收益_FTP后 / 当日本期实际持仓规模
持仓口径净值 = 上一日持仓口径净值 × (1 + 持仓口径每日收益率)
持仓口径累计收益率 = 持仓口径净值 - 1
鼠标提示里的年化收益率是“截至该点”的持仓口径年化收益率。它不使用有效交易行数,而是使用从图表起点累计到该点的自然计息天数;完整自然年周期使用该年实际天数,闰年为 366 天,其他周期使用 365 天。
截至当日持仓口径年化收益率 = 截至当日持仓口径净值 ^ (年化基准天数 / 累计自然计息天数) - 1
累计收益金额本身以“亿”为单位展示;收益率、净值、年化和回撤统一使用持仓口径。
每日动态持仓收益由本期实际持仓产生,下期目标持仓只用于下一段持有。HTML 里的“本期持仓”是用于计算本行收益的持仓,“下期目标”是信号求解出来准备调仓后的持仓。
Carry_realized(%) = (持有YTM - 年化FTP资金成本率) × 自然计息天数 / 年化天数
骑乘_realized(%) = RollDown年化(%) × 自然计息天数 / 年化天数
实际价格变动收益(%) = - 久期 × 原始收益率变动BP / 100
凸性_realized(%) = 0.5 × 原始凸性 × (原始收益率变动BP / 10000)^2 × 100
FTP资金成本率(%) = 年化FTP资金成本率 × 自然计息天数 / 年化天数
单标的 FTP后 realized 收益率 = Carry + 骑乘 + 实际价格变动收益 + 凸性
单标的 FTP前 realized 收益率 = 单标的 FTP后 realized 收益率 + FTP资金成本率
当日收益(亿) = 原始本期持仓(亿) × 标的 realized 收益率 / 100
组合收益_FTP前 = Σ 单标的收益贡献_FTP前
组合收益_FTP后 = Σ 单标的收益贡献_FTP后
FTP资金成本率来自数据库中的 FR007 曲线,按信号日到记账日之间的自然计息天数折算。若未来重新启用交易成本,应在收益贡献之外单独列示。
当前组合层使用方案 A 代表券现金流修正久期。代表券面值 100,年付息,票息取信号日持有 YTM;RollDown 仍沿用旧版近似,用买入节点与滚降后节点的平均修正久期映射价格收益。
P = Σ PV(CF_t)
Macaulay久期 = Σ[t × PV(CF_t)] / P
修正久期 = Macaulay久期 / (1 + 持有YTM / 100)
滚降目标期限 = max(持有期限 - 1, 0)
滚降目标修正久期 = 滚降目标代表券现金流修正久期
T = 1Y 时,RollDown年化(%) = 0
T > 1Y 时,RollDown年化(%) = (持有YTM - 滚降目标YTM) × 0.5 × (持有节点修正久期 + 滚降目标修正久期)
这个 RollDown 年化值随后按自然计息天数折算成当期骑乘收益。若未来改为完整现金流 RollDown,本段公式和审计 Excel 的底层字段也需要同步升级。
原始凸性来自 Python 的节点扰动法。模型假设平价债,票息等于当前 YTM,按年付息计算价格,再用 10BP 上下扰动做二阶差分。
shock = 10BP = 0.001
P0 = 当前YTM下的债券价格
P+ = 当前YTM + shock 下的债券价格
P- = 当前YTM - shock 下的债券价格
债券价格 = Σ[每期票息 / (1 + y)^t] + 本金 / (1 + y)^T
原始凸性 = (P+ + P- - 2 × P0) / (P0 × shock^2)
凸性收益(%) = 0.5 × 原始凸性 × (收益率变动BP / 10000)^2 × 100
这里的凸性是收益率变动的二阶价格项,和上面的“实际价格变动收益”一阶久期项一起进入单标的 FTP 后 realized 收益率。
动态 FTP 资金成本使用信号日 FR007,不叠加静态 ER 信号安全垫。先得到年化资金成本,再按信号日到记账日的自然计息天数折算。
年化FTP资金成本率(%) = FR007(%)
FTP资金成本率(%) = 年化FTP资金成本率(%) × 自然计息天数 / 年化天数
Carry_realized(%) = (持有YTM(%) - 年化FTP资金成本率(%)) × 自然计息天数 / 年化天数
FTP资金成本贡献(亿) = 原始本期持仓(亿) × FTP资金成本率(%) / 100
因此 FTP 前后在金额上的差异就是资金成本贡献;在年化收益率上还会受到持仓规模、净值连乘和自然计息天数的影响。
组合层先按逐标的贡献金额加总,再与 Python/HTML 输出组合收益做差异核对。审计 Excel 的每日汇总也按这个逻辑从“年度逐标的明细”跨表汇总。
汇总规模(亿) = Σ 原始本期持仓(亿)
组合DV01(万/BP) = ROUND(Σ[原始本期持仓 × 原始DV01/亿面值] × 10000, 0)
组合CS01(万/BP) = ROUND(Σ[原始本期持仓 × 原始CS01/亿面值] × 10000, 0)
FTP后收益合计(亿) = Carry贡献 + 骑乘贡献 + 价格变动贡献 + 凸性贡献
FTP前收益合计(亿) = FTP后收益合计 + FTP资金成本贡献
差异 = Python/HTML输出值 - Excel公式推导值
审计 Excel 的每日汇总会同步核对组合规模、组合 DV01、组合 CS01、持仓净值和截至当日年化收益率;年化收益率差异以 BP 展示,便于直接定位页面展示与公式推导是否一致。净值核对保留两条链:底层推导链从逐标的收益拆分反推每日收益率,主要用于暴露拆分口径差异;Python/HTML输出收益链用 Excel 公式按“Python/HTML输出组合收益 / 公式汇总规模”推导每日持仓收益率,再连乘净值,专门核对输出组合收益能否复刻页面净值和年化收益率,正常差异应为 0。年化差异依赖净值差异;如果对应净值差异已通过并置 0,年化差异也同步置 0,避免年初短累计天数放大小数尾差。
每日持仓热力图只给本期有持仓的格子填色,无持仓格子留白。有持仓时色块深浅使用 PER,而不是持仓金额。
PER = 信号日 ER / 标的久期
正值使用当前橙色系,越大越深;负值使用绿色系,越负越深;正负分别在有持仓样本中按历史极值归一化。鼠标悬浮单元格时会同时展示本期持仓、下期目标、久期和 PER。
组合静态 ER 折线使用静态组合画像全样本数据,横轴为日期,左外轴展示执行后组合静态 ER、原始信号组合静态 ER 及近一年 ER 分位,左内轴展示 PER,右轴展示组合久期。点击持仓热力图日期时,静态 ER 图会用虚竖线标出该行对应的信号日。
组合静态 ER(%) = Σ[静态目标持仓(亿) × 标的 ER] / 静态组合规模 × 100
组合久期 = Σ[静态目标持仓(亿) × 标的久期] / 静态组合规模
组合PER = 组合静态 ER(%) / 组合久期
PER 本质上是收益率强度口径,但数值尺度通常小于组合静态 ER,所以用左内轴单独刻度;组合久期是期限敏感度口径,单独放右轴并使用整数年刻度。图顶标注左外轴、左内轴和右轴的口径及单位,刻度线只显示数值。浅色虚线为截至当日最近一年窗口内原始信号组合静态 ER 的滚动分位数;没有原始信号字段时回退到执行后组合静态 ER,按从低到高展示 ER 10%分位(近1年)、ER 30%分位(近1年)、ER 50%分位(近1年)、ER 70%分位(近1年)、ER 90%分位(近1年)。
分周期动态核对 sheet 中,持仓口径用于看实际占用本金的收益和资金成本,分母是当日本期实际持仓规模。
组合收益率_持仓口径_FTP前 = 组合收益_FTP前 / 当日本期实际持仓规模
组合收益率_持仓口径_FTP后 = 组合收益_FTP后 / 当日本期实际持仓规模
持仓口径当日年化收益率 = 组合收益率_持仓口径 × 年化基准天数 / 自然计息天数
持仓口径FTP年化 = 持仓口径FTP前年化 - 持仓口径FTP后年化
持仓口径 FTP 年化等于当日持仓加权后的 FR007 资金成本年化;如果当日没有持仓,则该口径没有业务含义。
HTML 顶部回撤图和各周期标题里的最大回撤,均使用持仓口径 FTP 后净值计算。回撤衡量的是净值从历史高点跌下来的幅度。各周期标题会在最大回撤后展示对应日期;各周期的“持仓口径净值 / 回撤”图会把回撤作为右轴折线展示,右轴按 -1%、-1.5%、-2% 这类 0.5 个百分点档位向下扩展,图例可点击隐藏或显示。
历史最高净值_t = max(起点至 t 日的持仓口径净值_FTP后)
当日回撤_t = 持仓口径净值_FTP后_t / 历史最高净值_t - 1
最大回撤 = min(当日回撤_t)
例子:历史最高持仓口径净值为 1.0800,后来回落到 1.0200,则当日回撤为:
1.0200 / 1.0800 - 1 = -5.56%
持仓口径回撤改大,并不代表收益金额变差;原因是分母从“组合总规模上限”变成“当日本期实际持仓规模”。当组合没有满仓时,同样的亏损金额除以更小的实际持仓规模,持仓口径净值波动会更大,回撤也会更大。
FTP 前和 FTP 后的差额就是资金成本。资金成本按本期持仓、FR007 和自然计息天数计算。
FTP资金成本(亿) = 本期持仓(亿) × FR007 × 自然计息天数 / 365
例子:本期持仓 1000 亿,FR007 为 1.60%,自然计息天数 1 天,FTP 前组合收益 0.10 亿。
FTP资金成本 = 1000 × 1.60% × 1 / 365 = 0.0438 亿
FTP后组合收益 = 0.10 - 0.0438 = 0.0562 亿
持仓口径FTP拖累年化 = 0.0438 / 1000 × 365 = 1.60%
这就是为什么持仓口径 FTP 年化可以直接对上 FR007。
Excel 里的动态持仓路径新增“持仓口径净值/累计收益率/年化收益率/回撤”字段,用于核对 HTML 全样本主图;分周期动态核对 sheet 新增“持仓口径周期净值/累计收益率/年化收益率/回撤”字段,用于核对 HTML 的各周期图。
持仓口径周期年化收益率 = 持仓口径周期净值 ^ (年化基准天数 / 周期累计自然计息天数) - 1
因此同一个记账日,在全样本主图和某个分周期图里看到的“截至当日年化收益率”可以不同,这是因为起点、累计自然计息天数和周期内净值起算点不同。
HTML 页面不嵌入年度审计明细,也不提供前端导出按钮,避免常规策略看板过大;命令行显式开启审计后,会在 HTML 同级目录下生成“审计”文件夹,并自动写出带 BP 标识的审计 Excel。Excel 内包含“年度每日汇总”和“年度逐标的明细”。逐标的明细负责复刻单标的收益拆分,每日汇总负责跨表汇总并和 Python/HTML 输出的收益、净值、年化收益率、组合规模、DV01、CS01 做差异核对。每日汇总中的“底层推导”列用于看逐标的拆分能否解释页面结果,“Python/HTML输出收益链”列用于用输出组合收益和公式汇总规模复刻净值,后者的净值和年化差异正常应为 0。两个 sheet 底部均追加审计说明,逐列列示核对逻辑和通过标准。
年度逐标的明细:底层字段 -> 单标的收益率 -> 单标的贡献金额 -> 单标的差异核对
年度每日汇总:逐标的贡献汇总 -> FTP前后收益 -> 持仓收益率 -> 净值连乘 -> 年化收益率 -> HTML差异核对
当前导出中,RollDown年化和原始凸性仍作为上游模型中间值列示;页面本节给出其 Python 计算口径,便于判断这些上游中间值的业务含义。若要把这两项也在审计 Excel 中完全展开,需要继续导出滚降目标 YTM、滚降目标久期、以及凸性扰动价格 P0/P+/P-。
如果最新信号日已有数据但还没有下一期已实现收益,页面会生成前瞻记账展示行,只用于查看 ER、目标持仓和交易建议。
前瞻记账行收益贡献为空,不进入净值、累计收益和回撤曲线
这样可以在早上看到最新信号对应的交易建议,同时避免把尚未发生的收益误认为历史已实现收益。