FAQ#
如果你已经跑过 快速开始 或 库快速上手,但还有一些反复出现的实践问题,可以直接查这一页。
如果你现在的问题只是想查精确接口名和签名,请改看 API 参考。
我应该先从 API 参考读起吗?#
通常不建议。
如果你是新用户,更推荐的顺序是:
之后再回到 API 参考 查具体名字和签名。
为什么文档要把 BCW 放在主线位置?#
因为 BCW 同时提供了:
一个完整的一维 HJB 例子;
内生边界搜索;
可解释的策略函数;
从一个控制变量扩展到多个控制变量的自然过渡。
比起一开始只看抽象接口,BCW 更适合研究者和学生真正学会“怎么用”。
为什么 Policy 类必须实现 initialize(grid, p)?#
因为求解器在迭代开始前,必须先知道:
有哪些策略键;
每个策略数组应该长什么样。
即便你使用 policy_guess=False,求解器仍然需要一个完整的策略容器。
什么情况下该用 @explicit_policy?#
当策略更新可以直接、稳定地写成显式公式时。
典型场景:
你已经有闭式策略表达式。
什么情况下该用 @implicit_policy?#
当策略最自然的数学表达是一个残差或根问题时。
典型场景:
一阶条件更适合写成
FOC(...) = 0。
为什么 policy_guess 会显著影响收敛?#
因为它改变了迭代起点。
初值猜得好,往往更快;
初值很差,甚至可能把迭代带进坏区域。
这也是 BCW 示例要认真构造初始策略的原因。
什么时候该用 solve()?#
当边界已经固定,而且你想先得到最干净、最简单的 base solve 时。
这通常也应该是你改新模型时最先使用的工作流。
什么时候该用 boundary_update()?#
当模型实现了 update_boundary(grid),并且当前解可以直接推出新的边界时。
如果没实现这个方法,boundary_update() 报 NotImplementedError 是正确行为。
什么时候该用 boundary_search()?#
当某个边界不是事先给定,而是要通过一个数值条件决定时。
BCW liquidation 的典型例子就是:
搜索
s_max;检查
d2v[-1];直到右边界接触条件成立。
为什么 d2v[-1] 在 BCW 里这么重要?#
因为 BCW 的 payout-side super-contact 条件,在数值上就是通过右端曲率来实现的。
所以在 BCW 示例里,d2v[-1] 接近零是最强的成功信号之一。
为什么低现金状态下投资会是负的?#
因为融资摩擦在困境状态最严重。对 BCW 来说,低现金区域负投资在经济上是有含义的,不是天然的 bug。
为什么 hedging 示例里 psi 会落在 -5 到 0?#
因为 benchmark 校准里 pi = 5,代码又把对冲策略裁剪在 BCW 允许的区间内。
可以这样理解:
-5表示最大强度的对冲,0表示不对冲。
网格点数 number 应该设多少?#
先从一个中等、稳定的值开始,等模型行为已经合理后,再逐步提高。
BCW 示例脚本常用 number=1000 做高分辨率运行,但你的最佳取值取决于:
曲率大小;
方程刚性;
运行时间预算;
策略区域是否尖锐。
为什么不应该一开始就做 sensitivity analysis?#
因为 continuation 是建立在重复求解之上的。如果 base solve 有问题,sensitivity 只会批量制造有问题的结果。
为什么 grid.aux 有时会报错?#
因为 auxiliary(grid) 是可选钩子。如果模型没有实现它,grid.aux 就会抛 NotImplementedError。
最安全的第一个自定义项目应该怎么做?#
从 liquidation 示例 fork 一份,只先改:
参数名和参数值;
策略公式;
HJB 残差;
而保留类结构和诊断工作流不变。
我怎么知道结果“已经够接近了”?#
请优先看范围和形状,而不是死盯某一个精确点值。
对 BCW 而言,更重要的问题是:
v是否随s上升?dv[-1]是否接近预期斜率?d2v[-1]是否接近零?策略是否表现出预期的左尾和右尾行为?
相关页面#
想学怎么读输出:看 结果与诊断
想学接口:看 建模指南
想选工作流:看 求解器指南
想开始迁移自己的模型:看 把 BCW 改成你自己的模型