Friday, February 06, 2026

從單機到雲端:台股大盤監控系統自動化實錄

📌 背景與動機

身為一名曾經擔任 QA Engineer目前專注投資的散戶(笑),穩定性與精確度是我的職業本能。原本運行在單機環境的台股監控腳本(twstock.py),雖然能產出精準的台股診斷,但為了實現每日自動化交付(CI/CD)且不佔用本機資源,我決定將其遷移至 GitHub Actions

🛠 技術棧與工具

  • 語言:Python 3.12

  • 數據源:yfinance (行情)、證交所 API (融資/法人)、財報狗 (大盤估值)

  • 自動化:GitHub Actions (CI/CD)

  • 通知:Discord Webhook


📝 核心優化工作回顧

1. 視覺排版與 UI 還原

在雲端環境中,Discord 的訊息格式與單機終端機有所不同。

  • 多行診斷邏輯:還原了精美的 43MA 監控面板,包含「當前指數」、「生命線」與「乖離率」的階層式呈現。

  • 診斷狀態自動化:根據乖離率區間自動判定 🟢【趨勢延續】、🚨【極度過熱】或 🔥【超跌區】,並提供對應的操作建議。

2. 多源數據整合(Refactoring)

遷移過程中,為了確保數據的穩定性與正確性,進行了多次重構:

  • 估值修復:捨棄了不穩定的證交所原始 JSON API,改為整合**財報狗(StatementDog)**的爬蟲邏輯,精確抓取「成交金額」、「PBR」與「PER」。

  • Bug 排除(Unit Testing 思維):修正了數據整合時產生的「單位重複(倍倍)」問題,確保輸出資訊的 Clean Code。

3. 雲端環境適配與運維

  • Secrets 隔離:將敏感的 Discord Webhook URL 透過 GitHub Actions Secrets 加密保護,符合資安標準。

  • 時區處理:解決了 GitHub Ubuntu Runner 預設 UTC 時間與台北時間(UTC+8)的差異問題。

  • 長訊息切割邏輯:針對 Discord 單則訊息 2000 字的限制,實作了自動切割發送功能,確保報表內容不因字數溢位而遺失。

4. GitHub Actions 性能觀察

  • Schedule 延遲分析:觀察到 GitHub Free Tier 的 Cron Job 存在排隊(Delay)現象(如 21:05 設定可能延至深夜執行),後續將考慮透過「避峰策略」優化觸發時間。


📊 最終成品展示

系統現在每晚會自動將以下資訊彙整為一則精美報表發送至 Discord:

  1. 融資餘額與增減趨勢

  2. 大盤估值組合 (成交量、PBR、PER)

  3. 43MA 乖離監控診斷

  4. 11 項核心標的 KD 掃描 (含 K 值買賣觀望建議)

  5. ETF 折溢價與期貨淨額監控

  6. 美債殖利率與外資買賣超排行



💡 結語

重點來了,這兩天跟Gemini一起vibe coding搬遷python到雲端,連最後的工作日誌也幫我寫好了~ 這個時代真的是要懂AI怎樣用才可以大大增加生產力呀!

Thursday, October 02, 2025

台股大盤表現

好久沒更新自己的股市小幫手了,今天加入的台股的成交量, PER與PBR。
並且判斷當PER > 17 or PBR > 2時顯示為紅字,表示目前台股整體股價較偏貴,風險略高。


Wednesday, May 28, 2025

Vibe coding (台股每日收盤整理)

 最近跟ChatGPT一起合作(vibe coding),ChatGPT負責生成程式碼,我負責收集資料的來源並除錯與修改部份的程式碼(我本來就是QA人員這點我很熟門熟路),在這樣的開發背景下大幅降低了開發門檻與提高了開發速度!當然如果使用者本身具備一定的程式知識還可以受益良多。

我非常喜歡這樣的工作方式,也相信這是未來的走向。

Screenshots:

搭配crontab每日15:05執行並寫入log file.


最後還可以請ChatGPT做個總結:

Wednesday, November 27, 2024

用Python搭配BeautifulSoup取得台股大盤當日的漲幅

廢話不多說,最近利用Python+BeautifulSoup去爬台股大盤的靜態資料,過程用ChatGPT幫我除錯。


Tuesday, November 26, 2024

在Ubuntu看盤

 之前一直想用Bottles+Wine在Ubuntu裝上三竹來看盤(沒錯~我暫時脫離了科技業,現在是個全職投資者),可是一直碰到問題而無法順利運行。

今天想想那就改用VirtualBox+Windows的老方案好了,不過安裝時碰到了2個問題在此紀錄一下。


問題:

1. Ubuntu OEM Kernel不支援virtualbox-dkms

Workaround: 切去generic Kernel就可以安裝好。


2. 要運行VirtualBox時遇到被KVM佔用住資源

Workaround: 

sudo rmmod kvm && rmmod kvm-intel -> 失敗!想了一下原來是卡到multipass,所以把它先暫停

sudo snap stop multipass -> 成功


後記:

缺點是我不能同時使用multipass...... :(

Tuesday, June 04, 2024

How to use GUI in Ubuntu Multipass

Currently, Multipass does not provide a complete graphical interface for use like virtual machine software such as VMware or VirtualBox.

Of course, there are alternative solutions. You can connect to a Multipass instance using RDP, VNC, or X forwarding methods.

Here, I will use the X forwarding method, so when I need to use a GUI, I can launch the graphical interface of the relevant app from the CLI.

Step1. Create an SSH public key on your local machine 

Monday, May 13, 2024

Enhanced version of Ubuntu Multipass

A long time ago, there was an introduction on how to use Ubuntu's Multipass. If you're interested, you can refer to the following link below:

https://go-linux.blogspot.com/2020/06/canonicalmultipass.html


Today, I'm here to introduce to you the enhanced version of Multipass (currently in the beta channel of Snap).


1. Install it from snap beta channel:

Monday, May 06, 2024

安裝Ubuntu 22.04到新的X1

前幾天把舊X1的Ubuntu升級到22.04後體驗上還不錯,所以今天早上就把new X1也安裝了Ubuntu 22.04並且一樣保留Windows作業系統。(雙系統)

以下稍微紀錄一下我的步驟:

1. 關閉Windows的Bitlocker

2. 透過Windows內建的磁碟管理程式 -> 壓縮現有磁碟區 -> 分割出新的磁碟區 (之後裝Ubuntu)

3. 進入BIOS關閉Secure boot

4. 用Ubuntu 22.04的USB flash開機 

5. 選擇保留Windows boot loader跟grub一起,並且把Ubuntu安裝到步驟#2的磁碟區


之後就很順利完工囉~ 這篇文章就是用new X1+Ubuntu打的 :D

Friday, May 03, 2024

20.04.6 LTS to 22.04.03 LTS 筆記

今天把一台很久沒用的X1 laptop從Ubuntu 20.04.6 LTS升級到22.04.03之後,目前發現到兩個問題:

1. 無法使用gnome-terminal與terminator

爬了一下文看到很多人也遇到類似的問題,有人分享更改預設語言的方法然後重新開機並登入後可以解決,但我試了好幾次都失敗,後來發現當我開啟Settings -> Region & Language -> Manage Installed Languages之後視窗會直接crash,用Xterm直接執行gnome-terminal看到有error,最後死馬當活馬醫把我最懷疑的gcin移除掉並重新開機登入後gnome-terminal與terminator就正常了!沒想到這招有用!


2. 無法開啟Chrome

解決的方法就很簡單,重新下載並安裝吧!

wget -c https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb

sudo dpkg -i google-chrome-stable_current_amd64.deb

sudo apt-get install -f


先這樣吧,之後有碰到其它問題的話會再陸續update~~


Friday, March 29, 2024

I am back~

Hi, I'm back. It's been a long time since the last update. I'm curious, is anyone still reading the blog now? Very curious. :)

Wednesday, August 19, 2020

利用nmcli連接802.1X wlan

 

由於公司內部實在太多AP跟SSID了,在UC18 GNOME的環境一開NetworkManager scan wifi就會整個hang住,稍微研究了一下怎麼用nmcli的方式連上一個802.1X WLAN。


$ nmcli con add type wifi ifname <wifi interface> con-name <connection_profile> ssid <SSID>

$ nmcli connection edit id <connection_profile>


nmcli> set ipv4.method auto

nmcli> set 802-1x.eap peap

nmcli> set 802-1x.phase2-auth mschapv2

nmcli> set 802-1x.identity USERNAME

nmcli> set 802-1x.password PASSWORD

nmcli> set wifi-sec.key-mgmt wpa-eap

nmcli> save

nmcli> activate


搞定,收工。

Tuesday, June 23, 2020

關於Canonical的Multipass

Multipass可以幫助Linux user快速架設起一個虛擬機器來做測試用,它類似VMWare, KVM, VirtualBox這些虛擬機器的技術,不過確有著docker的使用經驗。一個命令就可以讓user無痛叫起一台虛擬機器來使用,以下列出我常使用的命令。


1. 安裝Multipass:
$ snap install multipass --classic

2. 查詢有哪些image可以使用?
$ multipass find










3. 新增虛擬機器:
$ multipass launch 20.04






以上可以看到我的系統剛剛新增了一台Ubuntu 20.04 LTS的機器(appealing-escolar),而且已經啟動了。

4. 進入虛擬機器的shell
$ multipass shell appealing-escolar




















5.傳檔案給指定的虛擬機器:
$ multipass transfer testfile shipshape-bat:















更多指令與功能請參考 --help

$ multipass --help

Wednesday, March 11, 2020

How can I setup a snmptrap receiver server on Ubuntu Server 18.04?

之前有介紹過如何在Ubuntu Server 18.04建立一個SNMP agent讓SNMP Manager可以做get request的動作,請參考此篇: How can I setup a SNMP server on Ubuntu Server 18.04

現在來補足一下如何在Ubuntu Server 18.04實作snmptrap receiver server.

Step1. 安裝snmptrapd
$ sudo apt install snmptrapd
Step2. 配置snmptrpad可以接收agent送過來的event
$ vi /etc/snmp/snmptrapd.conf
authCommunity log,execute,net public
以上,我只開啟IPv4 + snmp version 2c

Step3. 重啟snmptrapd
$ sudo systemctl restart snmptrapd

Step4. 檢查port 162 active (UDP port 162是snmptrap, 161是snmp get,getnext,set)
$ sudo netstat -tupln | grep 162
udp        0      0 0.0.0.0:162             0.0.0.0:*                           2100/snmptrapd 
Step5. 遠端送出一個snmptrap的event
這裡我用CentOS8安裝Net-SNMP的基本工具snmptrap後,送出一個snmptrap example command.
# snmptrap -d -v 2c -c public 192.168.1.151 "" UCD-SNMP-MIB::ucdStart message s "/ disk utilization exceed 90%"
 Step6. 檢查Ubuntu Server 18.04有沒有收到此event?
$ sudo tail -f /var/log/syslog | grep snmptrap
Mar 11 16:07:06 us18 snmptrapd[2100]: 2020-03-11 16:07:06 [UDP: [192.168.1.132]:51067->[192.168.1.151]:162]:#012iso.3.6.1.2.1.1.3.0 = Timeticks: (194731) 0:32:27.31#011iso.3.6.1.6.3.1.1.4.1.0 = OID: iso.3.6.1.4.1.2021.251.1#011iso.3.6.1.4.1.2021.10.1.101 = STRING: "/ disk utilization exceed 90%"
That's all!

如何讓Virtualbox下的虛擬機器透過實際無線網卡取得IP? (透通模式)

先稍微提一下會想這樣做的原因是因為愈來愈多的laptop已經不提供Etherenet port,尤其是一些比較強調輕量級的laptop,所以如果不買USB or USB Type-C轉Ethernet port的話,基本上只能透過wireless interface去連接網路。

對於一般的user來說這沒什麼大不了,所謂人人家裡都有wifi(沒有的話快去買一台Ruckus AP),但就算真的沒有wifi好了,user也可以透過手機開熱點讓laptop來連上網路。

但是對於我們這些常常需要跑VM的engineer來說是有一點困擾,因為預設上就算你設定好虛擬機器的網卡bridge到實際的wireless NIC,你還是拿不到IP address.... (至少我遇到的狀況是這樣),當然這時候可以透過NAT mode讓虛擬機器的網卡可以連上網路,但是有時候透通模式才是我們需要的。

怎麼解決呢?其實非常簡單,就是把你真實wireless NIC的MAC address設定到虛擬機器的MAC address就好了,以下我用VirtualBox在Ubuntu 18.04.4 LTS來演練一下:

Step1. 取得真實wireless NIC的MAC address:


Step2. 開啟VirtualBox -> 選擇虛擬機器 -> Settings -> Network -> Advanced -> MAC address

以上填入Step1列出的MAC address.

Step3. 開機或重新啟動虛擬機器

看到了嗎? 虛擬機器內的網卡已經透過實體的wireless NIC取得IP address並且可以連上Internet.

再來用實體機器來ping一下虛擬機器:


可以開始快樂的使用了,這個小技巧希望對大家有幫助。

Friday, February 21, 2020

Turn on wireless monitor mode to capture wireless packets in Ubuntu

Wireshark在預設上是不能正確顯示無線網路的封包格式,所以如果你直接抓取wifi interface只會看到ethernet的訊框而不是802.11相關的格式。

那怎麼做呢?其實只要把wifi interface轉成monitor mode就可以了,以下嘗試在Ubuntu desktop底下實作看看:

Step1. 針對wifi NIC(wlan0)新增一個對應的monitor interface(mon0):
$ sudo iw dev wlan0 interface add mon0 type monitor

Step2. 啟動mon0 interface:
$ sudo ifconfig mon0 up
之後去啟動wireshark就會看到mon0 interface並透過它來抓802.11的封包了。

How can I setup a SNMP server on Ubuntu Server 18.04

在這篇短文中,紀錄一下如何在Ubuntu Server 18.04配置一台SNMP server同時支援snmpv2與v3,之後若有機會在補齊如何收遠端機器所發出來的snmp trap event。

Step1. 安裝:
$ sudo apt update
$ sudo apt install snmp snmpd snmp-mibs-downloader

Step2. 配置snmpd.conf:
$ sudo vi /etc/snmp/snmpd.conf
# 允許all net來連線 (IPv4+IPv6)
agentAddress udp:161,udp6:[::1]:161
# SNMP v2:
rocommunity public  default    -V systemonly
# SNMP v3:
createUser ubuntu MD5 1234567890
rouser ubuntu

Step3. 重啟snmpd 
$ sudo systemctl restart snmpd

Step4. 測試 SNMP v2與v3 lookup:
# SNMP v2
 $ snmpwalk -v 2c -c public 127.0.0.1
# SNMP v3:
$ snmpwalk -v 3 -a MD5 -A 1234567890 -u ubuntu -l auth 127.0.0.1

Note: 以上由於我都是在本機測試,所以IP為127.0.0.1

Wednesday, February 19, 2020

How can I setup a DNS server on Ubuntu Server 18.04

以前都在紅帽圈設定與架設DNS server,今天筆記一下如何在Ubuntu Server安裝與架設一個master DNS server。

Step1. 安裝DNS server
$ sudo apt install bind9

Step2. 新增Zone 
$ cd /etc/bind9
$ sudo vi zones.example.com
zone "example.com" {
    type master;
    file "/etc/bind/db.example.com";
};
Step3. 將新增的Zone加入到DNS server
$ sudo vi named.conf.local
include "/etc/bind/zones.example.com";
Step4. 建立zone file
$ sudo vi db.example.com
$TTL    86400
@      IN  SOA server1.example.com. root.server1.example.com. (
                  1     ; Serial
                 86400     ; Refresh
                 3600     ; Retry
                 2419200     ; Expire
                 84600 )   ; Negative Cache TTL
       IN  A      10.10.10.253
       IN  NS     server1.example.com.

server1    IN  A      10.10.10.253
x1            IN  A      10.10.10.100

Step5. 重新啟動DNS server
$ sudo systemctl restart bind9


以下開始來測試囉!
Step1. 將DNS指向localhost
$ sudo vi /etc/netplan/50-cloud-init.yaml
network:
    ethernets:
        enp0s3:
            dhcp4: true
            nameservers:
                addresses: [127.0.0.1, 168.95.1.1]
    version: 2
$ sudo netplan apply

Step2. 來個正解查詢:
$ host server1.example.com
server1.example.com has address 10.10.10.253