2024 年 Q3 投資回顧

今年的 Q3 相當低迷, 希望 Q4 不要變本加厲!

在 2024/7/16 創下歷史新高之後, 後面遇到 AI 類泡沫化疑雲, 美債降息, 美元貶值, 以及其他不確定因素, 導致股票資產明顯縮水. 8 月初甚至創下單日跌掉十幾個月薪水的記錄, 累積最大跌幅也曾來到 -7.5%. 這個 X 位數字若發生在 2008 年, 等於是天塌了! 還好累積16 年複利也不是講假的, 放到現在就還好而已. 我還幫老婆加了薪水壓壓驚 (粉飾太平).

這季唯二的變動是賣出美國短債 SGOV 和所有的波克夏持股. 除了台股 0050, 其他股票都主要是搭配 DRIP 股息再投入. 老巴是我的長久以來的學習對象. 多年來, 他能夠用一套不變原則選股, 長抱而且賺錢 – 這是我信奉老巴的理由. 但是現在教主的核心持股竟然變化得比我還快,我就沒有那種信奉宗教的情懷了. (臉書上另外一位台灣不 buy 教主最近被酸爆了, 不過這位和老巴不能相提並論.)

在賣掉 BRK.B 的持股後, 因為怕谷下有谷, 坑下有坑, 故遵守紀律地沒有在低點 all in 大盤. 相較於繼續信奉老巴神教, 這個舉動小虧 15 萬多. 理論上即使 BRK 和 QQQ 的股價不再拉開, QQQ 和 PFF 多配幾次息也是可以補回來. 畢竟老巴都不配息 – 這點對想要領月配的老人本來就不利! 這也是我不想永遠持有波克夏的原因之一. 既然終究要賣, 就下定決心賣.

目前單季結算投資收益從高點滑落 3.6%, 比去年底成長 21.9%, 稅後 3 個季度業外收入/全年業內收入的比降到 3.95 倍 (BTW, 螃蟹已經開獎, 所以全年收入也知道了). 只要大環境沒有發生太大的變化, 業外收入這部分預期將遙遙領先! 也沒啥好比了. 我希望我們部門明年業績爆發, 這樣我和同事們都能賺更多錢! 至於投資的這部分, 基本上我就是續抱美股的大盤, 科技股, 特別股加一點液體股票 (可樂和石油). 雖然油價最近跌很多, 但我沒有覺得不妥, 順其自然發展就好!

賀!

今天是 2024/9/17, 也是龍年的中秋節. 平安是福, 此為首賀!

桃園地景節 – 憲光二村

再賀的是: 經過 2 年漫長的等待, 我比較滿意的其中一個專利, 終於在美國通過了. 其實這個專利有四胞胎. 台灣四個都過了. 美國也過了第一個, 這是好的開始.

猶憶我 2022 年有點囂張地記錄下 2 個月得到 3 個美國專利的戰績, 這兩年老天就讓我校正回歸. 足足乾旱了兩年. 才等到現在我的第 9 號! 希望它的兄弟姊妹都能夠登上影神圖.

最後一賀是: 自從黑悟空在黑風大王那裡卡住之後, 我就用上了 “悟空 多功能修改器" 鎖血看劇情. 剛剛也告一段落. 雖然沒有全收集. 不過 " 81 難" 好歹觀賞完 64 難. 可以收工了.

黑悟空真的比較難打. 我承認如果不作弊我絕對打不贏楊戩和大聖殘軀. 我自信能跟二郎神一博的技能是翹二郎腿。

每次天命人被打死都要拔頭上的一根毛去土地廟上香. 我在想,如果遊戲夠寫實的話. 天命人將會變成禿子. 跟一拳超人一樣 (變強了頭也禿了) !

這張比天真頂好看一點

BTW, 跟艾爾登法環 DLC 相比. 那邊我只有最後一隻拉塔恩打不過是靠毒死的. 其他多打兩下還 OK. 頂多就是把搖桿玩壞, 必須要買新的而已.

為黃金律法犧牲的 gamepad

雖然官方日前更新削弱拉塔恩的戰力, 但毒死也是一種實力. 我不想重打了. 何況光是下毒失敗都死了好多次.

隱身丟出腐敗壺之後, 用擬態樹枝假裝是石獅子.

Model.pb 小註解

這個檔案是用來放 model 的 protocol buffer, 所以叫做 pb. 當我們對 input raw data 做了一些前處理, 然後才去 train model. 那使用這個 model 的天命任意人, 怎麼知道要用那些 pre-processing 的手法來處理他的真實資料呢? 沒錯! 就是去看這個 model.bp.

Model.bp 不只是記錄 metadata 這麼簡單, 它只是三個主要功能之一. 這三個功能分別是:

  1. Model Graph: 把 model 的 graph 記下來. 這個 graph 不是個圖檔, 是資料結構裡面的 graph, 它定義了 model 的資料流向.
  2. Metadata: 主要是 input 和 output 的 tensor information. 不論是做前處理或是後處理都會參考到.
  3. Portability: Model 作者最初可能是用 Tensorflow, Tensorflow Lite, 或者Tensorflow.JS 開發, 使用者 deploy 的 platform 不同於作者時, 也可以參考這個檔案獲得相容性資訊.

講到前處理, 另一個 keyword 是 tf.Transform. 這個 library 專門做 Tensorflow 的前處理用. Graph 也是它產生的. tf.Transform 整合了 Apache Beam, (Google) cloud Dataflow, 和 TensorFlow 兩種不同的處理方式 [1][2].

請留意 tf.Transform 是在 pre-process 階段做 feature engineering, 而 Apache Beam 和 Cloud Dataflow 是在 feature creation 階段. 所以後者提供 API 給 tf.Transform 使用. 第三個可以執行 feture engineering 的階段是 train model. 在 [1] 裡面寫了 1,2,3 三個圈圈, 順序和我提到的相反, 但是那沒關係, 只是做個區隔.

附帶一提 Beam 可以用更多的 programming language, 像是 Java, Python, 和 SQL. Tensorflow 基本上多了 C++, Javascript, 少了 SQL. 總之學 Python 就對了.

[REF]

  1. https://ithelp.ithome.com.tw/articles/10227075
  2. https://www.tensorflow.org/tfx/transform/get_started
  3. https://towardsdatascience.com/hands-on-apache-beam-building-data-pipelines-in-python-6548898b66a5

Feature Engineering 備忘小筆記

對 AI 有興趣的我, 其實比較喜歡研究 model 的原理, 對於資料的處理沒興趣. 不過偶爾要用到某個語法, 卻又記不起來的話, 還是會有點傷腦筋! 所以筆記一下加深印象. 以後也好查詢.

  1. dataframe 轉 dataset
def df_to_dataset(dataframe):
    dataframe = dataframe.copy()
    
    labels = dataframe.pop('your target')
    ds = tf.data.Dataset.from_tensor_slices((dict(dataframe), labels))
                            
    return ds

2. Categorical 轉 Numeral (one-hot)

from tensorflow import feature_column as fc

# invest_df is predefined dataframe

A = ['stock','bond','ETF']
B = []

for C in A:
    D = invest_df[C].unique()
    E = fc.categorical_column_with_vocabulary_list(C, D)
    F = fc.indicator_column(E)
    B.append(F)

3. Bucketized 轉 numerical

G = fc.numeric_column("net_asset")
​
# Bucketized cols
H = fc.bucketized_column(G, boundaries=[10, 20, 30, 40, 50, 60, 80, 100]) # in million USD
B.append(H)

4. Feature Cross (Bucketized + Categorical)

I = invest_df['FATFIRE_proximity'].unique()
J = fc.categorical_column_with_vocabulary_list('FATFIRE_proximity',I)
​
crossed_feature = fc.crossed_column([H, I],hash_bucket_size=1000)
crossed_feature = fc.indicator_column(crossed_feature)
B.append(crossed_feature)

5. 實際運用

# input_dim = 上述的 feature 個數, 此時 = 8
# 假設下一層是 12 nodes.
# 8 x 12 是 fully connected.

feature_layer = tf.keras.layers.DenseFeatures(B, dtype='float64')
​
model = tf.keras.Sequential([
  feature_layer,
  layers.Dense(12, input_dim=8, activation='relu'),
  layers.Dense(8, activation='relu'),
  layers.Dense(1, activation='linear',  name='your target')
])

6. 產生新的 Bucketetized feature 做成 Feature Cross


    M = np.linspace(0, 1, nbuckets).tolist()
    N = np.linspace(0, 1, nbuckets).tolist()

    OP = fc.bucketized_column(B['OPEN_PRICE'], M)
    CP = fc.bucketized_column(B['CLOSE_PRICE'], M)
    OV = fc.bucketized_column(B['OPEN_VOL'], N)
    CV = fc.bucketized_column(B['CLOSE_VOL'], N)

    OO = fc.crossed_column([OP, OV], nbuckets * nbuckets)
    CC = fc.crossed_column([CP, CV], nbuckets * nbuckets)

    new_bucket_cross_feature = fc.crossed_column([OO, CC], nbuckets ** 4)

7. 畫出酷炫流程圖並存檔

tf.keras.utils.plot_model(model, 'model.png', show_shapes=False, rankdir='LR') # or 'TB'

股市震盪小筆記

自美股在 7/23 (二) 開始走下坡之後, 台股先是在 8/2 (五) 大跌破千點之後, 8/5 (一) 又創記錄大跌 1807.21 點. 隨後美股看似有點回神 (其實沒有), 台股就在 8/7 (三) 創下最大的反彈記錄. 真不愧是奧運期間, 破紀錄變成日常.

看著預期中的美股下跌發生, 我準備低接美股. 至於錢從何來呢? 首先就是停泊資金的 SGOV 可以賣掉, 然後把表現怪怪的波克夏也賣掉, 這樣就有銀彈可以買入了. 為何說老巴怪呢? 我可以接受他買 Apple, 但不能接受他又迅速地把 Apple 賣掉. 難道蘋果也有地緣政治風險? 我投資老巴是因為他能判斷投資標的長期潛在價值. 如果波克夏現在只是擅長財務操作, 那跟投資對沖基金也沒什麼區別是吧. 老巴說不懂的東西不要買, 我現在不懂了, 應該要賣出才符合當年老巴的精神.

SGOV 無論什麼時候賣出都會是 100.XX 元, 非常保值可以輕鬆出脫. BRK.B 在這波股災中, 相對跌得很少, 大概掉 5% 而已, 不像 QQQ, SPY 都跌掉 15%. 大家都稱讚老黃老巴眼明手快落跑成功! 既然它掉價少, 策略又引起我的質疑, 正好可以賣掉換子彈. 昨天那部分賣在 434. 本來想賣 433 就好, 但是我會聯想到跟 PM 開會的 433R. 想想還是多賣 1 塊好了. 結果幸運分 4 筆陸續成交. 這樣一來, 陪伴我多年的波克夏也入祀忠烈祠了~~~

接下來要怎麼買呢? 這個月我開啟了定期定額的模式. 雖然可以按照跌 10% 買 10%, 跌 20% 買 20%, … 的這個原則買進. 但是我手中究竟有多少錢是變動很大的. 比方說賣 BRK.B 之前和之後就差很多. 所以我用手續費 0.1 USD 等級的定期定額, 一部分買 QQQ, 一部分買 PFF. QQQ 這單很幸運地買到 425.28, 因為那天開盤就暴跌.

買 QQQ 是我的投資重點, 基本上不會改變. 最近 Nvidia, Intel 出包, 反正就算這兩家沒事, 別家早晚也會出事. 整體而言, AI 浪潮勢不可擋, 我長期看好一籃子科技股. 只要整體會成長就好! 至於 PFF 股價雖然不會成長, 它卻能提供每個月生活費自動進帳的心理支撐. 這跟我們找工作一樣, 年薪再高, 月薪還是要有一定的水準才安心. 這算是個人偏執的心態吧.

年中投資回顧的時候, 我說希望到年底能持平就好. 不過轉眼已經跌掉了 6~8%. 如果不是民生用品和息股增值股 (KO, SHEL, VIG, NOBL) 在幫我分散壓力, 消失的就不是一台車而是一棟房了. 雖然重壓賺比較多, 但分散風險對心理還是比較健康的. 希望增持的 QQQ 能趕快回到原點, 這樣我就會創新高了.