方案管理器(Base / Bull / Bear)
何时使用
当模型需要在一小组假设的驱动下,在 Base、Bull 和 Bear 案例之间清晰切换,并且希望每个案例都在一个工作表上可见且可审计时使用。此技能在 Claude 应用程序中从头构建一个可下载的 .xlsx 文件(使用 openpyxl 和数据验证),包含一个实时选择器、公式驱动的假设拉取、一个对比表以及一个重新计算与验证步骤。它不是“Claude for Excel”插件。
它将构建什么
五个区域:一个 Cover(封面)标签页(选择器和摘要)、一个 Scenario Inputs(场景输入)标签页(每个驱动因素在 Base、Bull、Bear 下的值)、进入模型的实时链接(使假设拉取当前激活的案例)、一个 Outputs(输出)对比标签页(所有三个案例的关键结果并排显示)、以及一个 Checks(检查)标签页。
构建工作流
- 列出在不同案例间有差异的驱动因素(例如增长、价格、流失率、资本支出),并在模型中找到每个驱动因素的假设单元格。
- 构建
Scenario Inputs模块,其中包含每个驱动因素的 Base、Bull、Bear 值。 - 构建一个单一的选择器单元格(值为 1、2 或 3),并附带数据验证下拉菜单。
- 重写每个模型假设单元格,使其通过引用选择器的 CHOOSE 或 INDEX 公式来拉取当前激活的案例。
- 构建
Outputs标签页,并排比较所有三个案例的关键结果(并行计算,见规范),这样无论选择器如何设置,所有案例都能同时显示。 - 添加
Checks标签页。 - 在真实的引擎(无头 LibreOffice)中重新计算工作簿。
- 验证零公式错误(#REF!、#DIV/0!、#VALUE!、#NAME?),确认检查通过,然后交付 .xlsx 文件。
逐标签页规范
Cover 标签页
B2:选择器单元格。应用数据验证列表1,2,3(或映射到 1/2/3 的命名列表 Base, Bull, Bear)。B3:激活案例名称,=CHOOSE(B2,"Base","Bull","Bear")。- 一个小的结果摘要,读取当前激活案例下的实时模型输出,例如
B6 =Model!B40。
Scenario Inputs 标签页
每行一个驱动因素,每列一个案例:
A驱动因素名称,BBase,CBull,DBear(全为蓝色输入),E激活值(黑色公式)。- 激活值使用选择器拉取。使用 CHOOSE:
E5 =CHOOSE(Cover!$B$2,B5,C5,D5)。 - 等效的 INDEX 方式:
E5 =INDEX(B5:D5,Cover!$B$2)。当案例数量可能增长时,INDEX 更简洁;对于固定的三个案例,CHOOSE 读取更明确。 - 将选择的一种公式向下复制到每个驱动因素行,以确保列内公式一致。
进入模型的链接
- 每个模型假设单元格指向相应的激活值,例如
Model!B6 =ScenarioInputs!E5。 - 切勿让模型持有一个应由场景控制的键入假设;值必须按以下路径流动:选择器 -> 激活列 -> 模型。
- 保持链接使用绿色的跨标签页引用颜色,以便审查者看到假设是被驱动的,而非手动键入的。
Outputs 标签页(并排对比)
同时显示每个案例,而不仅仅是当前激活的案例。两种健壮的模式:
- 并行计算(推荐,便于审计):将少数输出公式复制三次,每次都直接使用 Base、Bull 或 Bear 列的数据,而不是激活列。例如,Bull 下的 NPV 使用
ScenarioInputs!C5:C12而非E列重新计算输出链。这样无需触碰选择器即可显示所有三个案例。 - 逐个读取:如果模型很大,请记录比较单元格如何通过依次将选择器设置为 1、2、3 并在重新计算步骤中粘贴每个捕获的值来捕获每个案例的实时输出;清楚注明哪些单元格是捕获的快照,哪些是实时的。
- 布局:行 = 关键指标(收入、EBIT、NPV、IRR),列 = Base、Bull、Bear,以及 Bull 减 Base 和 Bear 减 Base 的差值列。
Checks 标签页
- 选择器在范围内:
=AND(Cover!B2>=1,Cover!B2<=3,Cover!B2=INT(Cover!B2))结果为 TRUE。 - 每个驱动因素的三个案例都已填充:
=COUNTBLANK(ScenarioInputs!B5:D12)=0结果为 TRUE。 - 激活列匹配选择器:对于一个示例驱动因素,
=(ScenarioInputs!E5=CHOOSE(Cover!B2,ScenarioInputs!B5,ScenarioInputs!C5,ScenarioInputs!D5))结果为 TRUE。
openpyxl 构建说明
- 使用
openpyxl.worksheet.datavalidation.DataValidation(type="list", formula1='"1,2,3"')添加下拉菜单,然后ws.add_data_validation(dv)并dv.add(ws["B2"])。 - 将每个激活值和链接单元格写为公式字符串,绝不写为已解析的案例数字;数值只在重新计算后才会出现。
- 如果在下拉菜单中使用命名案例,请保留一个隐藏的映射,以便选择器仍然解析为整数供 CHOOSE/INDEX 使用;在选择器中混用文本和索引会破坏公式。
- 为选择器单元格填充独特的背景色并添加粗边框,以便审查者立即看到这个单一的控制单元格。
方向合理性检查
- Bull 案例不应在主要指标上产生比 Base 案例更差的结果,Bear 案例不应优于 Base 案例;如果出现这种情况,那么某个驱动因素在不同案例下的值很可能在列间放错了位置。
- 在
Outputs标签页添加一个可选的非正式检查,将每个差值的符号与预期方向进行比较,这样在重新计算时就能发现交换的列,而不是等到审查时才发现。
公式和格式约定
- 使用蓝色字体表示 Base/Bull/Bear 的输入值和选择器单元格。
- 使用黑色字体表示标签页内的公式(激活值列的 CHOOSE/INDEX 函数、输出计算)。
- 使用绿色字体表示跨标签页链接,例如模型中的
=ScenarioInputs!E5。 - 在应有公式的地方不使用硬编码:激活列和模型假设始终是公式,而不是重新键入的案例值。
- 每行或每列使用一个一致的公式:激活列使用相同的 CHOOSE/INDEX 模式;对比列使用相同的输出公式。
- 数字格式:比率
0.0%,货币#,##0,倍数0.00x。用填充色高亮显示选择器单元格,使其易于找到和切换。
与内置“方案管理器”的权衡
Excel 内置的“方案管理器”将案例值存储在对话框中,在工作表上不可见,在显示时会覆盖实时输入,并且容易与模型不同步。而一个可见的切换模块将每个案例保留在网格上,使激活值的拉取成为一个可追踪的公式,并允许审查者并排查看所有三个结果,无需打开任何菜单。它更易于审计,并且能够承受复制、审查和版本控制。
检查
参见上文的 Checks 标签页:选择器值在 1..3 之间且为整数,没有空白案例单元格,激活值等于选择器对应的案例值。所有三项检查必须返回 TRUE。
重新计算并验证
使用 openpyxl 保存,无头重新计算(例如 libreoffice --headless --convert-to xlsx),以便解析 CHOOSE/INDEX 和跨工作表链接。重新加载,扫描 #REF!、#DIV/0!、#VALUE!、#NAME? 错误。将选择器切换到 1、2、3,确认输出随之变化,并且每个设置下的激活值检查都通过。修正并循环,直到无误,然后交付。
需要收集的输入
- 模型的路径以及每个驱动因素的假设单元格地址。
- 每个驱动因素的 Base、Bull 和 Bear 值。
- 需要比较的关键输出指标及其单元格。
- 对比方式应为并行计算(实时)还是捕获快照。
示例
假设驱动因素:收入增长率(Base 4%、Bull 8%、Bear 1%),毛利率(Base 55%、Bull 58%、Bear 50%)。选择器 Cover!B2 = 2 选择 Bull,因此 ScenarioInputs!E5 =CHOOSE(2,4%,8%,1%) = 8% 流入 Model!B6。Outputs 标签页显示 NPV(假设单位)为:Base 760、Bull 1,140、Bear 410,并带有 Bull 减 Base 的差值 380,所有结果同时可见。