FAQ#

如果你已经跑过 快速开始库快速上手,但还有一些反复出现的实践问题,可以直接查这一页。

如果你现在的问题只是想查精确接口名和签名,请改看 API 参考

我应该先从 API 参考读起吗?#

通常不建议。

如果你是新用户,更推荐的顺序是:

  1. 安装与环境

  2. 快速开始

  3. BCW2011 案例总览

之后再回到 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 是正确行为。

为什么 d2v[-1] 在 BCW 里这么重要?#

因为 BCW 的 payout-side super-contact 条件,在数值上就是通过右端曲率来实现的。

所以在 BCW 示例里,d2v[-1] 接近零是最强的成功信号之一。

为什么低现金状态下投资会是负的?#

因为融资摩擦在困境状态最严重。对 BCW 来说,低现金区域负投资在经济上是有含义的,不是天然的 bug。

为什么 hedging 示例里 psi 会落在 -50#

因为 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 一份,只先改:

  1. 参数名和参数值;

  2. 策略公式;

  3. HJB 残差;

而保留类结构和诊断工作流不变。

我怎么知道结果“已经够接近了”?#

请优先看范围和形状,而不是死盯某一个精确点值。

对 BCW 而言,更重要的问题是:

  • v 是否随 s 上升?

  • dv[-1] 是否接近预期斜率?

  • d2v[-1] 是否接近零?

  • 策略是否表现出预期的左尾和右尾行为?

相关页面#