Python 實戰:下載股價數據與繪製互動圖表|Quant Theory 第 3 講筆記
第 3 課・共 34 課
目錄
這是 Liu Peng 大學級量化交易課程第 1 週第 3 講的筆記,由概念正式轉入 Python 實作。講者在 Google Colab 上示範三件事:以 yfinance 套件下載股價數據、讀取上市公司的元數據,以及用 Plotly 把股價繪成互動線圖與陰陽燭圖——這是之後所有策略實驗的基本功。
學習重點
- 免安裝的實驗環境:Google Colab 是免費的網上 Python 平台,無須在本機安裝環境即可寫程式做數據分析。
- 隨機抽樣的程式概念:用
random與列表推導式生成訂單序列,再按索引隨機抽取子單——對應第 1 講提過的冰山訂單情境。 - yfinance 取得兩類數據:
Ticker物件讀取公司元數據(市值、行業等),download函數下載開高低收與成交量的歷史數據表。 - 數據結構意識:股價數據以日期為索引的二維表格存放,學會用
head、tail、shape檢查內容與維度。 - 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() 函數返回列表長度。推導式外層的方括號把重複生成的結果收集成一個列表——講者把這十個隨機數比喻為十張訂單的數量。

接着是重點動作:按索引抽樣。列表中第一個元素的索引是 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' 便返回行業分類。字典是之後處理各類金融數據時反覆出現的結構,值得在這裡記熟。

下載歷史股價:日期、OHLC 與數據維度
元數據之後是行情數據。講者先用 Python 的 datetime 模組取得當日日期,並以「年—月—日」的格式字串輸出;這個日期會作為下載範圍的終點,傳入 download 函數的 end 參數,把微軟的日線股價數據整批下載回來。
下載完成後,講者示範三個檢查數據的基本動作:
data.head():查看開首幾行,確認數據的欄目結構;data.tail():查看最後幾行,確認數據更新到哪一天——講者錄影當日是 1 月 6 日,最後一行是前一個交易日,因為當日尚未收市;data.shape:查看維度,結果是 254 行乘 6 欄,即 254 個交易日、六項數據。
六欄分別是開市價 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 互動繪圖:收市價線圖
數據到手,下一步是「看」。講者選用的繪圖工具是 Plotly 的 graph_objects 模組,特點是輸出互動圖表而非靜態圖片。第一張圖以日期為橫軸、收市價為縱軸,用 Scatter 的線條模式繪製:
import plotly.graph_objects as go
fig = go.Figure(data=go.Scatter(x=data.index, y=data['Close'], mode='lines'))
fig.show()
以上程式碼摘錄自原片教學。圖表生成後,滑鼠懸停於任何一點,會即時浮現該日的日期與價格;用滑鼠框選某段範圍可以放大,亦可還原縮小。講者特意示範了這些互動操作——對於動輒數百個交易日的序列,能隨意縮放細節比盯着一張靜態圖實用得多。

疊加成交量:雙軸圖與刻度調校
價格之外,講者把成交量也疊上同一張圖。做法是在原有圖表上以 add_trace 加入一組棒形(Bar)數據:橫軸同樣是日期,縱軸改為成交量。這裡出現一個實際問題——股價以百元計,成交量以千萬股計,兩者量級相差懸殊。若共用同一條縱軸,不是成交量棒形把價格線完全遮蓋,就是其中一方被壓扁得看不見。
解法是副軸 Secondary Y-axis:價格線對應左邊縱軸,成交量棒形對應右邊縱軸,各自有獨立刻度。講者再進一步調校觀感——透過 update_yaxes 把右軸的刻度上限調大(例如設為 0 至 5 億),成交量棒形在視覺上便會縮矮,不再遮擋上方的價格線。這個小技巧背後的觀念是:同一張圖放多組量級不同的數據時,刻度設計本身就是溝通的一部分。
講者不忘補一句:這些繪圖語法無須死記硬背,明白每一步「大致在做甚麼」即可——需要時查文件、按樣修改,是數據工作的常態。
陰陽燭圖:四個價位一支燭
最後一張圖是技術分析最常用的陰陽燭 Candlestick Chart。講者點出其本質:每支陰陽燭其實是一日價格行為的摘要,由開市價、最高價、最低價、收市價四個數字構成。因此繪製時要把 OHLC 四欄分別傳入 Candlestick 圖件的對應參數,橫軸同樣是日期。

圖成之後同樣可以縮放:框選某段月份放大,每支燭的燭身與影線便清晰可辨,方便逐一觀察價格在該時段的具體行為。至此,由安裝套件、下載數據到繪出三種圖表,一條完整的「數據 → 觀察」流程便走完了——講者以此作結,預告下一講再續。
🙏 覺得內容有用?本站所有內容免費提供,使用推薦碼開戶就是支持我們繼續營運的最大鼓勵:
ZA Bank 邀請碼 P20923
—— 你享 HKD 2,000 迎新獎賞,本站獲得營運支持。
立即開戶 →
(聯盟連結|投資涉及風險,受條款及細則約束,此資料僅可於香港境內分發)
欣利克的看法
- 下載與繪圖是「觀察」,不是「訊號」。 本講的取數據、畫線圖、畫陰陽燭,都只是把已發生的價格呈現出來,沒有任何一步構成買賣建議。初學者最易犯的錯,是把「看到圖形的形狀」當成「預測未來的依據」;按第 1 講的框架,這些只是輸入層的準備,距離經回測驗證的模型仍遠。
- Close 與 Adj Close 之別是常見誤區。 不少人隨手用 Close 計算長期回報,忽略股息與拆股會令價格出現非市場因素的斷層。Adj Close 已把這些公司行動回溯調整,跨年度分析時用錯一欄,結論可以相差甚遠。
- 免費數據源有時效與穩定性風險。 yfinance 並非 Yahoo Finance 官方產品,而是社群維護的擷取工具——Yahoo 一旦改版,套件便可能失效。影片於 2023 年初錄製,示範寫法與現時或有出入,遇錯誤宜先查套件最新文件。
- 互動圖與靜態圖各有所長。 Plotly 的懸停讀數與框選縮放適合探索數據;放進報告或印刷品則以 matplotlib 一類靜態工具較易控制版面。按用途選工具即可。
- 免費平台的限制要心中有數。 Colab 免費層的資源與時數設有上限,閒置後執行環境會被回收。小型實驗綽綽有餘,日後跑大規模回測便要考慮本機環境或付費方案。
名詞解釋
- 開高低收 OHLC:一個交易時段內開市價、最高價、最低價、收市價四個價位的統稱,是股價數據表與陰陽燭圖的基本結構。
- 陰陽燭 Candlestick:以 OHLC 四個價位記錄一段時間價格行為的圖表形式,又稱 K 線。
- 成交量 Trading Volume:指定時間內某證券實際成交的股數或合約數量,反映市場參與程度。
- 市值 Market Capitalization:股價乘以已發行股數的總額,用來量度上市公司規模。
- 冰山訂單 Iceberg Order:只顯示小部分數量的大額訂單,隱藏部分成交後逐批補充,掩飾真實交易規模。
常見問題 FAQ
電腦沒有安裝 Python,可以跟着本講做嗎?
可以。講者全程在 Google Colab 上示範,那是免費的網上編程平台,只需瀏覽器與 Google 帳戶即可使用,無須在本機安裝任何軟件。程式碼以筆記本形式逐段執行,輸出即時顯示,適合初學者邊看邊做;要留意免費層設有資源與時數上限。
收市價 Close 和調整收市價 Adj Close 有甚麼分別?
Close 是當日最後一口成交價的原始記錄;Adj Close 則把股息、拆股等公司行動的因素回溯調整,令不同時期的價格可以連貫比較。若只觀察短期價格走勢,兩者分別不大;但計算跨越除息日或拆股的長期回報時,用 Adj Close 才不易失真。
yfinance 的數據是免費的嗎?可靠嗎?
yfinance 是免費的開源套件,數據來自 Yahoo Finance 的公開頁面,供學習與研究使用綽綽有餘。但它並非官方授權的數據服務:Yahoo 改版時套件可能暫時失效,數據的完整性與即時性亦不設保證。認真的研究或實盤用途,應考慮有服務承諾的付費數據源。
為甚麼要用 Plotly 這類互動圖表?
因為股價序列動輒數百上千個數據點,靜態圖一次過把全部資訊壓在一個畫面裡,細節往往看不清。互動圖表讓你懸停讀取任何一天的確實數值、框選局部時段放大觀察,探索數據時效率高得多。當然,若要輸出到報告或印刷品,靜態繪圖工具仍然有其位置。
原影片
本文整理自以下影片,版權屬原創作者所有,建議配合原片觀看: