跳轉到

MSMP 矩陣資料總覽

所屬章節:MSMP 歷史資料 以 2026-08-20 實際執行結果為準(台股 25 張表、美股 10 張表)

Overview

api.MSMP(台股)與 api.USMSMP(美股)提供矩陣式歷史資料: 每個欄位都是一張 日期(index) × 股票代號(columns) 的 DataFrame。 這是做全市場橫向運算(選股、排名、回測)的資料來源,積木底層用的就是它。

資料放在本地快取,不需要 token;登入時會檢查並更新,之後個別欄位延遲載入。

api.MSMP.日_K.Close            # 屬性存取
api.MSMP.get('日_K', 'Close')  # 字串存取,適合參數化
成員 型態 說明
<表名>.<欄位> DataFrame 日期 × 股票代號 的矩陣
get(table, name) DataFrame 同上,用字串指定
get_table() 印出 列出所有表與欄位
list dict 股池,見 股池
INFO DataFrame 全市場基本資料(代號、名稱、上市日、下市日)
INDEX dict 各頻率的日期序列('D' / 'M' / 'Q')
TSE / OTC 物件 加權 / 櫃買指數(單欄矩陣)
TSE_週 / OTC_週 / TSE_月 / OTC_月 物件 指數的週 / 月頻
DataFrame(df) ProboDataFrame 把一般 DataFrame 包成可與 MSMP 運算的型態
msmp_to_dic(names, *dfs) dict 寬表轉長表,以股票代號分組

Manual Sample Input/Output

Example 1:矩陣長相

input

api.MSMP.日_K.Close.iloc[-3:, :6]

output

DataFrame shape: (3, 6)

            00400A  00401A  00402A  00403A  00404A  00405A
date
2026-08-17 15.0500 13.7000  9.9500 10.4000  9.6300  8.8000
2026-08-18 14.7600 13.4500  9.8700 10.1600  9.5200  8.6000
2026-08-19 14.5100 13.2600  9.6400  9.9700  9.4100  8.4700

index 名稱是 date,columns 是股票代號。完整矩陣為 1000 個交易日 × 2865 檔。

MSMP 只到前一交易日(今天 2026-08-20,最後一列是 2026-08-19)。 要當日盤中資料請用 Data.get 的分K。


Example 2:兩種取法等價

input

api.MSMP.get('日_K', 'Close').shape == api.MSMP.日_K.Close.shape

output

True

欄位名打錯時:

input

api.MSMP.get('日_K', '沒有這欄')

output

ValueError: 在 '日_K' 中找不到名為 '沒有這欄' 的欄位。

Example 3:INDEX 各頻率

input

for k, v in api.MSMP.INDEX.items():
    print(f"{k}: len={len(v)} 最後={v[-1]}")

output

D: len=6579 最後=2026-08-19 00:00:00
M: len=320 最後=2026-09-10 00:00:00
Q: len=107 最後=2026-11-16 00:00:00

M 與 Q 的最後一筆是未來日期(財報/營收的預定公布日)。 這是 screener 的 date='last' 可能取到未來日期的原因,見 執行選股。


Example 4:INFO 全市場基本資料

input

api.MSMP.INFO.head(3)

output

DataFrame shape: (2873, 7)
columns: ['股票代號', '股票名稱', '日期', '市場', 'ETF', '上市日', '下市日']

     股票代號      股票名稱        日期 市場  ETF 上市日 下市日
0  00400A  主動國泰動能高息  20260820  1    1 NaT NaT
1  00401A  主動摩根台灣鑫收  20260820  1    1 NaT NaT
2  00402A  主動安聯美國科技  20260820  1    1 NaT NaT

常用來把代號轉名稱:

name_map = api.MSMP.INFO.set_index('股票代號')['股票名稱'].to_dict()

Example 5:大盤指數是單欄矩陣

input

api.MSMP.TSE.Close.tail(3)

output

DataFrame shape: (3, 1)
columns: ['TSE']

                  TSE
date
2026-08-17 45857.2700
2026-08-18 45308.6800
2026-08-19 44719.3500

指數只有一個 column('TSE' 或 'OTC')。與個股矩陣做運算時, ProboDataFrame 會自動把它廣播成對方的欄位,所以可以直接寫:

# 個股相對大盤的強弱
rel = api.MSMP.日_K.adj_Close / api.MSMP.TSE.adj_Close

Example 6:三張欄位語意特殊的表

這三張表 msmp-tables.md 有列欄位,但用法容易踩錯,單獨說明。

其他_大盤 —— columns 是「法人分類」不是股票代號

api.MSMP.其他_大盤.成交金額_百萬.shape        # (1000, 29)
api.MSMP.其他_大盤.成交金額_百萬.columns
['全體投信', '全體外資', '全體自營', '八大行庫',
 'OTC 投信(股票)', 'OTC 投信', 'OTC 外資(股票)', 'OTC 外資非自營(股票)',
 'OTC 外資自營(股票)', 'OTC 外資', 'OTC 外資非自營', 'OTC 外資自營',
 'OTC 自營(股票)', 'OTC 自營避險(股票)', 'OTC 自營自行(股票)', 'OTC 自營',
 'OTC 自營避險', 'OTC 自營自行', 'TSE 投信', '境內機構',
 '境外機構', '境內華僑', '境外華僑', 'TSE 外資',
 'TSE 外資非自', 'TSE 外資自營', 'TSE 自營', 'TSE 自營避險',
 'TSE 自營自行']

12 個欄位是 成交金額_百萬 / 買入金額_百萬 / 賣出金額_百萬 / 買賣超金額_百萬 的當日、近一週、近一月三個版本。

不要拿它跟個股矩陣相除。 兩邊沒有共同 column,相除得到的是 0 欄的空矩陣,而且不會報錯——這正是 v24 積木曾經永遠選不到股票的原因, 見 block-caveats.md 第 11 節。

要算「個股佔大盤成交比重」請用個股自己加總:

stock_value = api.MSMP.日_K.成交額_百萬
ratio = stock_value.div(stock_value.sum(axis=1), axis=0) * 100

其他_籌碼集中 —— 12 個時間窗 × 3 個指標

37 欄 = 籌碼集中度 / 主力買賣超張數 / 家數差 各 12 個窗 (1/2/3/4/5/10/20/60/100/120/180/240 日)+ 家數和。

api.MSMP.其他_籌碼集中.籌碼集中度_20日['2330'].dropna().iloc[-1]     # -1.70
api.MSMP.其他_籌碼集中.主力買賣超張數_5日
api.MSMP.其他_籌碼集中.家數差_20日

矩陣是 (1000, 2451),起始日比 日_K 晚(2022-08-23 vs 2022-07-08)—— 需要暖身期的指標都會這樣,跟 日_K 做運算前先確認 index 對齊。

日_CAPM —— 9 個期間的 Beta

api.MSMP.日_CAPM.Beta一年['2330'].dropna().iloc[-1]      # 1.0926

欄位:Beta一月、Beta二月、Beta三月、Beta六月、Beta九月、 Beta一年、Beta二年、Beta三年、Beta五年。矩陣 (1000, 2175)。

(1000, 2451) / (1000, 2175) 的欄數都少於 日_K 的 2866。 需要計算期間的表覆蓋的股票比較少(新上市、興櫃常缺)。 跨表運算後記得 .dropna(),不然會拿到一堆 NaN。


相關文件