如何对资本应用递减率并估算2050年前各公司未来资本值
计算至2050年的公司未来资本值(按分段侵蚀率折现)
我拥有10家公司,其资本会随时间侵蚀或完全不受侵蚀,侵蚀率可能随时间段变化(例如第一种情况:2030年及之前侵蚀率为-2%,之后至2050年为-5%)。希望新增列计算至2050年的未来资本值,按不同递减率折现。
解决方案
核心是编写一个自定义函数处理三种侵蚀率场景,再通过apply映射到DataFrame的每一行,得出2050年的资本值。
步骤1:编写资本计算函数
这个函数会根据不同的侵蚀规则,逐段计算资本变化:
def calculate_future_capital(current_cap, erosion_rules): # 无侵蚀情况:资本保持原值 if pd.isna(erosion_rules): return current_cap current_year = 2021 cap = current_cap # 遍历每一段侵蚀规则 for rate, end_year in erosion_rules: years = end_year - current_year if years <= 0: continue # 跳过已过期的时间段 # 按复利计算当前时间段的资本变化 cap = cap * (1 + rate) ** years current_year = end_year if current_year >= 2050: break # 已到目标年份,提前终止计算 return cap
步骤2:将函数应用到DataFrame
把函数作用到每一行,新增Capital 2050列:
import pandas as pd import numpy as np # 定义侵蚀率规则 erossion1 = [ (-0.02, 2030), (-0.05, 2050) ] erossion2 = [ (-0.02, 2050) ] erossion3 = np.nan # 生成测试数据 data = { 'Decrease Rate': [erossion1 for _ in range(5)] + [erossion2 for _ in range(3)] + [np.nan] + [np.nan], 'Capital 2021': np.random.rand(10)*1000 } test = pd.DataFrame(data) # 新增计算列 test['Capital 2050'] = test.apply(lambda row: calculate_future_capital(row['Capital 2021'], row['Decrease Rate']), axis=1) print(test)
关键说明
- 分段计算时,以上一段的结束年份作为下一段的起始年份,确保时间连续;
- 加入过期时间段判断,避免无效计算;
- 到达2050年时提前终止循环,提升运行效率。
内容的提问来源于stack exchange,提问作者Filippo Sebastio
相关产品推荐
相关产品推荐

