2024 年重點回顧

雖然這件事應該是昨天以前要做的, 即使我遲交了, 還是值得做個結語.

  1. 年初學了如何用 Python 處理 Excel 表格, 這個工作上用來統計 task weighting 很方便.
  2. 考慮未來是 AI 的時代, 整年到處上課和看展, 最辛苦的是拿到一張 TensorFlow Developer 證書. 畢竟老人只能說一嘴好 AI 的話, 那就沒有啥說服力。
  3. 考慮到數據中心很重要, 我想知道它跟 AI 是什麼關係?於是做了點研究, 還拿了一張 Google Cloud 的Machine Leaning Engineer 證書.

4. 至於最花錢的課莫過於這個. 在 Amazon Skill builder 一個月花了 905.21 美金. 其實只跑了兩個 model. 因為菜鳥不懂得用完要下線, 下一個月又白白被多 charge 一次. 真是花錢如流水~~~

5. 年中老闆說部門缺專利, 我一口氣申請了 7 個. 本來想湊十個, 不過部門目標已經達成了。考慮到邊際效益遞減,我還是把腦力保留到 2025, 不需要做無效的攻擊. 整年共獲得 10 個專利, 台灣新增 6 個, 美國 2 個, 大陸 2 個. 當然這些是前幾年申請的.

6. 出差去印度, 解鎖了一個我旅行清單中偏難的項目。可惜出差行程不可能看到什麼大景, 就是到此一遊。主要亮點還是和家人去了日本和土耳其. 家庭旅遊的部份 pilot run了 “帶家人坐商務艙到處去旅行" 的願望. 重點是這年可以完全丟下小孩, 因為她自己跑去澳洲打工度假了.

2024 年都在學技術, 沒讀到幾本書. 本來說要學英日文都沒進展, 說要減重還胖了!? 這、這是冬天的關係吧! I hope so. 總之, 2024 學了一些新知識. 2025 年希望學更多知識, 也希望跟工作做更多結合.

去年年底網路上很多人 po 文說 2025 =452, 所以這是很特別的一年. 同學還找了更多組合, 像是 (1+2+3+4+5+6+7+8+9)2 = 2025 之類. 其實根本就同一件事. 既然如此, 那今年就是海綿寶寶年了! 讓我們用海綿寶寶考駕照的精神迎接一整年的挑戰吧! 诶? 不對! 他好像一直沒考上耶!? 忘掉駕照, 我們學習他的樂觀就好了. 加油!

2024 年終投資回顧

2024 年拜 AI 科技浪潮之賜, 投資又再度創新高了. 今年的大盤強勁, 台灣和美國市場都是. 我也沾光搭上順風車. 雖然比不上眼光精準的單壓高手, All in 台積電什麼的可以漲八成, 至少算是穩定發展.

別人的績效台積電
(不含息)
台股漲幅 (不含息)台灣 50 報酬指數 [1]S&P 500 [2]NasDaq 100 [3]
全年漲幅81.28%28.85%48.96%23.84%24.88%

我自己有兩個版本的投資統計, 第一個計算方式是從 2004 年開始, 從第一簍螃蟹開始, 不靠薪水加持, 只是讓投資和股息再投資自己長大. 因為基期比較低, 所以增幅比較好看, 但總數比較小.

第二個計算方式是把每年上班存下來的薪水都投進去滾雪球, 我想大部分的人都是這樣算的. 甚至我猜網紅老師們也會把開課賣書的錢再投入當作績效, 這樣總數會比較大, 但年增率會比較少.

我的 2024 績效一簍螃蟹版薪資投入版
全年漲幅38.14%25.16%

我自己的投資組合偏美股, 0050 還占不到 10%, 所以績效也比較像美股. 何況買進指數型 ETF 不需要燒腦, 就算雪球滾得比別人慢, 但是一路直下, 從來不用擔心撞到大石頭後砸個粉碎, 頂多就是路上遇到幾個小土坡小水漥之類的.

我之所以要記錄兩個版本的理財績效也是同樣的道理. 大家都知道新竹工程師薪水比較高, 但理財數據如果都加計薪資收入, 最後就很難分辦到底績效是來自投資正確? 還是純粹老闆給得多? 假設我年底結算獲利 30%, 但其中 40 % 來自薪水, 投資其實倒虧 10% , 那不就搞笑了.

抱持著這樣的想法記錄了 20 年, 結果發現了另外一種趣味. 38.14/25.16 ~= 1.52. 雖然兩邊分子分母都不一樣, 但是分子接近. 它反映出我上這 20 年的班 (2024~2004), 合計貢獻了我的總資產的 1/3 左右 (1.5 ~= 3/2). 2/3 還是紮實地來自第一簍螃蟹的滾雪球效應.

0050 的報酬指數 [1] 在 2004/1/2 是 4,796.17, 2024/12/13 是 43,273.81, 一共成長 9.02 倍. 我的績效稍好一點落在 10.5 倍. 所以這 20 年不靠薪水, 也可以累積 10.5 簍螃蟹的資產. 對於大部分的人來說, 如果能乘著時光機回到 20 年前, 跟自己保證未來能安心財富增長到 9 倍, 我想人生的選擇可能會有點不一樣吧! BTW, 能穿越回到 20 年前, 最想告訴自己的應該不是這件事啦!

這也證明只要時間夠長, 投資對地方, 其實退休金不應該是大問題. 第一桶金夠多的, 可以早點退休, 第一桶金少的把 20 年拉長到 30~40 年一樣可以累積足夠資產. 既然 20 年時間都可以無腦 9 倍以上. 40 年有 2 個 20 年, 沒有翻個幾十倍說不過去. 假設有個好工作, 還可以再錦上添花多出 1/2 (佔 1/3). 我統計的這段時間還是包括金融海嘯和 covid-19, 未來 20 年中頂多再慘一些些吧, 這個理論應該沒錯!

或曰, 道理我都懂, 我就是沒錢投資啊!? 那就是另外一個故事了. 正所謂新把戲變不出老狗, 一定要先把小狗養大才有機會變老. 吃土鋁繩巴逆逆講得很好. 專注本業, 有第一桶金之後才能開始滾動雪球. 如此持續操作二十年就可成功. 下方業配省略, 請自行追蹤鋁繩了解.

抒發完感言, 來講今年的缺失. 反正人非聖賢, 要接受自己做不好才會有進步. 然後講一下 2025 年的規劃.

[失誤區]

  • 首先是 Q3 的大跌後, 我從不怎麼跌的 SGOV 和 BERK.B 挪出資金來買 QQQ 和 PFF. 逢低買進是做對了, 但我覺得跌得不夠, 所以幾乎沒砸多少錢. 剩下的只好改成定期定額慢慢買, 這點小小可惜. 當初全部 all in 才有換股操作的意義.

  • Q3 的震盪中, 我只懷抱安心持有的情懷, 完全沒關注 KO 和 SHEL 竟然創高之後一路下跌. 說實在的, 如果不是要寫回顧, 我都沒發現它們跌超過 15% 了. 幸好我在疫情間買得很便宜, 這兩檔的 ROI 還是極好的雙位數百分比, 但若能牢記他們是景氣循環股, 我還有機會賣掉他們換錢, 所以今年他們創 52 週新高就賣!

KO 從年中最高點跌 15.33%, SHEL 從年中最高點跌 16.02%.

[小確幸]

  • 每次美國公布利率政策, 都會造成暴漲暴跌. 特別是暴跌後都會很快漲回來. 如果是從台灣複委託賣股票, 因為資金交割的關係, 其實無法立刻下單買進. 但錢放在美國券商的不同了. 看到 QQQ 暴跌, 可以馬上賣 SGOV, 買 QQQ, 即使我們睡了一覺起來美國已經休市了, 還是可以用盤後賣 + 第二天盤前買接力完成換股操作的交易.
  • 比特幣賣掉後投入股市. 雖然錢不多, 但也是一筆業外收入.

[新計畫]

  • 原則上 buy and hold. 但兩檔景氣循環股 KO 和 SHEL 若創新高, 我會慎重考慮把它賣掉.
  • 先前有一些美金是用 3.95% 的固定利率定存的, 現在美金定存一年的利率只有 2.6%. 所以美金定存到期都不續約, 準備買配息的優先股或是債券.

最後附上持股比例圓餅圖, 成分股跟 Q3 都一樣. 只是有股息再投入和定期定額稍微改變了比例.

主要賺錢還是靠 QQQ, 貢獻 50 % 的成長, 台股 0050 持股少漲幅大, 貢獻 23%, SPY 貢獻 13%, VIG 6%. 然後殼牌股價 Y2Y 跌 4.8%, 因為佔我的市場權重 10%, 雖然有配息還是虧, 合計貢獻年度收益 -0.25%, 成為 2024 年唯一的老鼠屎.

[REF]

[1] https://www.twse.com.tw/zh/indices/ftse/tai50i.html

[2] https://www.macrotrends.net/2526/sp-500-historical-annual-returns

[3] https://www.slickcharts.com/nasdaq100/returns

比特幣出金記

話說很多年前, 我就趕時髦挖比特幣. 後來聽說挖礦的成本 (電費)高於比特幣的價值, 所以就停挖了. 又過了幾年, 聽說雖然比特幣挖不動, 但挖以太幣換比特幣還有賺頭, 所以我又挖了第二次!

當然除了買貴鬆鬆的顯卡, 老婆抱怨經過我房間門口都特別熱 (電費換成喜歡的形式) 之外, 整個電腦都變得不穩. 不但遊戲玩不成, 部落格後台也頻頻當機, 最後只得停工.

最近看到比特幣漲了不少. 於是又開啟 RTX 4090 挖了一下下. 結果本來很穩的電腦, 那個不便宜的 ECC DDR 就這樣燒壞了. 於是我退出江湖, 設法將比特幣出金. 雖然這幾天真的很冷, 挖礦等於開暖氣還賺錢, 還滿懷念的, 哈!

川普當選好像對比特幣有益, 這東西長期應該也是看漲. 不過我只求賺回買顯卡的錢就好了, 所以我算是一面倒地 (又龜速地) 站在賣方. 不幸地, 今年年初起手式就錯了, 我傻傻地從礦場轉帳到自己冷錢包, 這一個動作就被扣了些手續費 0.0001 BTC.

接下來我以為可以找個人交易了, 卻發現場外交易沒那麼簡單. 接著我就做了第二件蠢事, 我把冷錢包的錢轉到幣安, 想說幣安這麼大, 應該很容易賣掉吧! 結果幣安要換美金、甚至換日幣都比較容易, 要找個台幣的賣家根本困難重重. 只好再研究一下那裡好賣? Google 後我找到 Max 交易所.

Max 的認證有點嚴, 我的審查資格搞了好幾天, 比特幣都漲起來了. But, 從幣安轉到 Max, 我又被收一次手續費 0.0000071 BTC. 在心疼手續費之餘, Max 一通過我的身分驗證, 我就市價怒賣比特幣!

成交本身滿快的, 分成兩單被人接走. 然而我想把台幣再轉帳到我的帳戶, 又再被扣了 15 元 NTD 手續費. 在幣安設定帳號時, 它會轉進 1 元新台幣驗證帳戶可用性, 所以算起來我少虧一元. 合計搬家四次後, 手續費總共是 0.0001071 BTC (約 340 新台幣) 和 14 塊新台幣, 合計高達 354 元左右! 股市跌 354 萬都還會漲回來, 這手續費可是一去不回. 總之, 今年總算入袋為安了.

另外, 促使我加速出場的一則新聞是 Google 量子電腦 Willow 的進展. 這個新聞確實讓比特幣跌了一下下 [1]. 其實研究團隊最大的進展在於找到糾錯量子位元 (Error-corrected qubits) 的 pattern, 讓位元數增加時, 糾錯能力可以隨之上升, 把錯誤率壓下來. 因此開啟了更多量子位元的可能.

這讓我好奇究竟量子電腦能否顛覆虛擬貨幣? 稍微研究後發現其實是可以的, 但目前量子電腦都要針對特定用途 (算法) 做設計, 把演算法轉換成疊加態, 才能達到快速計算. 它還不像是個人電腦那樣能夠泛用, 打幾個字就可以寫程式. 所以投資人要評估把剩下的比特幣全部挖完能賺多少, 才知道值不值得為它設計個量子挖礦機? 還是花同樣的力氣去攻略別的標的更划算?

換個角度想, 要是一秒鐘能挖完所有的虛擬貨幣, 那比特幣存在的價值 (公信力) 會剩多少就還不好說? 假設比特幣因此被認為沒有價值, 駭客還不如去破解更保值的東西. 所以這不是送分題. 如果是委內瑞拉要拚一次性挖完比特幣那就還算合理, 因為這本來就是它的法幣 [3], 它說有價值就有價值了, 還不怕別人跟它哄抬挖礦成本.

[REF]

  1. Google Willow量子晶片!即將邁入量子電腦時代!?Google解決什麼關鍵性的問題?
  2. 未來趨勢!一次了解量子電腦將如何掀起運算革命!量子科技原理全解析!
  3. https://0xzx.com/zh-tw/2024090603314843272.html

少年 Py 的奇幻漂流

週日晚上做了一個夢。有位老先生用毛筆字寫了封信給我,署名林如松,要我照顧他的兒子。說這個兒子學習不好是因為某種心理疾病吧!總之懇請多多照顧等有上百來字。望文生義,那麼我在夢中的身份就是個導師了。

身為導師, 而不是醫師。我開始找醫學相關的線索。在一張可能是精神科醫師的桌子上,我發現了名片。上面寫了幾個小字說明醫師的專業。細節忘了,但其中 “止冰" 兩個字清楚地印入我的眼簾。這是什麼? 要阻止冰塊? 還是冰毒? 我納悶了一會兒,才恍然大悟是"治病" 的諧音.

病人因為精神疾病來求診,有點害羞會不想讓人知道,所以醫師就用某某人止冰來隱晦這件事! 想不到我只是做個夢,也會自編自導諧音梗啊! 在我破解了自己的梗之後,空中又傳來一個自問自答。"為什麼脖子太長不好? " 隔了一下,"因為好"頸" (景) 不長 (常)"。看來我的夢境是進入了諧音梗的 decorator [1].

等等! 一開始我有正經任務的啊! 怎麼跑題了? 想到這裡,世界又變得緊張嚴肅了。好像是初三23:59’57″ – 快初四 (出事)了! 我帶著兩三個人開始闖關,其中也不知道有沒有包括林小弟? 總之系統瞬間提示倒數 3 秒鐘,如果不在限時內讓機關套住一個掛勾,在我後面的人都會從平台上滑下去。正當我回頭叫其他人跟上來,倒數 3 秒已經 “加速" 結束了。我能跟大家說的話只有 一句 “來不及了"。

然而,即使倒數時間到了,我沒有完成任務,其他人也沒跟上,但好像並沒有發生什麼了不起的事? What not happened? 難道因為我們的 3 秒不是真的 3 秒,Dead line 也就不是 line 了嗎 ? 換言之,line 變成 non-linear,所以 dead 也就不 dead 了 !? 這麼一想好像也有道理。好比 nonlocal [2] 如字面所說,雖然不是 global,但肯定不是 local。事前有舖梗,後面就拗得過去。

看來這個夢中世界的 “人設" 很不靠譜啊!? 果然畫面再一轉,出現了那位忘記是自稱還是人稱喇賽之王的前同事 “肯", 帶著我們一行人小跑步穿越著商店街。沒有要 shopping,就是路過著日常騎樓下攤販。本來好像要堂堂展開的華麗冒險,就這樣被 apply(荒謬且搞笑) [3] 了.

Anyway,不管發生什麼事,我們都可以正向解讀。其實我們這位前同事去了谷歌。也許我祖先周公暗示著不管局勢多麼奇幻,還是要好好探索 (Google) 一下未知的領域。那些小攤位就不逛了,我們繼續前行,找出更重要的線索。既解決林小弟的困擾,幫助那位老林先生,同時也完成自己的任務。

[REF]

1. 在 Python 中,裝飾器(decorator) 的作用是用來修改或增強函數的行為。當你使用裝飾器時,原函數會被包裝到一個新的函數(通常是內部的 wrapper_func)中,因此裝飾器會影響函數的執行方式。例如:

      from datetime import datetime
      
      def 計時器(func):
          def wrapper():
              現在時間 = datetime.now()
              小時 = 現在時間.hour
              print (小時, "點了")
              func()
          return wrapper
      
      @計時器
      def 打招呼():
          print("你好!")
      
      打招呼()

      2. 在 Python 中,nonlocal 關鍵字用於在嵌套函數中聲明變數,讓內層函數可以修改外層(但非全局)作用域中的變數。

      def 按讚():
          
          次數 = 0
       
          def comment_filter(好評):
              nonlocal 次數
      
              總類 = ["讚", "愛心", "加油"]
              if 好評 in 總類:
                  次數 +=1
      
              print(f"好評 {次數}")
          return comment_filter
      
      按 = 按讚()
      按("哭")
      按("愛心")

      3. .apply() 主要在 Pandas 中使用,是一個非常強大的函數,用於對 DataFrame 或 Series 進行數據處理。例如: df[‘成績’].apply(加分)

      import pandas as pd
      import math
      
      data = {
          '姓名': ['林明明', '李大同', '王小美'],
          '成績': [85, 92, 5]
      }
      
      def 加分(row):
          # 取得成績值
          score = row['成績']
          # 計算新成績
          new_score = math.sqrt(score) * 10
          return new_score
      
      # 建立 DataFrame
      df = pd.DataFrame(data)
      
      # 使用 apply 並傳遞整個 DataFrame
      df['新成績'] = df.apply(加分, axis=1) 
      
      print("DataFrame 內容:")
      print(df)

      AI 大戰 StackOverflow

      我在網路課程上看到一個 trace code 的片段, dry run 看起來都很有道理. 但是實際上拿到 colab 上會跑不完. 跳出一段 error.

      ERROR:__main__:Error in build_classifier_model: Exception encountered when calling layer 'preprocessing' (type KerasLayer).
      
      A KerasTensor is symbolic: it's a placeholder for a shape an a dtype. It doesn't have any actual numerical value. You cannot convert it to a NumPy array.
      
      Call arguments received by layer 'preprocessing' (type KerasLayer):
        • inputs=<KerasTensor shape=(None,), dtype=string, sparse=False, name=text>
        • training=None
      ERROR:__main__:Error type: <class 'ValueError'>
      ERROR:__main__:Test error: Exception encountered when calling layer 'preprocessing' (type KerasLayer).
      
      A KerasTensor is symbolic: it's a placeholder for a shape an a dtype. It doesn't have any actual numerical value. You cannot convert it to a NumPy array.
      
      Call arguments received by layer 'preprocessing' (type KerasLayer):
        • inputs=<KerasTensor shape=(None,), dtype=string, sparse=False, name=text>
        • training=None

      本來看到 error 也沒啥特別的, 很多網路上的程式可能環境一變就跑不了了. 有趣的是, 把 log 丟給 Monica, 它拿去問 4 個 LLM 都解決不了. 它們分別是 GPT-4o, Claude 3.5 Sonnet V2, Gemini 1.5 Pro, LLama 3.1 405B.

      基本上 AI 回答的 code 就是加了一些 try exception 和加 log, 重寫的 code 跟原來幾乎一模一樣. 換言之, code 沒什麼問題. 這就是個環境因素. 即使我自己加了下面幾行. 程式補了 import os, terminal 下補建了目錄. 還是不 work!

      !pip install tensorflow_text
      !pip install tf-models-official

      沒辦法只好回歸原始人, 去問 StackOverflow. 果然有人遇到跟我一模一樣的問題.

      https://stackoverflow.com/questions/78183834/issue-with-bert-preprocessor-model-in-tf2-and-python

      唯一的差別只是這兩個 package 必須固定版本, 而我抓最新的是 2.18.0 版 就只會鬼打牆 ><|||

      !pip install -U "tensorflow-text==2.15.*"
      !pip install -U "tf-models-official==2.15.*"

      也就是說, 人類把 AI 教得很好. 它知道什麼是對的, 並且能夠把錯得改對. 但原本就是對的, 那它就沒辦法了! 不像是人類可以思考 : “假如我們都是對的, 會是那裡錯了?" 這點對於 AGI 應該是相當重要的, 區別了能不能做創造性思考!

      最後附上跑出來的結果作紀念!