理財小程式動手寫!用Python Pandas預測人生財務曲線|【Python練習Day18】

這個練習來自<用 Python 理財:打造小資族選股策略>的第一個作業,利用Python Pandas預測人生財務曲線,我有把老師的Demo稍微修改順序,讓自己在使用上更順手。這篇同時會用到Pandas、函式、迴圈等等概念。

By.

min read

crop payroll clerk counting money while sitting at table

pexels-photo-4475523

Python 1

這個練習來自<用 Python 理財:打造小資族選股策略>的第一個作業:利用Python Pandas預測人生財務曲線,我有把老師的Demo稍微修改程式順序,讓自己在使用上更順手。

這篇同時會用到Pandas、函式、迴圈等等概念。

課程介紹:用 Python 理財:打造小資族選股策略

<用 Python 理財:打造小資族選股策略>是Hahow 好學校中,非常熱門的Python基礎課程,裡面除了Python的基礎教學、Pandas介紹、用法以外,還包含了許多小資族應該有的理財觀念。

老師是FinLab的韓承佑,有豐富的程式經驗,教學深入淺出,用詞白話,很適合初學者。

預測人生財務曲線小程式

這個小程式的用途,可以讓使用者輸入基本的財務資料後,去計算在人生階段中,有無投資、有無買房後,劃出個人的人生財物曲線。

雖然一直都知道「複利」的強大,但自己親手把程式寫出來、一步一步計算,並且畫出財務曲線後,發現落差真的好大,加強了對於理財的急迫心。

如果對於Python沒有興趣,只是想要跑跑看自己的人生財務曲線,可以點下面的連結,裡面有我寫好的練習檔,可以直接取用。

練習檔:Day18(1/11)利用Python Pandas預測個人財務曲線

使用方法

  1. 打開練習檔
  2. 輸入右手邊的初始化資料左邊有備註可以參考
  3. 選擇選單上方的「執行階段],下拉後選擇「全部執行」。
用 Python 理財:打造小資族選股策略 - 線上教學課程 - Hahow 好學校
用 Python 理財:打造小資族選股策略 – 線上教學課程 – Hahow 好學校

執行結果

按下執行後,程式會開始連線、並且依據執行程式片段,最後拉到底下就可以看到曲線圖和90歲時的金額了。

image 13


練習:Python Pandas預測人生財務曲線

程式解構

這個練習影片我重複看了兩次,一次是用通勤時間,先用「看」的方式,理解老師在影片內的邏輯,第二次才跟著打,難易度不高,但需要一點細心。

另外因為中文要一直換輸入法,我把變數名稱都改成英文了。

  1. 計算每年的淨值:月薪扣掉每月開銷*12
  2. 加總後可以得到「未買房、未投資」的人生財務結果
  3. 計算有投資的情況:將淨值按照投資比例、預估投資報酬率,複利加總
  4. 買房:計算買房成本、利息
  5. 房租:買房前的房租總和(房租*12*買房前的年數)
  6. 計算買房後持續投資的情況:用同樣的函式,把買房後的淨額做投資複利計算

初始資料設定

這裡模擬一個29歲,工作大約五年的青年,薪水65K、房租10K、日常開銷25K,並以存到100萬當頭期款,希望30歲買房為背景。

計算每年拿淨值6成做投資,投報5%,60歲退休,並且活到90歲來計算。

#初始資料(單位/萬)
start_m = 100  #初始化資金
monthly=6.5 #月薪
cost=2.5    #每月花費(不含房租,吃喝)
rent=1  #房租
rest_age=60   #退休年齡
time=range(29,90,1) #@param #觀測29-90歲

#投資資料
inv_p=0.6 #@param #投資占比
inv_year=1.05 #@param  #投資年利率

#買房資料
house_total=880 #@param  #房子總價
house_down= 100 #@param  #頭期款
buyhouse_age=30 #@param  #買房年紀
house_int=1.31#@param   #利率
house_year=30 #@param  #貸款年

未買房、未投資情況

算出每年的財產淨額[薪水-開銷]。

year_m=pd.Series(0,index=time)
year_m.iloc[0]=start_m #第一個數字放入初始資金
year_m.loc[:rest_age]+=monthly*12
year_m-=(cost+rent)*12

這裡可以看到,每年的淨額在29歲時,有初始化的存款,接著每年的淨值都相同,但是到60歲(退休後)會變成負的,因為沒有收入了!開銷變成吃老本。

image 14
#無投資總資產
no_house_m=year_m.cumsum()
no_house_m.plot()

因此,在沒有投資、沒有買房的情況下,人生的財務曲線如下,雖然30-60歲不斷成長(不停儲蓄,這裡忽略活存利率),但60歲開始消耗存款。

image 15

未買房、有投資情況

計算投資,這邊老師用了一個函式,包含複利的計算和迴圈,將結果一個一個傳回。

def compound_inv(arr,inv_p,inv_year):
  ret=[arr.iloc[0]] #定義一開始的餘額(第一年)起始金額+年淨額
  for v in arr[1:]: #從第一年開始取數字,到結束
    ret.append(ret[-1]*inv_p*inv_year+ret[-1]*(1-inv_p)+v) #迴圈加總(淨值*投資比例*)
  return pd.Series(ret,time)  

int_m=compound_inv(year_m,inv_p,inv_year) 
int_m.plot() #有投資無房的情況
no_house_m.plot() #無投資總資產

結果就是,30-60歲開始投資,人生財務會穩定按照複利的斜率成長,到了60歲後,沒有工作薪資收入,但投資獲利仍可以支付開銷、並且還有淨額繼續投資(錢滾錢的概念)。

image 16

有買房、沒投資情況

接著,來到買房的部分。

再沒有富爸爸幫助下,用已存的100萬當頭期款,剩下的款項用青年成家方案(利率1.31%)計算、貸款30年,購買新北市的總價880萬的中古屋。

首先先計算買房的花費,建立一個Series,放入每年房貸金額,第一年會付出頭期款100萬(所以線最高),接著是每年的房貸(房貸除以貸款年限)。

#計算買房花費(不含利息)
house_cost=pd.Series(0,index=time) #建立一個欄Series,放每年的房貸費用(本金)
house_cost[buyhouse_age]=house_down
house_cost.loc[buyhouse_age:(buyhouse_age+house_year)]+=((house_total-house_down)/house_year) #從買房年開始,到貸款繳完年紀;放入總價/貸款年
house_cost.plot()
image 20

接著計算實際的借款餘額,並且用這個餘額去計算每年需要支付的利息(因為利息會越來越少)。

need_pay=pd.Series(0,index=time) #建立一個欄Series來放實際欠款
need_pay[buyhouse_age]=house_total #從買房年紀開始,背房貸
need_pay=need_pay.cumsum()#計算欠款
need_pay=need_pay-house_cost.cumsum() #依序扣掉每年貸款
need_pay.plot() #房貸月來越少
#print(need_pay)

#計算利息
houseint=need_pay.shift().fillna(0)*house_int/100
houseint.plot(secondary_y=True) #每月利息也越來越少
image 21

因為接下來要計算買房後的每月淨額,因此扣掉買房前繳交給房東的房租,並在買房後的年紀中,都放上0。

#計算要繳給房東大大的房租
rent_year=pd.Series(rent*12,index=time)
rent_year.loc[buyhouse_age:]=0 #買房後都是0

因此,有買房、但沒投資情況下,個人財務曲下會如下圖,買房前有初始資金100萬,接著付出頭期款、開始繳房貸、同時增加淨額,到了60歲退休後,開始花過去存款,在80歲前就會把老本花光。

image-17

有買房、有投資情況

想要買房,又不想老了負債的話,就要開始並期投資。

這部分只要把剛剛買房後的淨額,放入前面寫的投資函式(compound_inv)去計算就可以了。

buyhoues_with_inv=compound_inv(buyhouse_year_m,inv_p,inv_year)

在同樣拿出淨額60%、年報酬率0.5情況下,雖然存款不如沒有買房上升的快(可支配投資金額較少),但退休後仍可以維持生活、人生到盡頭仍有一筆存款在。

image 18

將四條線同時印出

int_m.plot(color='red') #純投資
buyhoues_with_inv.plot(color='green') #有房有投資
buyhouse_year_m.cumsum().plot(color='black') #有房沒投資
no_house_m.plot(color='blue') #沒房沒投資

print("所有淨額拿去投資,90歲時:",round(int_m.loc[89],2),"萬元")
print("買房,剩下的錢投資,90歲時:",round(buyhoues_with_inv.loc[89],2),"萬元")
print("買房,但不投資,90歲時:",round(buyhouse_year_m.cumsum()[89],2),"萬元")
print("沒買房,也不投資,90歲時:",round(no_house_m[89],2),"萬元")

把四條人生曲線都印出,並且用不同顏色標記,另外同時也用字串顯示在不同情況下,90歲時的存款。

執行結果

所有淨額拿去投資,90歲時: 3144.11 萬元
買房,剩下的錢投資,90歲時: 913.98 萬元
買房,但不投資,90歲時: -278.28 萬元
沒買房,也不投資,90歲時: 34.0 萬元
image 19

感想

這個財務曲線,是在沒有意外、沒有外力因素,而且自律(存款和投資)的情況下,利用Python內的計算功能和Pandas的可視化工具,預測出模型簡單的人生曲線。

當然,人生上會有大大小小波折,各種的意外和驚喜,這個預測曲線可能不準確,但展現出來的都是要我們趕緊投資,不要想看複利的力量。

本次練習檔與課程

練習檔:Day18(1/11)利用Python Pandas預測個人財務曲線
課程:用 Python 理財:打造小資族選股策略

【Python新手練習】相關文章

【Python新手練習】系列文,是一個行銷人學習Python的筆記,希望可以藉由練習程式,訓練更強大的邏輯思考,如果你也對這塊有興趣,這些文章或許可以幫助到你!也歡迎一起交流。

行銷人的Python練習90計畫-為什麼要學Python?
Day0:Google Colab新手Python開發環境推薦
Day1:Python變數與資料型態
Day2:Python判斷式與迴圈(流程控制)
Day3:Python函式 定義、呼叫與回傳
Day4:載入Python模組與使用
Day5:Python檔案讀取和儲存
Day6:Python亂數與統計
Day7:Python API 開放資料串接,抓取台北市政府公開資料
Day8:Python實體物件建立與使用
Day9:Python爬蟲實戰!抓取PTT電影版

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *