3. 模型构建
投资回报模型是项目组合管控治理会议的核心决策工具。本节将分别演示基于 Excel(适合快速原型与业务用户)和 Python(适合批量处理与版本控制)两种方式搭建基础计算框架,确保参数调优有可靠的数据底座。
3.1 模型核心指标与计算逻辑
无论使用何种工具,基础投资回报模型均需覆盖以下五个核心指标。治理会议中,这些指标将作为参数调优的输入与输出锚点。
| 指标名称 | 缩写 | 计算公式 | 治理会议用途 |
|---|---|---|---|
| 净现值 | NPV | ∑(CFt / (1+r)t) - 初始投资 | 判断项目是否创造价值(NPV > 0) |
| 内部收益率 | IRR | 使 NPV = 0 的折现率 r | 比较项目回报率与资本成本 |
| 投资回收期 | Payback | 累计现金流回正所需年数 | 评估资金占用风险与流动性 |
| 盈利指数 | PI | NPV / 初始投资 | 资源受限时排序项目优先级 |
| 折现回收期 | DPP | 累计折现现金流回正所需年数 | 考虑时间价值后的回收风险 |
治理会议提示: 在PMO评审中,NPV和IRR通常作为“准入指标”,Payback和DPP作为“排序指标”,PI则用于“资源冲突时的取舍依据”。参数调优时,应优先调整影响NPV和IRR的敏感变量。
3.2 Excel 基础模型搭建(快速原型法)
Excel 模型适合治理会议前的快速试算与现场假设调整。以下为推荐的结构化布局与关键公式。
3.2.1 工作表结构
- 输入区:初始投资、折现率、项目周期、各年预期现金流。
- 计算区:折现因子、折现现金流、累计现金流、累计折现现金流。
- 输出区:NPV、IRR、Payback、DPP、PI。
- 敏感性区:单变量/双变量数据表(用于后续参数调优章节)。
3.2.2 关键公式示例
假设:
B2 = 初始投资(-1000)
B3 = 折现率(10%)
B5:B14 = 第1至10年现金流
计算折现因子(C5单元格):
= 1 / (1 + $B$3) ^ A5
计算折现现金流(D5单元格):
= B5 * C5
计算NPV(E2单元格):
= NPV($B$3, B5:B14) + B2
计算IRR(E3单元格):
= IRR(B2:B14)
计算投资回收期(E4单元格,数组公式):
= INDEX(A5:A14, MATCH(TRUE, SUMPRODUCT(--(A5:A14>0), B5:B14)>=0, 0))
Excel 建模避坑: 使用 NPV 函数时,注意 Excel 的 NPV 是从第1期开始折现,初始投资(第0期)需单独加回。IRR 函数需要现金流序列中至少包含一个正值和一个负值,否则返回 #NUM! 错误。
3.3 Python 基础模型搭建(可复用的工程化方案)
当项目组合超过20个、或需要频繁进行蒙特卡洛模拟时,Python 模型更具优势。以下为基于 numpy 和 pandas 的核心实现。
3.3.1 核心函数定义
import numpy as np
import pandas as pd
def calculate_roi_metrics(cash_flows, discount_rate=0.10):
"""
计算投资回报核心指标
:param cash_flows: list/array,第0期为初始投资(负值)
:param discount_rate: float,折现率
:return: dict,包含NPV, IRR, Payback, DPP, PI
"""
cf = np.array(cash_flows, dtype=float)
n_periods = len(cf) - 1 # 第0期不计入收益期
# NPV
t = np.arange(1, n_periods + 1)
discounted_cf = cf[1:] / (1 + discount_rate) ** t
npv = discounted_cf.sum() + cf[0]
# IRR(使用numpy金融函数)
irr = np.irr(cf)
# 投资回收期(静态)
cumulative = np.cumsum(cf)
payback = None
for i in range(1, len(cumulative)):
if cumulative[i] >= 0:
payback = i + (0 - cumulative[i-1]) / cf[i]
break
# 折现回收期
discounted_cumulative = np.cumsum(np.concatenate(([cf[0]], discounted_cf)))
dpp = None
for i in range(1, len(discounted_cumulative)):
if discounted_cumulative[i] >= 0:
dpp = i + (0 - discounted_cumulative[i-1]) / discounted_cf[i-1]
break
# 盈利指数
pi = (npv - cf[0]) / abs(cf[0]) if cf[0] != 0 else None
return {
'NPV': round(npv, 2),
'IRR': round(irr, 4),
'Payback_Years': round(payback, 2) if payback else None,
'DPP_Years': round(dpp, 2) if dpp else None,
'PI': round(pi, 2) if pi else None
}
# 示例调用
project_a = [-1000, 200, 300, 400, 500, 600]
result = calculate_roi_metrics(project_a, discount_rate=0.10)
print(result)
3.3.2 批量项目组合计算
# 假设有5个项目,现金流矩阵
portfolio_cf = {
'项目A': [-1000, 200, 300, 400, 500, 600],
'项目B': [-800, 150, 250, 350, 450, 0],
'项目C': [-1200, 100, 200, 300, 400, 800],
'项目D': [-500, 100, 200, 200, 200, 100],
'项目E': [-2000, 500, 600, 700, 800, 900]
}
results_df = pd.DataFrame({
name: calculate_roi_metrics(cf)
for name, cf in portfolio_cf.items()
}).T
print(results_df)
Python 建模注意事项:
1.
np.irr 在 numpy 1.24+ 中已标记为弃用,建议使用 numpy_financial 库或 scipy.optimize 自定义 IRR 求解。
2. 现金流序列必须包含第0期(初始投资),且至少有一个正现金流和一个负现金流。
3. 对于跨周期不一致的项目(如不同生命周期),需先进行周期对齐或使用等效年金法。
3.4 模型框架对比与治理会议适配
以下 SVG 图展示了 Excel 与 Python 两种模型在项目组合管控治理会议中的定位与数据流转关系。
3.5 模型验证与治理会议准入标准
模型构建完成后,需通过以下验证清单方可进入治理会议参数调优环节:
- 逻辑验证:手动计算一组简单现金流(如投资100,每年回收50,周期3年),对比模型输出结果。
- 边界测试:折现率为0时,NPV应等于累计现金流;折现率极大时,NPV应趋近于初始投资。
- 一致性检查:Excel 与 Python 模型对同一组数据输出差异应小于0.01%(浮点误差范围内)。
- 敏感性合理性:调整单一参数(如收入下降10%),NPV 变化方向与幅度应符合业务直觉。
PMO 管控要点: 建议在治理会议资料包中同时附上 Excel 原型模型(.xlsx)和 Python 模型输出报告(.pdf),确保决策层可追溯、可复核。模型版本号应纳入会议纪要,作为参数调优的基线。