財富自由之雜記

經濟日報有一篇文章, 已經爬到 “財富自由" 這個關鍵字的第一名了 [1]. 乍看之下很有道理. 它說明了財富自由有很多個層次. 不過這篇文章的 “財富方程式" 採用的富人公式不太科學! 害我想多嘴兩句. 它的公式是這樣:

個人應該有的淨資產=(年齡 X 稅前年所得)/10

如果你的淨資產大於這個數字, 就有成為富翁的潛力. 如果 “實際資產大於該數字兩倍,屬於「超優理財族」,代表有望成為下個富翁。" 顯然, 對剛畢業賺錢的 24 歲畢業生. 它的資產不可能達到不吃不喝年齡的 24/10 = 2.4 倍.

不過假設某人跳槽後, 年所得暴增. 這個公式會反映出: 他已經從有發財潛力墮落到了走上貧困之路. 例如 30 歲時年薪 70 萬, 應有資產標準是 210 萬. 這個人也達到了. 接著他在 31 歲跳槽到一份年薪 100 萬的工作, 因此他的應有資產標準升高到 310 萬. 相當於跳槽後那年不吃不喝, 加上逃漏稅才能繼續達標 (210+100 = 310).

鼓勵大家提高儲蓄率當然很好. 但我認為只看收入和凈資產是不夠的, 拿自己的資產跟收入比較, 那頂多是反映出儲蓄比例夠高的人, 比較可能致富. 這跟財富自由還是有明顯的差異. 我認為的財富自由是, 在我們退休後, 開銷都不變甚至變高的情況下, 資產還可以支撐到 120 歲這種不太可能突破的年紀, 那就是財富自由了.

要知道能否達到這個目標, 難免有些估計的成分. 既然知道估計可能不準, 所以我們需要加一些容錯量. 首先, 我們要計算出一年平均需要多少開銷, 並計算它的標準差. 我計算平均開銷的方法是把薪水扣掉國家拿走的錢 (稅與費)、投資用掉的錢、給老婆小孩的錢之後, 剩下的就是必要的開銷. 而不是特別正面表列, 像是記帳. 反正退休之後, 上面那幾筆應該都不用支出了.

至於變異數、標準差方面, 如果未來還會換房換車, 最好前述的數據就統計到前一次換房換車. 又或者有人說老了要請看護, 投資會虧損, … 凡此種種, 都可以用標準差來涵蓋, 一倍不夠就兩倍, 兩倍不夠就三倍. 抓得準不準應該超出科學的範疇. 萬一中樂透呢! 誰知道.

理論講完來講數據. 我們儘量回溯後 (比方說 10 年), 可以統計以下幾種數據: 每年開銷 m, 開銷的標準差 s. 我們可以用 M = a*m, S = c*s 來做調整.

奢侈倍數 a, 表示可以比過去再多幾倍的錢. 預設為 1 (M = a * m = m).

標準差倍數 c, 用來吸收投資損失或重大開銷的風險. 預設也為 1 (S = c * s = s).

另外需要估計幾個重要的參數: 通膨率 f(%), 投資報酬率 i(%). 過去有人會簡化地把 i – f 當作扣除通膨的投資報酬率. 我認為不合理. 假設有一個人買了兩套房, 但每天除了吃滷肉飯加蛋之外, 幾乎不花別的錢. 後來萬物齊漲, 蛋價翻了 10 倍, 請問他的身價是下跌還是上漲? 萬物齊漲的話, 房價不漲嗎? 房租不漲嗎? 所以我認為單純把 i 和 f 相減, 過度地簡化了模型, 後面的推導也可以證明此點.

接著開始計算, 再第 Y 年賺了錢退休, 然後把錢拿去投資的狀況:

Y+1 年收入項: N*(1+i), 支出項 (M+S)*(1+f). 次年的總收入為本年度的收入減支出

Y+2 年收入項: (N*(1+i) – (M+S)*(1+f)) * (1+i), 支出項 (M+S)*(1+f)^2

Y+3 年收入項: ((N*(1+i) – (M+S)*(1+f)) * (1+i) – (M+S)*(1+f)^2)* (1+i), 支出項 (M+S)*(1+f)^3 … 依此類推

你以為我要導公式嗎? 並沒有, 我數學不好. 我早就打算好要 ChatGPT 幫我歸納, 然後我再來 debug . 可惜這 GPT 老兄剛開始答得很不錯, 再問它, 它就心虛換解法了. 所以我只截到示意圖, 內容有點錯. 不過沒關係. 本來就是叫它幫我打草稿.

檢查後發現 sum 應該是 k = 1~n, 不是 k = 0 ~ n-1. 而且公式顯然可以簡化. 所以我不改公式, 直接改程式就好. 由 ChatGPT 給的算式得知, (1+f)k*(1+i)-k和 (1+f-i)-k 是不同的概念. 所以消費少, 儲蓄多時, 通膨幾乎不影響投資報酬的累積. 相對地, 如果消費多, 儲蓄少的話, 那就投資再厲害也可能會破產.

搭配 ChatGPT 喜歡的 Python, 我們就可以跑一些程式. 假設某人投資淨值 1,000 萬, 投資報酬率 6%, 通膨 3%, 每年平均開銷 100 萬, 標準差 100 萬. 像是買車這種幾年一見的高消費, 會大量拉高標準差. 所以這個數字不會太小. 不是什麼 2, 3 萬的等級.

根據以上的那組數字, 在 0 倍標準差下, 這個人能撐 12 年才破產. 若每年發生 1 倍標準差, 這樣只能撐 6 年. 因此資產 1,000 萬的人, 就算有不錯的投資, 也不適合每年花 100 萬 (有點像是廢話).

反觀若有 1 億元,在 3 倍標準差下, 會在第 46 年破產. 在 2 倍標準差下, 還可以撐到第 146 年. 這表示賺太多或是花太少. 但沒有人會嫌錢多, 前面提到可以用 M = am 來計算. m 是現在的開銷, a 是可以奢侈的倍數.

那麼每年不要只花 100 萬, 改為每年固定花 365.25 萬 (a = 3.6525), 平均一天花一萬! 真的這樣花錢的話, 在 0 個標準差下, 可以再活個 55 年. 在 1 倍標準差下, 只能再活 34 年. 不過要是考慮到 2 個標準差就只能再活 25 年, 然後就要把房子逆抵押當下流老人了, QQ

N = 1000
i = 0.06
a = 1
m = 100
c = 1
s = 200
f = 0.03

n = 1
while N >= sum((a*m+c*s)*(1+f)**k*(1+i)**(-k) for k in range(1,n)):
    n += 1

print(n)

所以說呢, 其實我們可以很容易估計出: 在已知投資金額, 平均開銷, 預估風險和可奢侈倍數下, 還可以安全地活多久. 如果這個 N 大到可以讓程式永遠跑不出 loop, 那不是賺太多就是花太少, 或許這個人出了點問題 – 不會花錢 [2]. 假設把自己的參數放進去計算, 慢慢把 a 和 c 放大, 拉高 f, 壓低 i, 讓 n + 現在年齡 > 120. 那就表示找到自己的生存之道. 調不出滿意的數字, 那就繼續上班. 很簡單~

[Ref]

  1. https://money.udn.com/money/story/12040/6495460
  2. 綠角: 你很可能會這樣花錢1

AI 搶飯碗!

本來今天打算整理一篇以前的讀書心得, 不過 AI 搶軟體工程師飯碗這件事對我還滿有衝擊的, 所以特別紀錄一下.

今天是十天連假的收假日, 不小心打開很久沒玩的數獨 (Sudoku), 發現竟然有對戰模式, 可以跟外國真人對戰! 這個比寶可夢的對戰刺激多了, 所以我馬上跟配對的老印、老法、老德殺起來! 前幾戰的對手超弱, 但後面的對手滿強的, 幾乎是分秒必爭. 稍微分心一點點就輸了. 畢竟我好久沒玩了, 反應慢很多, 只得到 16 勝 8 敗就想趕快休息. 不然萬一心臟負荷不了猝死就划不來了. 這樣以後人家問起老爸的死因, 女兒只能說死於某一波寒流這樣塘塞過去.

(對了, 此遊戲選台灣會變成中國的一部分, 所以我推薦女兒玩, 結果她選冰島籍).

接著我發現電腦的 ChatGPT 窗口還沒關, 順便就問它, “can you resolve a sudoku?", 然後奇妙的事情發生了. 我知道 ChatGPT 會寫程式, 但我只是隨 “口" 問問, 它就把程式寫好了. 看來不只是可以幫我們交訓練課程的心得報告而已. 連我們以後上機考試要更嚴格防弊了….哈!

Yes, a sudoku can be resolved using algorithms such as backtracking, constraint propagation, and search. Here’s an example of a simple backtracking solution in Python:

哇! 架構都出來了! 稍微把那多餘的 return 拿掉, 加個 class 的殼, 程式就能用了. 不求任何優化, 只要把題目的 array 輸進去, 答案立馬出來.

這有什麼啟示呢? 我想大理工時代將要隨著 AI 的興起而沒落了. 基本上, 現在電資的學生不分良窳, 幾乎都比文組有職場競爭力. 不過 AI 的程式都寫得比人類又好又快了, 那自然也就不需要這麼多就業人口了. 雖然文組可能會丟掉飯碗 – AI 當小編, AI 寫文案, AI 寫專欄, ….. 不過近年風光無限的理工同學, 真的要當心 AI 寫程式、畫 layout 這些變化. 基本上這都還算是初階. 等到它會分析 bug, 連資深同仁的工作可能都不保了. 至於 PM, …可能可以再撐一陣子, 但是前途也是堪慮. 所以…人脈很重要, 這個 AI 取代不了~~~哈!

自製 mini ChatGPT

根據 [1], 決定自製一個 mini ChatGPT. Afiz 的流程如下:

首先在 Anaconda 中 pip install openai 就失敗, 原來要用 conda install -c conda-forge openai [2].

pip install gradio 沒問題

from config open_api_key 一看就不合用! 看 [2] 裡面的說明, 要先參加 OpenAI會員. 這個我已經註冊過了. 登入後, 可以在 https://beta.openai.com/account/api-keys 產生 key. 然後把 key 設為環境變數 %OPENAI_API_KEY%.

後面照抄 [4], 可是出現 check internet connection. 暫時卡住.

這要怎麼 debug 呢? 因為是抄的, 所以有點不明就裡. 乾脆來問 ChatGPT 本人要怎麼呼叫它? 然後它就大方地給我一個 sample code. 這感覺就是 “玄 “!

import os
import openai

openai.api_key = os.getenv("OPENAI_API_KEY")
response = openai.Completion.create(
    model="text-davinci-003",
    prompt="The following is a conversation with an AI assistant. The assistant is helpful, creative, clever, and very friendly.\n\nHuman: Hello, who are you?\nAI: I am an AI created by OpenAI. How can I help you today?\nHuman: I'd like to cancel my subscription.\nAI:",

    temperature=0.9,
    max_tokens=150,
    top_p=1,
    frequency_penalty=0.0,
    presence_penalty=0.6,
    stop=[" Human:", " AI:"]
)

不過, 這段程式還是有個相容性問題. 它說 Anacoda 裡面有段 source code 開檔預設是 latin-1, 不是 UTF-8. 這…這我 debug 不了啊? 查一下午資料, 都說要改 mysql database 那邊的設定.

UnicodeEncodeError: 'latin-1' codec can't encode character '\u201c' in position 7: ordinal not in range(256)

好在我到處 Google 找到了另外一篇中文教學 [5], 它的範例不會打到上面那個 bug. 所以狗哥不用怕, 裁員一次就好, ChatGPT 暫時還不能把你幹掉. 仔細比較兩個程式, 目前認為還是 export private key 沒有成功, 所以暫時用明碼才能夠連線的關係. 這樣總算在過年假期當中, 把 OpenAI 的探索前進了一小步! 現在它可以講笑話了, 雖然要等 2~3 秒.

[REF]

  1. https://twitter.com/itsafiz/status/1610245691812741120
  2. https://anaconda.org/conda-forge/openai
  3. https://help.openai.com/en/articles/5112595-best-practices-for-api-key-safety
  4. https://github.com/afizs/chatgpt-clone/blob/main/mini_ChatGPT.ipynb
  5. https://steam.oxxostudio.tw/category/python/example/openai.html