Python 實戰:下載股價數據與繪製互動圖表|Quant Theory 第 3 講筆記

第 3 課・共 34 課

⚠️ 本站內容僅作教育用途,不構成投資建議。投資涉及風險,作出任何投資決定前請諮詢持牌專業人士。
目錄

這是 Liu Peng 大學級量化交易課程第 1 週第 3 講的筆記,由概念正式轉入 Python 實作。講者在 Google Colab 上示範三件事:以 yfinance 套件下載股價數據、讀取上市公司的元數據,以及用 Plotly 把股價繪成互動線圖與陰陽燭圖——這是之後所有策略實驗的基本功。

學習重點

詳細筆記

實驗環境:Google Colab 雲端寫 Python

講者一開場便交代工具:整個示範在 Google Colab 上進行——Google 提供的免費網上編程平台,以「筆記本」形式組織程式碼,每一段程式(cell)可獨立執行並即時顯示輸出。好處是無須在自己的電腦安裝 Python 環境,開啟瀏覽器即可跟做;平台會儲存工作成果,但設有用量上限。講者動手前先重新啟動 runtime(執行環境),確保由零開始、不受之前執行殘留的變數影響——這是實驗課的好習慣:結果要可由頭重現。

熱身:隨機抽樣與列表推導式

正式處理股價之前,講者先用一節熱身,講幾個貫穿全課的 Python 基礎概念。第一步是引入套件:程式開首用 import 載入 random(隨機數生成)與 numpy(處理陣列格式數據)兩個常用函式庫。

第一個動作是生成隨機數:random.randint(0, 10) 在 0 至 10 之間隨機抽一個整數,每執行一次結果都不同。若要一次生成十個隨機數,講者用了列表推導式 List Comprehension 的寫法——把「重複執行十次」這個意圖寫成一行:

total_order = [random.randint(0, 10) for p in range(0, 10)]
iceberg_order_idx = random.sample(range(len(total_order)), 2)
iceberg_order = np.array(total_order)[iceberg_order_idx]

以上程式碼摘錄自原片教學。這裡有幾個要拆開理解的概念。range(0, 10) 產生 0 至 9 的整數序列:Python 採用零基索引 Zero-based Indexing,由 0 開始數起,而終點值不包括在內,所以 0 至 9 剛好十個數。len() 函數返回列表長度。推導式外層的方括號把重複生成的結果收集成一個列表——講者把這十個隨機數比喻為十張訂單的數量。

以列表推導式生成隨機訂單,再隨機抽取索引識別冰山訂單(截圖出自原片(Liu Peng))

接着是重點動作:按索引抽樣。列表中第一個元素的索引是 0,第二個是 1,如此類推;用方括號傳入索引即可取出對應元素,例如 total_order[2] 取出第三個數。講者用 random.sample(range(len(total_order)), 2) 由 0 至 9 的索引中隨機抽兩個出來,再把這兩個索引傳入 NumPy 陣列取出對應的訂單數量。

為甚麼要這樣做?講者點出實務背景:機構把大額訂單拆細執行時,往往只公開其中幾張子單,其餘隱藏——這正是第 1 講介紹過的冰山訂單 Iceberg Order。上述程式就是在模擬「由一疊子單中隨機決定哪幾張露出水面」。程式基礎與交易概念由此扣連起來,這也是本課一貫的講法。

yfinance:一行程式取得公司元數據

熱身完畢,進入正題:分析股票數據。講者選用的工具是 yfinance——Python 生態中最普及的金融數據套件之一,專門用來從 Yahoo Finance 擷取行情與公司資料。由於 Colab 環境預設未安裝,要先以 !pip install yfinance 安裝(感嘆號是筆記本環境執行系統命令的記法),安裝後用 import yfinance as yf 載入。

第一步是按股票代號 Ticker 取得公司資料。代號是公司的識別符號,例如微軟是 MSFT。講者建立 Ticker 物件後讀取其 info 屬性:

import yfinance as yf
msft = yf.Ticker("MSFT")
msft.info["marketCap"]

以上程式碼摘錄自原片教學。info 返回的內容非常豐富:郵遞區號、行業板塊、所在城市與國家、員工人數、市值等一應俱全——講者形容這是收集公司元數據的便捷途徑。他順帶講解數據格式:這是一個字典 Dictionary,以花括號包住一連串「鍵—值」配對(key-value pairs);想取哪項資料,就把對應的鍵傳入方括號,例如傳入 'marketCap' 便返回市值數字,傳入 'sector' 便返回行業分類。字典是之後處理各類金融數據時反覆出現的結構,值得在這裡記熟。

yfinance 的 Ticker 物件與 info 屬性:以字典形式返回公司元數據(截圖出自原片(Liu Peng))

下載歷史股價:日期、OHLC 與數據維度

元數據之後是行情數據。講者先用 Python 的 datetime 模組取得當日日期,並以「年—月—日」的格式字串輸出;這個日期會作為下載範圍的終點,傳入 download 函數的 end 參數,把微軟的日線股價數據整批下載回來。

下載完成後,講者示範三個檢查數據的基本動作:

六欄分別是開市價 Open、最高價 High、最低價 Low、收市價 Close、調整收市價 Adj Close 與成交量 Volume。前四項合稱 開高低收 OHLC,是一個交易時段價格行為的完整概括;Adj Close 則把股息與拆股等公司行動回溯調整,用來計算跨期回報時較 Close 準確。每一行以一個日期作索引,整份數據本質上是以時間排序的二維表格(pandas 的 DataFrame)。

有了這張表,基本的量化量度便可順手定義。例如第 $t$ 日的簡單回報率:

$$r_t = \frac{P_t - P_{t-1}}{P_{t-1}}$$

其中 $P_t$ 是第 $t$ 日的收市價。一列收市價經這條式子逐日運算,就變成一列回報率——這正是之後各講建立策略與風險模型的原材料。

Plotly 互動繪圖:收市價線圖

數據到手,下一步是「看」。講者選用的繪圖工具是 Plotlygraph_objects 模組,特點是輸出互動圖表而非靜態圖片。第一張圖以日期為橫軸、收市價為縱軸,用 Scatter 的線條模式繪製:

import plotly.graph_objects as go
fig = go.Figure(data=go.Scatter(x=data.index, y=data['Close'], mode='lines'))
fig.show()

以上程式碼摘錄自原片教學。圖表生成後,滑鼠懸停於任何一點,會即時浮現該日的日期與價格;用滑鼠框選某段範圍可以放大,亦可還原縮小。講者特意示範了這些互動操作——對於動輒數百個交易日的序列,能隨意縮放細節比盯着一張靜態圖實用得多。

Plotly 繪製的收市價互動線圖,滑鼠懸停可讀取日期與價格(截圖出自原片(Liu Peng))

疊加成交量:雙軸圖與刻度調校

價格之外,講者把成交量也疊上同一張圖。做法是在原有圖表上以 add_trace 加入一組棒形(Bar)數據:橫軸同樣是日期,縱軸改為成交量。這裡出現一個實際問題——股價以百元計,成交量以千萬股計,兩者量級相差懸殊。若共用同一條縱軸,不是成交量棒形把價格線完全遮蓋,就是其中一方被壓扁得看不見。

解法是副軸 Secondary Y-axis:價格線對應左邊縱軸,成交量棒形對應右邊縱軸,各自有獨立刻度。講者再進一步調校觀感——透過 update_yaxes 把右軸的刻度上限調大(例如設為 0 至 5 億),成交量棒形在視覺上便會縮矮,不再遮擋上方的價格線。這個小技巧背後的觀念是:同一張圖放多組量級不同的數據時,刻度設計本身就是溝通的一部分。

講者不忘補一句:這些繪圖語法無須死記硬背,明白每一步「大致在做甚麼」即可——需要時查文件、按樣修改,是數據工作的常態。

陰陽燭圖:四個價位一支燭

最後一張圖是技術分析最常用的陰陽燭 Candlestick Chart。講者點出其本質:每支陰陽燭其實是一日價格行為的摘要,由開市價、最高價、最低價、收市價四個數字構成。因此繪製時要把 OHLC 四欄分別傳入 Candlestick 圖件的對應參數,橫軸同樣是日期。

Plotly 繪製的陰陽燭圖,框選局部時段可放大觀察(截圖出自原片(Liu Peng))

圖成之後同樣可以縮放:框選某段月份放大,每支燭的燭身與影線便清晰可辨,方便逐一觀察價格在該時段的具體行為。至此,由安裝套件、下載數據到繪出三種圖表,一條完整的「數據 → 觀察」流程便走完了——講者以此作結,預告下一講再續。

🙏 覺得內容有用?本站所有內容免費提供,使用推薦碼開戶就是支持我們繼續營運的最大鼓勵:

ZA Bank 邀請碼 P20923 —— 你享 HKD 2,000 迎新獎賞,本站獲得營運支持。 立即開戶 → (聯盟連結|投資涉及風險,受條款及細則約束,此資料僅可於香港境內分發)

欣利克的看法

名詞解釋

常見問題 FAQ

電腦沒有安裝 Python,可以跟着本講做嗎?

可以。講者全程在 Google Colab 上示範,那是免費的網上編程平台,只需瀏覽器與 Google 帳戶即可使用,無須在本機安裝任何軟件。程式碼以筆記本形式逐段執行,輸出即時顯示,適合初學者邊看邊做;要留意免費層設有資源與時數上限。

收市價 Close 和調整收市價 Adj Close 有甚麼分別?

Close 是當日最後一口成交價的原始記錄;Adj Close 則把股息、拆股等公司行動的因素回溯調整,令不同時期的價格可以連貫比較。若只觀察短期價格走勢,兩者分別不大;但計算跨越除息日或拆股的長期回報時,用 Adj Close 才不易失真。

yfinance 的數據是免費的嗎?可靠嗎?

yfinance 是免費的開源套件,數據來自 Yahoo Finance 的公開頁面,供學習與研究使用綽綽有餘。但它並非官方授權的數據服務:Yahoo 改版時套件可能暫時失效,數據的完整性與即時性亦不設保證。認真的研究或實盤用途,應考慮有服務承諾的付費數據源。

為甚麼要用 Plotly 這類互動圖表?

因為股價序列動輒數百上千個數據點,靜態圖一次過把全部資訊壓在一個畫面裡,細節往往看不清。互動圖表讓你懸停讀取任何一天的確實數值、框選局部時段放大觀察,探索數據時效率高得多。當然,若要輸出到報告或印刷品,靜態繪圖工具仍然有其位置。

原影片

本文整理自以下影片,版權屬原創作者所有,建議配合原片觀看:

來源:https://www.youtube.com/watch?v=ngPjj93B5kE

🏦 ZA Bank 開戶優惠

本站所有內容免費提供。多使用網站的推薦碼,就是對我們繼續製作優質內容的最大鼓勵和支持 🙏

去 ZA Bank 開戶,享價值 HKD 2,000 迎新獎賞,仲有機會享 USD 30 指定美股兌換券!

  • 💛 全線上開戶,無需前往分行
  • 💛 無最低存款要求,零賬戶管理費
  • 💛 24x7 銀行服務

專屬邀請碼:P20923

立即開戶 → (聯盟連結)