个人理财规划分析 —— 带着Python玩金融(4)

刚刚大学毕业的你获得了一份满意的工作,接下来正雄心勃勃地规划着自己的未来。这其中自然少不了财富目标,比如怎样成为百万富翁呢?本文将带你用Python分析你的财务情况,以及怎样才能实现你的理财目标。

收入和支出

假如你工作的起薪是10万元,但是你需要交纳五险一金和个税,这部分大约占工资的30%。为了制定合理的预算方案,首先需要计算实际到手的工资。

# 设定年收入
salary = 100000

# 假设税率是30%
tax_rate = 0.30

# 计算税后收入
salary_after_taxes = salary * (1 - tax_rate)
print("税后年收入: " + str(round(salary_after_taxes, 2)))

# 计算每月的税后收入
monthly_takehome_salary = salary_after_taxes / 12
print("每月到手的收入: " + str(round(monthly_takehome_salary, 2)))
税后年收入: 70000.0
每月到手的收入: 5833.33

知道实际的收入后,我们再来看每月的开支,预算如下:

  • 房租:1500/月
  • 就餐:平均40/天,一月按30天计算
  • 娱乐:500/月
  • 未预见的开支:300/月

现在来计算每月的支出和结余。

# 每月的房租
monthly_rent = 1500
# 每月的就餐预算
monthly_food_budget = 40 * 30
# 每月的娱乐预算
monthly_entertainment_budget = 500
# 未预见的开支
monthly_unforeseen_expenses = 300

# 计算总的月度开支
monthly_expenses = monthly_rent + monthly_food_budget \
    + monthly_entertainment_budget + monthly_unforeseen_expenses
print("每月支出: " + str(round(monthly_expenses, 2)))

# 计算每月的结余
monthly_savings = monthly_takehome_salary - monthly_expenses
print("每月结余: " + str(round(monthly_savings, 2)))
每月支出: 3500
每月结余: 2333.33

你的收入和支出并不是一成不变的。随着工作经验的增长,一般你的工资也会上涨。假设工资以每年5%的速度稳定增长,预测未来15年的收入情况(为了简单起见,这里假设税率没变)。

注:下面使用的 np.cumprod()累积求积函数,以及年增长率到月增长率的换算说明,可参见上一篇文章《用Python分析房屋抵押贷款》

import numpy as np  # 导入numpy科学计算包
from matplotlib import pyplot as plt   # 导入绘图工具包
%config InlineBackend.figure_format = 'retina' # 设置图片清晰度
plt.rcParams['font.sans-serif']=['SimHei']  # 设置中文字体

# 预测未来15年的情况,并换算到月份
forecast_months = 12*15

# 设置工资的年增长率
annual_salary_growth = 0.05
# 换算成工资每月的增长率(注意是复利)
monthly_salary_growth = (1 + annual_salary_growth) ** (1/12) - 1

# 计算工资的累积增长
cumulative_salary_growth_forecast = np.cumprod(np.repeat(1 + monthly_salary_growth, forecast_months))
# 预测工资
salary_forecast = monthly_takehome_salary * cumulative_salary_growth_forecast

# 绘制工资随时间变化的曲线
plt.plot(salary_forecast, color='green')
plt.xlabel("月份")
plt.ylabel("每月收入")      
plt.show()

不仅工资会上涨,由于通货膨胀,你的开支也会上涨。假设开支的增长速度是每年2.5%,采用上面相同的方法来计算未来15年的开支情况。

# 设置年通货膨胀率
annual_inflation = 0.025
# 换算成每月的通胀率
monthly_inflation = (1 + annual_inflation) ** (1/12) - 1

# 预测累积的通胀
cumulative_inflation_forecast = np.cumprod(1 + np.repeat(monthly_inflation, forecast_months))
# 预测未来的开支
expenses_forecast = monthly_expenses * cumulative_inflation_forecast

# 绘制开支随时间变化的曲线
plt.plot(expenses_forecast, color='red')
plt.xlabel("月份")
plt.ylabel("月度支出") 
plt.show()

为了方便比较,将上两幅图中的收入和支出曲线绘制在一幅图中。幸运的是你的收入增长速度大于通货膨胀率,这意味着你每月将有更多的结余。

plt.plot(salary_forecast, color='green', label="每月收入")
plt.plot(expenses_forecast, color='red', label="每月支出")
plt.legend(loc=2)
plt.xlabel("月份")
plt.ylabel("金额")
plt.show()

储蓄和投资

在上一节中,我们预测了收入和支出随时间变化的情况,将每月的收入减去支出,便可算得每月积攒了多少钱。将每月的积蓄累加起来,就得到了总的积蓄。

注:下面使用的 np.cumsum() 函数进行累积求和,可参见上一篇文章《用Python分析房屋抵押贷款》

# 计算每月的积蓄
savings_forecast = salary_forecast - expenses_forecast

# 计算累积的积蓄
cumulative_savings = np.cumsum(savings_forecast)

# 输出15年后总的积蓄
final_net_worth = cumulative_savings[-1]
print("15年后总的积蓄为: " + str(round(final_net_worth, 2)) + "元")

# 绘制总积蓄随时间推移的曲线
plt.plot(cumulative_savings, color='blue')
plt.xlabel("月份")
plt.ylabel("累积的积蓄")
plt.show()
15年后总的积蓄为: 787802.65元

从上面的计算可知,即使你严格执行了预算计划,并且工资也保持稳定增长,在15年后你的积蓄才打到78万多,这离你百万富翁的目标还有一定的差距。这时光靠存钱还不够,还需要你来进行合理的投资。假如投资的年回报率是7%,那么每月需要投资多少钱才能在15年后使财富增长到100万呢?

numpy.pmt(rate, nper, pv) 函数用来计算每月投资额

  • rate:每月投资回报率
  • nper:总的投资期数
  • pv:现值,这里是0
  • fv:未来价值,这里是100万
# 设置年投资回报率为7%
investment_rate_annual = 0.07
# 换算成每月的投资回报率
investment_rate_monthly = (1 + investment_rate_annual) ** (1/12) -1 

# 为了获得100万,计算每月需要投资的金额
required_investment_monthly = -np.pmt(rate=investment_rate_monthly, \
                                      nper=forecast_months, pv=0, fv=1000000)
print("你需要连续15年每月投资 " 
      + str(round(required_investment_monthly, 2)) 
      + " 元才能达到100万。")
你需要连续15年每月投资 3214.35 元才能达到100万。

上面的计算告诉你每月需要投资三千多元才行,但是你一开始的积蓄只有两千多,负担不起这样的投资方案。

# 查看前5个月每月的积蓄
savings_forecast[:5]
array([ 2349.88962846,  2366.52789784,  2383.24850536,  2400.05181645,
        2416.9381981 ])

我们可以换一种投资方案,不是每月投资固定的额度,而是按你收入的一定比例来投资。这样虽然一开始投入的较少,但是随着收入的增长,投资额也会随之增长。下面将模拟这一投资方案,假设将结余50%的资金用于投资。

# 设置每月结余中用于投资的比例
monthly_investment_percentage = 0.5

# 计算每月投资额度
investment_deposit_forecast = savings_forecast * monthly_investment_percentage

# 剩余的进入储蓄账户
savings_forecast_new = savings_forecast * (1 - monthly_investment_percentage)

# 绘制每月储蓄和投资的累积额度
fig = plt.figure(figsize=(12,4.5)) #设置画布大小
p1 = fig.add_subplot(121)  # 添加第一个子图
plt.plot(investment_deposit_forecast, color='orange', label="投资")
plt.xlabel("月份")
plt.ylabel("每月的投资金额")
p2 = fig.add_subplot(122)  # 添加第二个子图
plt.plot(savings_forecast_new, color='blue', label="储蓄")
plt.xlabel("月份")
plt.ylabel("每月的储蓄金额")
plt.show()

上面这两幅图一模一样,因为你将结余的一半用来投资,另一半用来储蓄。下面让我们来计算这样的投资组合带来的资产净值。(为简单起见,这里假设投资的年回报是7%,而储蓄没有利息。)

# 设置投资、净值的初始数组(每个元素都为0,数组长度是12*15)
investment_portfolio = np.repeat(0., forecast_months)
net_worth = np.repeat(0., forecast_months)

# 计算累积的储蓄额
cumulative_savings_new = np.cumsum(savings_forecast_new)

# 循环计算每个月的投资和结余情况
for i in range(forecast_months):
    
    # 设置前一月投资的总金额
    # 如果是第一个月,则前一月投资总额为0
    if i == 0: 
        previous_investment = 0
    else:
        previous_investment = investment_portfolio[i-1]
        
    # 计算前一月的投资总额在当月的增长
    previous_investment_growth = previous_investment*(1 + investment_rate_monthly)
    
    # 将之前的投资总额加上当月的新增的投资额,等于当月的投资总数
    investment_portfolio[i] =  previous_investment_growth + investment_deposit_forecast[i]
    
    # 计算当月的净值,是累积储蓄存款额加上当月总的投资额
    net_worth[i] = cumulative_savings_new[i] + investment_portfolio[i]
         
# 绘制储蓄、投资、净值的随时间变化的曲线图
plt.plot(investment_portfolio, color='orange', label="投资")
plt.plot(cumulative_savings_new, color="blue", label="储蓄")
plt.plot(net_worth, color='green', label="净值")
plt.xlabel("月份")
plt.ylabel("金额")
plt.legend(loc=2)
plt.show()

我们来查看15年后总的净值:

print("15年后的净值:" + str(round(net_worth[-1],2)))
15年后的净值:1014978.67

按照上面的组合投资方法,即将一半的结余用于投资,另一半用于储蓄,那么15年后你将达到100万的目标。


注:本文是DataCamp课程Intro to Financial Concepts using Python的学习笔记。
更多该课程的笔记:

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,445评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,889评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,047评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,760评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,745评论 5 367
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,638评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,011评论 3 398
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,669评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,923评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,655评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,740评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,406评论 4 320
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,995评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,961评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,197评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,023评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,483评论 2 342