2024 年 Q2 投資回顧

2024 年中美股市都在高點, 雖然看起來有站不穩, 但是今年截至目前為止, 要虧錢都很難. 預期大家都是賺錢的, 恭喜恭喜!

在這一季當中, 基本上我沒有改變投資組合. Firstrade 繼續 DRIP (股息再投入). 上一次嘗試選擇權失敗, 這次就不試了. 唯一新奇的作為是 Firtrade 廣告可以定額買零股. 我看看戶頭還有 11.08 左右. 於是就想要玩玩看.

6/10 用它買了0.09233 股 Nvidia. 原先我是用市價買, 想說 11.08 元虧光也不怕! 但是 Firstrade 跳出警告說 “你沒資格啊, 你沒資格"[1]. 我只好改下限價 120 元, 立刻就買到了, 看起來不但能買, 還可以 DRIP. 不過 11.08 要怎麼樣才能可以利滾利就財富自由了呢? 想想也不太可能, 所以隔 3 天就賣了. 改買 QQQ 0.02579 股, 免得我圓餅圖畫不出來.

圓餅圖在此. 還是一樣的投資組合, 比去年年底成長 22.2%, 半年獲利超過去年加前年的獲利. 那一整年豈不是….哇哈哈哈…… 嗯, 沒人知道未來會發生什麼事! 我從 Q1 居高思危到現在, 真的是有錢也不敢投資. 於是我把公司發的獎金都拿去繳稅了, 這樣等到股市跌下來, 我至少可以定期定額往上買. 現在就定期定額將會是往下買的機會比較大吧? 總之, 沒錢就不會胡思亂想了.

公司同事法總最喜歡問我哪一支最賺錢? 如果比漲幅一定是 0050 大勝! 它從去年年底 135.25 漲到 186.6, 漲幅是 38%. QQQ 從 409.52 漲到 479.11 只有 17%. 而我原本 1/3 是 QQQ, 1/12 是 0050, 比例就差了 4 倍左右(編按,有更正). 加成效果後終究是 QQQ 惠我更多. 要是沒有台灣價值的話, 今年上半年也不會這麼好!

未來怎麼走呢? 賣掉美股就可能要繳海外所得稅, 即使賣也不能賣太多. 但是少量賣又沒有換股的效果. 尤其是不知道可以換到哪裡去? 所以我考慮的就是維持 buy and hold. 近期都不做大筆投資, 台灣複委託配出來的台幣, 就定期定額再投入 PFF – 這是我殖利率最高的一檔. 雖然投入 QQQ 長期絕對比較賺, but 短期真不好說. 至於複委託配出來的美金就定存, 日幣….跌到新低不可能再拿去換別的幣別, 真的是只能湊整數再投入, 用股市成長來彌補匯兌損失. 大致上就這樣規劃, 看天公能否疼惜一下憨人, 下半年持平就好. 感恩!

[REF]

  1. 以我的理解。Firstrade 的獲利管道之一是把 order 賣給高頻交易公司,如果是限價單,高頻交易公司可以自己配對買賣單賺差價。但 11.08 元的市價單他們程式可能不好 sorting. 還要保證成交, 又讓客戶滿意成交價,所以乾脆不接單吧。

用 Multi-LLM 解釋投資風險

Coursera 有一門新的課 [1], 由該公司老闆 Andrew 介紹 CrewAI 來講課. 主要是講多個 LLM 怎麼應用. 課程不長, 有 Lab, 沒證書. 看在老闆推薦的份上, 我也來蹭一下.

用最簡單的話來講, 它的技術就是叫每個 Agent 執行一個 task. 雖然大家平平都是 LLM, 但是指定了不同的角色, 每個 agent 就會各自專注在它的 task 上, 達到互相幫忙的結果. 當然每個 agent 的排列方式 (hierachy) 會影響他們共事的結果.

可不可 search 網路? 需不需要 human input, 可不可以非同步? 這些在 CrewAI 這家公司的 library 中都可以設定. 每個 agent 透過 memory 互相溝通, 因此即使不指定誰 (agent) 要傳訊息給誰 (other agents), 資料也可以共用.

有個 Lab 很好玩, 就是建立一個 crew 去分析買股票的風險. 它的架構是 Crew 叫 agent 做 task. Task 就只是明訂工作內容 (description) 和預期成果 (expect output), 然後註明給哪個 agent. Agent 要指定 role, goal, backstroy (工作指導), 標記可以用那些 tools? 標記可不可以餵資料給別人 (delegation), log 要多詳細 (verbose).

from crewai import Crew, Process
from langchain_openai import ChatOpenAI

# Define the crew with agents and tasks
financial_trading_crew = Crew(
    agents=[data_analyst_agent, 
            trading_strategy_agent, 
            execution_agent, 
            risk_management_agent],
    
    tasks=[data_analysis_task, 
           strategy_development_task, 
           execution_planning_task, 
           risk_assessment_task],
    
    manager_llm=ChatOpenAI(model="gpt-3.5-turbo", 
                           temperature=0.7),
    process=Process.hierarchical,
    verbose=True
)

Crew kickoff 之後, agent 就會去做事. 至於要做什麼? 寫在 input string 裡, 相當於一個 prompt. 舉例指定用 1000 元去買 Nvidia, 風險承受度中等, 應該如何操作? 在課程的例子中, 因為指定 process 是 hierachy. 所以叫第一個 agent 去做 data analysis, 它有 search 網路的 tool, 因此就會各個網站 search Nvidia 的新聞. 總結出 10 條. 交給下一棒 Trade agent.

Trade agent 的工作是要分析標的物的統計值, 它也有網路工具. 所以它也去找了一堆網站. 總結出 Nvidia 的評價.

Based on the information gathered from various analyst forecasts and recommendations, the average 12-month price target for NVDA is $130.68, with the highest target being $200.00 and the lowest at $90.00. The consensus rating for NVDA is “Strong Buy," supported by 38 buy ratings and 3 hold ratings. The stock has a current price of $135.58. The analysis suggests that there is a potential -3.61% downside from the current price based on the average price target. The historical performance of NVDA shows consistent outperformance relative to the industry.

接一下到了 execution agent. 它有甚麼大膽的創見嗎? 沒有. 即使它收到這麼明顯地看多訊息: Considering the historical performance and analyst forecasts, developing a trading strategy that aligns with the bullish sentiment towards NVDA could be a profitable approach, especially for day trading preferences.

它還是說我要上網查看看, 然後歸納出 5 點結論:

Execution Plan for NVDA:
1. Utilize historical performance data to identify key trends and patterns in NVDA’s stock price movements.
2. Implement a strategy that leverages the ‘Strong Buy’ recommendation and average 12-month price target of $130.68.
3. Monitor market trends and movements closely to capitalize on potential trading opportunities presented by NVDA’s growth potential.
4. Develop a risk management strategy that aligns with the user-defined risk tolerance (Medium) and trading preferences (Day Trading).
5. Regularly review and adjust the execution plan based on new market data and insights to optimize trading outcomes for NVDA.

接著回到 Crew. 它根據風險承受度為 Medium 這個條件, 再上網去跑一輪. 對每個網站的內容做一個小結論. 最後叫 risk management agent 彙總, 結果就是給安全牌 (因為風險承受度不高).

Overall, the risk analysis for NVDA’s trading strategies should focus on understanding the potential risks associated with each strategy, assessing the firm’s risk tolerance, and implementing appropriate safeguards to manage and mitigate risks effectively.

我認為畢竟 Crew 收到的指令就是風險承受度中等而已. 已經預設立場, 不用問 AI 也知道結果. 當我把風險承受度改為 Ultra High 重跑一次. 這次它的結論就變狠了! 建議了一些選擇權策略: Straddle Strategy、Iron Condor Strategy 、Long Call Butterfly Spread Strategy、LEAPS Contracts Strategy 等等.

這告訴我們兩件事.:

  1. CrewAI 使用 multi LLM 的功效很強大. 大家做完自己的事就交給同事 (co-worker), 各司其職. 可以用同一個 LLM 做出一群同事開會的效果!
  2. 你跟 AI 講我風險承受度低, AI 就叫你保守. 你說你不怕死, AI 就叫你玩選擇權. 這些不用問 AI, 應該是問施主你自己就好了.

[REF]

  1. https://www.coursera.org/learn/multi-ai-agent-systems-with-crewai/home/welcome

Amazon 聊天機器人實作導航

我在 Amazon [1] 看到一個聊天機器人的課, 只需要花 1.5 小時. 我想說這時間我行啊, 就跟著跑了一遍流程.

不過呢? 跟某些網課一樣, 它只帶你走流程. 做完之後覺得有點空虛. 所以決定再複習一次我在哪裡? 我是誰? 我做了什麼?

Step 1: 選定 LLM. 在 SageMaker 下找到課程指定的 model (Flan T5 XL), 設置 Inference 用的端點 (endpoint). 也就是下圖中間的部分.

Step 2: 賦予 LLM 網路搜尋的能力. Amazon 的套件叫做 Kendra, 也就是上圖下方偏左的綠色方塊. Kendra 可以從指定的 data source 找資料進來, 例如 shared point, one drive. 這樣就滿有實用性. 但課程建議選 Amazon S3.

Step 3: 賦予語音文字轉換的能力. 採用的套件是 Amazon Lex, 也就是上圖下方偏右的綠色方塊. 預設它的 Inten (意圖?) 會叫 Kendra 去 search. 等等! 那 LLM 在幹啥? 原來會把問題和 Kendra 打包去問 LLM. 官方課程說明如下:

  • Retrieve relevant information from your Kendra index.
  • Package that information along with the original question into a prompt.
  • Send the prompt to your LLM endpoint.
  • Return the LLM’s response to your Lex V2 bot.

到這一步, 網頁上已經可以有 build 和 test 的按鈕可以選. Build 完可以 test, 但回答一般問題的能力很差.

Step 4: 增加 RAG 能力. 在上圖上方的藍色區塊是 Amazon Cloud9 這個 IDE 環境. 我們在這裡編出 RAG 的 code. 它綁定:

  • Your AWS REGION
  • Your Account ID
  • Your Kendra index ID
  • Your Large Language Model endpoint name

然後把它們 build 出一個 docker image, 放到 repository. 不意外地, 它必須是 Amazon 家的 ECR (Elastic Contain Registry).

這一動需要一些時間, 可以休息一下.

這邊的架構採用常見的 RAG + LangChain [3]. 也就是上面架構圖下方的橘色 Lambda 字樣那個方塊. RAG 和 LangChain 是少數沒看見 Amazon logo 的地方.

Step 5: 做好的 Docker 放在哪裡跑呢? 當然要順便推銷一下 Amazon Lambda [2]. 它號稱不用佈署後台就可以執行, 而且有免費方案.

所以我們在 Lambda create function 並指定 image 的 URI 就是 Amazon ECR image repository 底下的 rag-kendra-llm-lex 這個 docker. 然後設定 IAM (Intent, Access Management) 的參數.

Step 6. 搞定後台之後, 接著要搞定前台. 首先在 Amazon 的 Lex, 做一些規定好 (=死) 的設定. 建立出一個名叫 WebAppBot 的機器人. 為了讓 Amazon 前台後台能夠相認, 不意外前台也有一個 ID, 例如: V5R1NOLHRM.

Step 7. 現在前台後台都有了. 還缺什麼呢? 缺一個雲端平台讓人找到 WebAppBot! 這時候 Amazon Cloudformation [4] 就出來了.

等等! 我剛剛以為 Lambda 不就搞定所有了? 可惜並不是. Lambda 處理的是雲端運算的資源. Cloudformation 處理的是 “Speed up cloud provisioning with infrastructure as cod". 也就是寫寫 code 就設定好雲端了. 兩者的功用的不同恰如章節名稱所示.

TASK 4.2: DEPLOY THE IMAGE AS A LAMBDA FUNCTION

Task 5: Deploy a web app with Cloudformation

Cloudformation 的資源叫做 stack, 所以我們 create stack, 取名叫 LexWebApp, 並且指定連到前述 WebAppBot (ID), 和 AccountID.

光是網頁設定還不夠. 此處要真正 build LexWebApp, 例如指定跑在 AMD 還是 X86 上等底層的 code. 這時用到 Amazon CodeBuild.

Step 8. 感覺應該都沒事了. 但課程說 webAPP 不應該連到 LexBot, 而是連到它的 alias. 這樣才能一面背景維護, 又維持服務在線. 所以重 build 連到 alias 的 lambda 了. 在 cloudformation 以 WebAppUrl 指到的 URL launch LexWebApp.

OK! 這就是我對這個課程的理解. 它用了置入性行銷的手法, 把自家的產品介紹了一輪. 我有學到新的東西嗎? 有, 我對 Amazon 賣的東西更理解了. 但是在技術上, 有點空虛就是了. 所以我又用了一天來回顧我花的 1.5 小時, 讓它更有意義一點!

[REF]

  1. https://explore.skillbuilder.aws/
  2. https://aws.amazon.com/tw/pm/lambda/
  3. RAG實作教學,LangChain + Llama2 |創造你的個人LLM
  4. https://aws.amazon.com/tw/cloudformation/

斑鳩養成記

5 月去了一趟日本, 回家後發現常常來探路的斑鳩, 已經在我的窗台築窩, 還生了一顆蛋. 第二天變成兩顆.

2024/5/11

接下來家長開始孵蛋. Google 得知是父母輪流孵蛋, 另一隻會去覓食. 因為怕開窗會讓鳥爸鳥媽棄巢出走. 所以一陣子都不敢開窗, 也不敢澆花. 窗台長出一堆雜草.

2024/05/16

去天竺國取經回來, 兩隻黃毛小斑鳩已經生出來了.

2024/05/25

人家說黃毛丫頭應該是有所本.

2024/5/26

過了幾天慢慢長出斑鳩的羽毛. 家長還是會回來餵食.

2024/5/29

慢慢長出斑鳩的羽毛, 但沒有再觀察到家長的身影.

2024/5/31

還是沒看見家長, 懷疑這兩隻被棄養了. 所以試著餵餵看. 但沒有很愛吃穀粉. 小傢伙不太領情. 會發出刻刻的聲音, 想要嚇退我們?

2024/6/1

結果第二天早上看到家長還是有回來餵小孩. 其實不用我們擔心. 我遠遠地走進房間, 還來不及靠近窗戶近拍, 家長很快又飛走了. 這應該是我們一直沒看見家長的原因.

2024/6/2

聽說小鳥的食物也可以存在嗉囊, 我看這兩隻確實脖子鼓鼓的. 可能是因為這樣才可以不用常常進食? 此時兩隻的毛色也很像成鳥了. 仔細看還是有很多黃毛. 頭比成鳥小, 脖子太細, 腳不夠粗.

2024/6/4

通常牠們都是整天坐著. 我也沒見過牠們闔眼. 不知道有沒有在睡覺. 到了 6/7, 初次看到牠們在巢中站起來. 6/8 兩隻都站起來了, 還站在窗台鍛鐵上, 儼然要發生什麼大事?

原來是家長來教飛行了! 示範飛到對面給牠們看. 來回飛了幾次. 其中一隻已經學會了. 姑且稱牠為大鳩.

2024/6/8

大鳩會飛了, 家長似乎很滿意. 但是二鳩遲遲不飛. 家長又示範了幾下. 連兄弟都啾啾叫地催著牠.

二鳩最後終於下定決定, 奮力飛….但是像自由落體一樣消失在視線中. 我這裡是四樓. 鳩家長也急了飛下去查看~~~ 留下大鳩一頭問號. 最後也飛到對面去. 但大鳩降落技術顯然也還欠熟練. 想飛上冷氣主機, 結果飛不上去. 可能真的沒吃飯. 只好停在屋瓦上.

2024/6/8

二鳩雖然只會往下飛. 但確認沒摔死. 停在二樓高的九重葛上.

2024/6/8

大鳩二鳩都會飛了. 結果晚上巢裡一隻斑鳩都沒有了. 斑鳩養成記宣告結束!