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 的殼, 加個 while loop, 程式就能用了. 不求任何優化, 只要把題目的 array 輸進去, 答案立馬出來.

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

神經病 vs 精神病

這個標題看起來像是在罵人, 不過它是 “記憶" 這本書第一章的亮點. 記憶為何會牽扯到精神病呢? 因為精神病患常常有幻視幻聽等症狀 (失智者也會), 而且他們對這些幻覺有長期的記憶 (嗑藥好像也會). 為何虛假的東西會被當成是真實的事情, 並且被大腦記錄下來? 本書的第一章就在討論這個.

作者薇洛妮卡‧歐金在"記憶:我們如何形成記憶,記憶又如何塑造我們?精神病學家探索解析大腦記憶之謎" 一書中, 就是以精神病學家的角度切入 “記憶" 這個主題. 作者認為瞭解異常, 有助於認識正常. 早期人們從宗教的觀點認為有些人得了精神上的怪病, 但科學家慢慢找出怪病的原因, 因此把這類疾病從精神病變成了神經病.

既然是西方老外寫的書, 精神異常一定要綁定文化背景. 例如在大中華文化圈, 如果曹孟德常常看見死者向他索命, 老一輩的人會說他害死太多人, 所以有冤鬼來報仇. 但近代科學家可能認為幻視幻聽是失智症的一種. 諸如此類. 同理, 當西方人發現所謂精神感受來自於大腦, 而不是靈魂, 靈魂的影響力就減弱了.

19 世紀的精神病院病人, 有 25% 的比例被認定為 “麻痺性癡呆" (General Paralysis of the Insane = GPI), 其病徵是道德錯亂. 但是到了 1880 年代, 人們發現這是梅毒末期所造成的腦病變. 1950 年代, 盤尼西林發明後, GPI 從精神科轉到內科治療. 再經過梅毒螺旋體的發現, 這個疾病發生的原因也由 “性濫交造成的精神錯亂" 轉為 “傳染病".

另一個例子是腦炎 (抗 NMDA 受體腦炎 = Anti N-methyl-D-Asparatate-encephalitis), 得到這個病之後同樣會發生精神錯亂, 包括幻聽、妄想、動作障礙. 所以原先由精神科處理, 但其實這是一種自體免疫疾病 (autoimmunity), 因為抗體攻擊人類自己的 NMDA 受體所引起.

總而言之, 得了神經病還是比精神病好一點. 因為我們知道原因. 在排除偽精神病之後, 作者順手批判笛卡兒的二元論是偽科學, 因為他主張的二元論把心智 (mind) 和大腦 (brain) 分別當作心和物兩種物件, 但作者認為心智都有物理依據. 就像是精神病都有神經學的基礎. 當然, 笛卡兒更有名的是 “我思故我在". 歷史地位沒有問題. 這裡就只鎖定的一個觀點: 笛卡兒認為上帝所創造的靈魂是完美的, 而生活的感官經驗沒那麼重要. 和他打對台的人, 則是感覺主義者 (sensationalist).

書上說: 上帝給的叫做 Knowledge (天命?), 自己學到的知識叫 knowledge (學問?), 分別是大 K 和小 k. 這兩種知識的爭論跨越 16,17 世紀. 雖然我 Google 不到相關資料, 但這個題目很有趣. 本書第一章的後半也在講這個. 後來有個實驗證明, 55 歲才恢復視力的一位維吉爾先生, 當他重獲視力, 短期間還是不能把以前熟知的圓形、方形, 和眼睛看到的球與方塊做連結. 故作者認為心智的初始值就是一片空白, 所有的感覺 (或者應該理解為知覺?) 都是記憶所餵養的.

我們從訓練 AI 模型的經驗可以知道, 每個人都有數量相當的腦細胞, 不過有人初始值設得比較好, 有效的參數比較多, 甚至預設好幾組 trained 好的 model (音樂, 數學, 體育…etc.), 所以日後即使受同樣的教育 (re-train / fine-tune), 也會有不同的表現. 基本上這和作者的觀點差不多, 但只要了解過 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

投資策略思考 – 過年篇

領到年終獎金之後, 因為銀行營業日只剩兩天, 立馬就轉帳到不同的證券戶. 又為了搶低點, 買價設得接近市價, 兩三下就幾乎花光了. 只剩下集運匯錢到美國帳戶的資金, 因為不用急著成交, 反而都沒買到. 在這個寒冷、老人不宜外出的天氣裡, 正好窩在電腦前查資料.

首先瞄到 2023/1/4 一篇 Seeking Alpha 上有一位作者 (推銷員?) Rida Morwa的投資策略, 七八分合我的意, 於是我認真地看它. 作者說他偏好固定收益, 像是優先股, baby bonds 或是 bonds. 下一段又說特別留意 Pass-Thru Entities, 例如 REIT, 以及 CEF, MLP 優先股. Baby bond 就是面額低於 1,000 USD 的債券. 但 Pass-Thru 這個名詞對我又熟悉 (i.e. pass thru bugs) 又陌生, 所以我先來研究一下 Pass-Thru Entity.

Pass-Thru Entity

此處的 pass-Thru = pass-through = flow-through. 意思是說, 這些 entity (包括: sole proprietorships, partnerships, limited liability companies, and S-corporations. [1], 簡稱公司) 把稅直接轉嫁給 owner, 所以只有 owner 要繳稅, 這些 entity 可以避稅, 或者避免雙重繳 (利息) 稅. 相反的例子就是台灣政府取消兩稅合一, 股東擁有的企業先扣一次營業稅, 股東的利息也扣一次所得稅, 接著再扣二代健保補充費…呃, 過年不罵人. 先回到大家比較熟悉的 REIT [2], 它並不是 Pass-Thru entity! [3]

我從 [4] 抓到下圖, 它解釋了 S-corporations 以外的公司型態, 大家看圖意會即可. 至於 S 公司, 可以參考 [5], 它是一個經過註冊, 股東少於 100 人 的 (美國) 國內公司.

CEF 優先股

CEF 是指 Closed End Funds, 也就是封閉式基金. 封閉式基金的規模會固定下來, 所以大家只能互相買賣, 也會物以稀為貴 [10]. 根據 [6], 厲害的點不是 CEF, 而是 1940 這個法案 [7]. “This is because of the requirements that the CEF have at least 200% asset coverage for preferred stock and 300% for debt asset coverage of “senior securities” which means debt and preferred stocks. " 也就是說公司的資產為 1, 才可以發行價值為 1/2 的優先股和 1/3 的高級債券. 當公司清算時, 優先股一定能夠回本.

上圖取材自 [8], 以及 http://www.antiquesage.com

根據 [8], 購買優先股可以獲得 5.6% 的殖利率, 但 CEF 優先股可以獲得 7~9% 的殖利率. “Preferred stocks that are bought individually—that is, outside of a fund—yield 5.6% as I write this. But purchasing through a CEF can upsize that payout to 7%, 8%—even 9%." 這是什麼魔法呢?

  1. 因為封閉式, 有機會買到淨值 (NAV = Net Asset Value) 以下的價格.
  2. 槓桿操作 – 聽起來危險, 通常控制在 35% 或以下.

根據上述理論, [8] 的作者 Michael Foster 推薦四隻殖利率> 7%, 折價 2~4%, 長期回報 5.7%~9.6% 的四支優先股基金: FPF, JPC, JPS, LDP. 在美國券商都買得到. 因為推薦的時間是 2020 年. 理論上在 2022 大升息期間有更多的好料可以買. 只是晚了就漲價買不到.

MLP 優先股

根據 [9], MLP = Master Limited Partnership. 回到 “types of business" 那張圖, 商務的型態有合夥 (partnership) 和公司 (cooperation) 兩種主要型態. 前者像是律師事務所, 就像我們看到韓劇裡面的律師, 拚到最後就是升為合夥人. 它就是個 LLP ( limited liability partnerships) 的典型例子. 但不要跟圖上的責任有限公司/ LLC (limited liability companies) 搞混. [12]

LLP 架構下有一個或多個要負全責的人 (general partner, 事務所老闆), 和一些只負有限責任的人 (limited partener, 合夥人律師). Master Limited Partnership 即是可以出售的 partnership, 我把它想像成不用自己當律師, 也不用當事務所老闆, 但是我花錢買到這個分紅的權利. “The word “master" in MLPs pertains to the general partner, who will usually own two percent of the MLP. " [13]. 意思是原本老闆擁有 MLP, 然後他把這個權利拿出來賣錢.

那 MLP 的優先股會有啥好料呢? 根據 [11], 呃…這些 LLP, 我確實一點也不熟悉.

小結論: CEF vs PFF

根據 [10], “通常一檔基金架構會選擇封閉型,主要原因都是投資的標地流動性較差." 如果大幅升息, 那封閉式基金的殖利率放到現在一定不漂亮. 果不其然, 抓個圖 [14] 就可以看到這淨值的跌幅也很考驗心臟. 不過跌下去之後, 它的殖利率有 8%, 還是算高的. 雷達 (Rida) 先生說要買算是有理.

再看看 Firstrade 的圖, 這支基金顯示折價 (Price < NAV), 好像麥克 (Michael) 也所言不虛. 只是年假雖長, 時間還是有限. 目前我只能知道優先股值得買, 但是 CEF 優先股基金… 我好像剛看完交通規則考古題, 還不知道應不應該開上高速公路啊~~~

根據 [15], CEF 優先股基金有下面這些標的. 其中 PFF (Open End Fund) 是放進去 PK 用的. 果然 CEF 都有槓桿, 甚至超過 50%. 雖然殖利率都高出 PFF 一小截, 總回報有些也比 PFF 厲害, 不過我還是買 PFF 就好了.

因為 FPF 的成分股 [16] 和別家差不了多少, 就是 8% 的優先股買得多一點. 但光是槓桿這部分就扣分了. 其中, NPFD 沒槓桿, 也沒有手續費, 不過虧 20%. 好像一個學生沒作弊但是被當掉, 好可憐.

總結

優先股在成長股狀況不佳的時候, 的確可以提供短期的保障. 根據 [17], 如果把 PFF 的股息拿去再投資, 經過 15 年壓力測試, 其實還跑不贏把股息拿去爽爽花! (下圖紅色 > 記號) 所以對於不會成長的標的物, 其實沒有股息再投入的必要. 優先股在升息導致大盤下跌時, 也就是黃色底時買進, 可以當作短中期保證穩定獲利的工具. 但是長期就輸給 S&P500 許多.

[REF]

  1. https://www.thebalancemoney.com/what-is-a-pass-through-entity-5217698
  2. https://rich01.com/what-is-reits/
  3. https://www.sec.gov/files/reits.pdf
  4. https://corporatefinanceinstitute.com/resources/management/sole-proprietorship/
  5. https://www.irs.gov/businesses/small-businesses-self-employed/s-corporations
  6. https://innovativeincomeinvestor.com/preferred-stocks-of-closed-end-funds/
  7. INVESTMENT COMPANY ACT OF 1940
  8. https://www.forbes.com/sites/michaelfoster/2020/07/28/preferred-stock-closed-end-funds-how-they-yield-up-to-9/?sh=726ea3375d1a
  9. https://seekingalpha.com/article/4541734-comparing-mlp-preferred-stocks
  10. https://rich01.com/closed-end-funds-vs-open-end-funds/
  11. https://seekingalpha.com/article/4541734-comparing-mlp-preferred-stocks
  12. https://www.legalzoom.com/articles/difference-between-llc-and-llp
  13. https://www.investopedia.com/terms/m/mlp.asp
  14. https://www.nasdaq.com/market-activity/stocks/fpf/advanced-charting
  15. https://stockmarketmba.com/listofpreferredstockcefs.php
  16. https://www.ftportfolios.com/Retail/cef/cefsummary.aspx?Ticker=FPF
  17. http://www.lazyportfolioetf.com/etf/ishares-preferred-and-income-securities-etf-pff-dividend-yield/

LeetCode 小體驗

話說我摸了一陣子 Python, 那要算會? 還是不會呢? 稍微 Google了一下相關資料, 臉書的廣告就變成各種 Python 補習班了. 當然, 要我花錢去補習或是考照那是絕不可能的! 好歹我還曾經贓到過 Sun 認證的第一代 Java 講師稱號呢, 怎麼可以從講師變學徒呢? 至少要自修吧! 哈! 但是誰可以幫我鑑定一下我的水準呢? 我靈機一動就想到了 LeetCode.

如果我用 Python 來解 LeetCode 的題目 [1], 不就知道自己的水準好不好了嗎? 於是乎我找出註冊 N 年還沒開工過的 LeetCode 帳號, 選用 Python3 來作答. …..嗯, 果然程度不太好. 雖然看過一些 code, 也把教學 [2] 讀完了. 不過還是不能得心應手.

尤其第一次做, 我還不知道題目下面就有 test case, 也不知道不用自己寫輸出入 UI, 只要 function 吃到參數就好. 所以花了很多時間設計怎麼輸入 list 最 user friendly, 結果不但做白工, 還判失敗~~ 結果拔一拔反而 pass 了. 完全在搞笑!

所以提醒初學者, 先選選擇難度. 然後挑個自己想解的題目.

點進去之後. 可以選各種語言. 下面有 test case. 右下角選 run, 然後看 Result 對不對? 對的話就可以按綠色的 Submit. 如果選 auto, 電腦可以自動幫忙完成, 當然那也要花錢錢. 點選題目也可以看別人的解答, Stackoverflow 也一堆解答. 不過我第一個程式當然要自己摸索~~ (當然也就搞笑了).

Accept 之後, 系統還會說明執行速度和使用 memory 兩方面贏過多少人? 這個要拚的話當然是可以再努力. 不要 init class 也可以變快一點 (^^). 另外, 我傻傻地用初學時的 Jupyter Notebook 打草稿, 這樣連 list 都要 import 才編得過. 但是在 LeetCode 卻都可以忽略. 果然是有差!

Anyway, 我第一次 run LeetCode, 而且是用 Python. 這還滿值得我記錄的, 算是 2023 年的新年新把戲!

[REF]

  1. https://leetcode.com/problemset/all/
  2. https://docs.python.org/zh-tw/3/tutorial/index.html