2025年1月5日 星期日

2025 年第 1 周記事

2025 的第一周在忙碌中度過, 週三是元旦, 我 12/31 晚上就回鄉下了, 因為上週三忘記去家樂福買貓糧, 鄉下家的眾貓面臨斷糧, 所以我週二下班直接去家樂福原價買一包帶回去應急, 11 點半回到老家, 先下車查看車庫鐵架上的貓糧罐, 果然空空如也, 趕緊從帶回的那包倒出 1/3 來應急. 週三晚上回到高雄又馬上去家樂福捕貨, 一口氣買了兩大包與兩小包, 但今年週三自有品牌從打八折改為 88 折了, 還好有優惠券補償. 

最近舅媽打電話向水某詢問腦神經外科哪家醫院好, 事後才得知舅媽的親家, 也就是表弟的岳父去接孫子下課時遭到逆向迴轉的汽車撞倒送醫, 開腦後迄今已一個月仍未醒來, 表弟兩夫妻最近為此忙得焦頭爛額. 元旦前一天, 幾乎兩三天就會來公司協助維護的承商工程師中午回家路上被發財車從後面撞擊送高醫救治, 也是開腦, 目前狀況未知. 這位待人和善很好相處的年輕人曾說很羨慕我會寫程式, 我說你也可以學啊! 希望他能順利康復. 

再過十幾天就要進行阿蘭安金事宜, 我昨日 (周六) 早上又去巡墓園, 右側走道又長滿雜草, 還好有帶上打草機三兩下就清潔溜溜了. 





忙了一小時打道回府, 路過製材所對面的早餐店, 突然覺得肚子好餓, 就進去點了一碗粄條, 這家不是放肉片而是放肉燥, 我覺得滋味更好 :




這家原本只做早餐, 後來加做中午自助餐與粄條, 我看 10 點半就陸續有人來包便當, 現在鄉下老人多, 煮一兩個人也費事, 所以蠻多直接來買便當回去吃. 老闆說每天營業到下午兩點, 以後嘴饞就來這裡吃粄條, 因為這是離家最近的板條店. 

我從 "淚之女王" 之後就沒再追韓劇專心學習, 本周因為看到網路上說 "照明商店" 不錯看, 是個只有 8 集的迷你劇, 所以一周就看完了, 原來那些失去意識的人如果來到照明商店找回自己的燈就會回魂甦醒了. 朴寶英真是萬年娃娃臉, 就算演個高中生也完全無礙. 

申辦高科大校友卡

去年底去母校圖書館還書時, 館員告知我的校友借書證今年 2/1 到期後圖書館不再負責發證給校友, 必須去校友中心申請校友證才能繼續借書 (同樣是 30 本), 網址如下 :


點底下申辦流程中的表單連結, 填寫申請單, 上傳照片後轉帳 300 元費用即可, 因為是結合一卡通, 所以需要 30~40 個工作天才會收到校友證 :





我今天已經轉帳匯款, 估計大概要 2 月中才會拿到卡片, 中間若要借還書可請校友中心註記已申辦校友證, 仍可正常進出圖書館借書. 

好書 : Python程式設計與OpenAI API應用

前天逛明儀時看到這本好書 : 


此書的特點是使用非同步技術在 Tkinter 與 Web 介面上串接 OpenAI API 實作聊天機器人, 但因為前半部是講 Python 基礎語法, 且已是 2023 年底出版的老書了, 所以目前沒打算買 (考量書架容量), 但對於剛開始學習 Python 與 OpenAI API 的入門者來說倒是一本好書, 博客來 66 折到 1/31 日. 

Python 學習筆記 : 在 Gradio 與 Streamlit app 上繪製 K 線圖

Python 用來繪製 K 線圖的主要套件是 mplfinance, 它可根據傳入的 OHLCV 價量資料 DataFrame 繪製 K 線, 並提供了豐富的函式可繪製疊圖與副圖, 搭配 Ta-Lib 套件則可在副圖中繪製各種技術指標, 我也寫了一個 kbar.py 模組來簡化畫 K 線圖時的參數設定, 參考 :

但若要同時可在命令列以及 Gradio 與 Streamlit 的 web app 中利用此 kbar.py 繪製 K 線圖的話, 必須改寫之前的 kbar.py, 因為 mplfinance 的 plot() 函式預設傳回 None, 這在命令列執行沒有問題, 但若要在 Gradio 與 Streamlit 的 web app 中使用 mplfinance 畫 K 線圖, 則必須傳入 returnfig=True 參數, 這樣 plot() 函式就會傳回 (fig, ax) 元組, 只要將畫布物件 fig 傳給 Gradio 的 Plot() 函式或 Streamlit 的 pyplot() 函式即可. 修改後的 kbar.py 如下 : 

# kbar.py
import mplfinance as mpf

class KBar():
    def __init__(self, df):
        self.df=df
        self.addplots=[]
    def addplot(self, data, **kwargs):
        plot=mpf.make_addplot(data, **kwargs)
        self.addplots.append(plot)
    def plot(self, embedding=False, **kwargs):
        color=mpf.make_marketcolors(up='red', down='green', inherit=True)   
        font={'font.family': 'Microsoft JhengHei'}   
        style=mpf.make_mpf_style(base_mpf_style='default',
                                 marketcolors=color,
                                 rc=font)
        kwargs['type']='candle'
        kwargs['style']=style
        kwargs['addplot']=self.addplots
        if embedding:
            fig, ax=mpf.plot(self.df, returnfig=True, **kwargs)
            return fig
        else:
            mpf.plot(self.df, **kwargs)

主要是在 KBar 類別的 plot() 方法中添加 embedding 參數, 預設值為 False, 因此在命令列呼叫 plot() 方法時不必傳入 embedding 參數; 但在 Gradio 或 Streamlit app 中則要傳入 embedding=True. 

以下測試使用 yfinance 套件取得台股的 OHLCV 價量資料, 用法參考 :



1. 在 Gradio app 中繪製 K 線圖 : 

Gradio 是 HuggingFace 所維護的開放原始碼 web app 套件, 關於 Gradio 用法參考 :


以下是在 Gradio 中使用 mplfinance 畫 K 線圖範例 :

# gradio_kbar_1.py 
import gradio as gr
import kbar  # 匯入 kbar
import yfinance as yf  # 匯入 Yahoo Finance 
from talib.abstract import RSI, MFI  # 匯入 Ta-Lib 的技術指標類別

def plot_kbar():
    df=yf.download('0050.tw', start='2024-07-01', end='2024-08-21')  # 取得價量資料
    df.columns=[column.lower() for column in df.columns]  # Ta-Lib 要求欄位名稱為全小寫
    kb=kbar.KBar(df)  # 建立 KBar 物件
    rsi=RSI(df)  # 建立 RSI 指標物件
    mfi=MFI(df, timeperiod=14)  # 建立 MFI 指標物件
    if not rsi.isna().all():  # 確保 RSI 有值
        kb.addplot(rsi, panel=2, ylabel='RSI')
    if not mfi.isna().all():  # 確保 MFI 有值
        kb.addplot(mfi, panel=3, ylabel='MFI')
    # 繪製 K 線圖與技術指標副圖    
    fig=kb.plot(volume=True, mav=[3, 5, 7], embedding=True, title='台灣五十')  
    return fig  # 傳回 Figure 物件

iface=gr.Interface(
    fn=plot_kbar,  # 繪製函數
    inputs=[],              # 無需用戶輸入
    outputs=gr.Plot(),      # 輸出為 Gradio 的 Plot 物件
    title='Gradio Candle Chart',
    flagging_mode='never',
    )

iface.launch()

此例在呼叫 KBar 物件的 plot() 方法時傳入 embedding=True 參數, 這樣就會傳回畫布物件 fig, 將其傳回給 Gradio.Plot() 即可在 Gradio app 中顯示 mplfinance 繪製的圖形, 結果如下 :




2. 在 Streamlit app 中繪製 K 線圖 :

Streamlit 是一個輕量好用的 Python web app 套件, 廣泛應用在機器學習, 資料科學, 與人工智慧專案的展示應用上. 下面是在 Streamlit app 中用 mplfinance 繪製 K 線圖範例 : 

# streamlit_kbar_1.py
import streamlit as st
import kbar  # 匯入 kbar
import yfinance as yf  # 匯入 Yahoo Finance
from talib.abstract import RSI, MFI  # 匯入 Ta-Lib 的技術指標類別

df=yf.download('0050.tw', start='2024-07-01', end='2024-08-21')  # 取得價量資料
df.columns=[column.lower() for column in df.columns]  # Ta-Lib 要求欄位名稱為全小寫
kb=kbar.KBar(df)  # 建立 KBar 物件
rsi=RSI(df)  # 建立 RSI 指標物件
mfi=MFI(df, timeperiod=14)  # 建立 MFI 指標物件
if not rsi.isna().all():  # 確保 RSI 有值
    kb.addplot(rsi, panel=2, ylabel='RSI')
if not mfi.isna().all():  # 確保 MFI 有值
    kb.addplot(mfi, panel=3, ylabel='MFI')
# 繪製顯示成交量與 3, 5, 7 日均線之 K 線圖
fig=kb.plot(volume=True, mav=[3, 5, 7], embedding=True)  
st.title("Streamlit Candle Chart")
st.pyplot(fig)

此例在呼叫 KBar 物件的 plot() 方法時傳入 embedding=True 參數, 這樣就會傳回畫布物件 fig, 將其傳給 Streamlit 的 pyplot() 函式即可在 Streamlit app 中顯示 mplfinance 繪製的圖形, 結果如下 :



2025年1月3日 星期五

露天購買多功能刨絲/切菜/切丁器

最近小舅拿來兩顆胡瓜, 通常我都用傳統切絲器將其切絲後烹煮, 但操作時要戴手套, 否則容易刨到手. 今天在露天看到下面這款多功能刨絲/切菜/切丁器覺得很實用就買來用用看 :





全家取貨免運 209 元. 

榮一拉麵

昨天去河堤快走順路去圖書館還書, 經過裕誠路時發現蝦皮智取店隔壁新開了一家拉麵店:




以前會想說改天來吃吃看, 但通常過了好多年都沒進去, 就像龍華國中對面的達樂斯那樣, 所以改天就是今天. 進去看了 Menu, 發現拉麵只有四種選擇, 價格不是 260 就是 280, 還有小菜可加點, 也有提供免費白開水與麥茶 : 




我點了 260 元濃厚雞白湯底的 (加麵不加價), 外加 30 元雞唐揚共 290 元 : 




感覺很不錯, 是可以再次光顧的好吃拉麵店. 

市圖還書 1 本 (耕股 : 價值投資最重要的事)

下面這本書有人預約需還  : 
很好奇明明有很多在館書可立即取得, 為何要預約苦等這本書到期呢? 

此書核心方法是價值投資, 作者是智股網創辦人, 書中建議用七大指標來選股 : 
  1. 過去 8 年實質盈餘趨勢向上
  2. 實質 ROE > 10% 且趨勢平穩或向上
  3. 資盈率 (資本支出/盈餘) 過去8年 < 70%
  4. 獲利含金量 (營業活動現金流量/稅後淨利) > 70%
  5. 近 5 年配息率平均值 > 40%
  6. 毛利率 20% 及實質盈餘利益率 > 6%
  7. 董監持股比率 > 10%
參考 :


有空來回測一下.

2025年1月2日 星期四

露天購買落地燈 x 2

因為鄉下書房的檯燈故障沒時間修, 乾脆上買個落地燈, 由於物件較大無法超取必須宅配 (兩件可合併運費 100 元), 乾脆買兩組一個放高雄臥室讀書用 : 





宅配 633*2 + 100=1366 元. 

2025年1月1日 星期三

Good Bye 2024, Welcome 2025

跨年了! 又來到新的一年做回顧與展望的時刻, 2024 已在剛剛成為時間軸上的歷史標記, 過去這一年是豐盛的一年, 因為學習到很多新知識與技能, 特別是利用 AI 快速完成了公司的軟體專案與重要工程, 職務上獲得了提升, 希望 2025 年能在既有的基礎上繼續推進 AI, 物聯網, 區塊鏈, 與量化投資等領域的學習. 

檢視一年來的筆記, 今年各月主要學習與專案進程回顧如下 :
  • 1 月 : LineBot, Azure AI
  • 2 月 : OpenAI API, OpenCV, Mapleboard 申請域名
  • 3 月 : GAS, OpenAI API 串接, 網頁爬蟲
  • 4 月 : 網頁爬蟲
  • 5 月 : 網頁爬蟲
  • 6 月 : 網頁爬蟲
  • 7 月 : 網頁爬蟲
  • 8 月 : 網頁爬蟲, 量化投資, ESP32
  • 9 月 : Groq/Gemini/OpenAI API 串接, ESP32
  • 10 月 : ESP32
  • 11 月 : ESP32
  • 12 月 : Gradio
花了超過一季的時間終於學完網頁爬蟲並整理了筆記 (寫了三年多的 BeautifulSoup 終於完工啦), 也順便完成了很久以前要寫的圖書館爬蟲程式, 省卻我很多上網查詢借還書與預約狀態的時間. 另外也花了一季的時間在 MicroPython on ESP32 上, 改寫了陳會安老師書裡面的 xtools 模組, 讓 ESP32 也能串接 OpenAI, Groq, 與 Gemini 等 LLM. 明年三月 Line Notify 即將結束服務, 最近也要來研究一下替代方案了. 

2025 年的學習計畫 :
  • Scikit-learn 
  • PyTorch
  • LangChain
  • Streamlit
我看不要訂太多, 根據過往經驗, 能完成上面四項學習就要偷笑了.  


225-01-02 補充 :

另外, 近兩年上了非常多內外訓 AI 技術的直播課程, 老實說左耳進右耳出, 只留下概念而已, 今年要重新回看錄影來深化學習才對.