# SnowyOwl - 台美股資料、積木選股與回測整合套件 > SnowyOwl 文件索引,以 2026-08-20 實際登入執行結果核對。涵蓋登入、積木選股(台股 405 個、美股 260 個,全部實測 screener 可正確執行)、表格式資料查詢、矩陣式歷史資料與回測綁定,供 LLM coding agent 快速查找 API usage documentation。 > SnowyOwl **不含下單功能**,`api` 上不存在 `Order`。USData 與 backtest_plus 的細節指向各自既有的文件集,不重複撰寫。 > 如需完整單一文件,請使用 llms-full.txt。 > > **要寫回測的話,先看 [docs/recipes.md](docs/recipes.md)** —— > 七份實跑驗證過、照抄就能執行的完整腳本,涵蓋 sample.md 的五個案例, > 省掉從六篇文件拼骨架的時間。 > > **回測的預設做法**(使用者通常只用白話描述,不會指定):條件先對應到積木([docs/block-reference-tw.md](docs/block-reference-tw.md)),找不到才手寫並標明;跑完一律產儀表板 `rp.dashboard(path=..., view='web')`;指標寫進 `self.char`/`self.char1` 才會畫在 K 線上;期貨要設 `tick_map=[(inf,1)]`、結算棒 `compel_now` 強平、多空反手拆成平倉+開倉兩張單。不要先讀整份 llms-full.txt,先找 recipes.md 對應的配方。 ## 入門與結構 - [開始使用 SnowyOwl](docs/getting-started.md): `import snowyowl as so; api = so.login()`;**先分流**(查事實走 MSMP/組條件走積木/驗規則走回測);四個實測範例;五個命名空間與文件導覽;三個最常踩的坑(單位、日頻 1000 筆上限、沒有的資料) - [怎麼問,才問得到你要的東西](docs/how-to-ask.md): 三組案例(單檔技術指標/選股輪動/期貨)的「小白版 a → 進階版 b」對照;萬用句「先照我說的做,跑完告訴我這個規格有什麼缺陷」;三句原則(做多因子、可交易性過濾、目標權重輪動);每次回測都該問的兩句 - [怎麼制定一個 plan](docs/how-to-plan.md): 六階段研究流程——定義問題→資料盤點→資料清洗→特徵工程→訊號驗證→回測;倖存者偏差、單位換算、極端值;percentile 合成與 union→ffill→reindex 對齊;IC 與分組單調性;「每一階做完先給我結果再繼續」 - [案例集:小白怎麼問回測](docs/case-study-backtest.md): 三個回測案例的完整程式碼——月營收選股(unit 配錯差 1000 倍)、台指期 TXF(四個專屬規格)、組合回測+參數尋優(Strategy 欄與過度配適) - [配方集:照抄就能跑的完整腳本](docs/recipes.md): **要寫回測先看這頁**,把散在六篇裡的東西拼好了。`daily_bars()` 標準函式、成本速查表;七個實跑驗證過的完整腳本——單檔技術指標(固定金額)、積木訊號進出場、多檔組合、期貨雙均線多空反手(結算日出場、多空分開看損益)、目標權重輪動(**零股 vs 整股**:小資金只能零股)、訊號驗證(IC 與分組單調性)、參數尋優(含前後兩段分別驗);三個只有實跑才知道的坑——`index_str_to_date()` 轉月季頻字串 index(含下市遮蔽)、`corrwith` 要先 `pd.DataFrame()` 脫殼否則炸 ProboDataFrame、單策略時報表欄名是 `Strategy`;跑完一定要回答的三件事(毛損益與成本佔比、實際回測期間、曝險率) - [so.login 登入](docs/login.md): `so.login(person_id, person_pwd, type=account/google/apple)`、帳密與社群登入、快取、登入訊息逐行說明、`api.logout()` - [api 物件結構](docs/api-structure.md): 7 個命名空間完整屬性表,以及 SnowyOwl 的能力邊界 - [錯誤訊息速查](docs/errors.md): 每則訊息都是實際觸發的原文;**`con()` 驗規格、`screener()` 驗 class** 是兩層;積木/Data/MSMP/回測四類錯誤對照;最後一節「**不報錯但結果是錯的**」13 項——選股永遠 0 檔、改 capital 沒反應、成本收兩次稅、名目金額差 1000 倍、月營收差 100 倍、`head(5)` 不是排行、美股漲幅排行全是雜訊… ## 積木 Block(選股) - [積木 Block 總覽](docs/block.md): `api.Block` 四步流程(get_table → con → screener → 取用),台股/美股方法對照 - [list_conditions 積木清單查詢](docs/block-list-conditions.md): `from snowyowl.blocks import list_conditions` 回 `ConditionMetadata`;**已不在 `api.Block` 上**;category 只吃英文模組名 - [Block.get_table 積木參數與合法值](docs/block-get-table.md): `get_table_tw()` 回 `{積木名稱: {'id': 編碼, 參數: [合法值]}}`;台美股同名積木參數不同;規格固定值不在表內 - [Block.con 組積木](docs/block-con.md): `con_tw(name, **params)` / `con_tw(id='a1', ...)` / `con_tw({'id':'a1', ...})` 三種寫法輸出相同;參數驗證、中文標籤、negate 取負、規格固定值(自動帶入)、冪等 - [Block.screener 執行選股](docs/block-screener.md): `screener_tw(block_list, pool, date)` 回 `code`/`dataframe`/`date`/`sig`;多積木 AND;零命中是 `(0, 0)`;用 `sig` 欄數分辨「條件嚴格」與「積木壞了」 - [Block 股池 pool](docs/block-pool.md): `pool=['all', '~etf']` 的 `~` 排除語法、8 個股池名稱與檔數 - [通用積木(自訂比較)](docs/block-auto.md): **原生積木表達不了時先看這頁**——`a1/a2/a3` 三顆把 data/rolling/agg/shift/百分比/常數/連續/排行全部參數化,`left`/`right` 直接填 `'表.欄'`;29 條實測(KD/MACD/RSI/布林/ADX/K棒型態/財報/營收/排行)全部組得出來;四個翻譯陷阱(排除要寫成 >、為 0 是 ==、rank 的 pool 要和 screener 一致、月季頻自動轉日頻) - [Block 產生的程式碼 code](docs/block-codegen.md): `code` 自給自足(開頭 `msmp = api.MSMP`、helper 直接寫成函式定義),作用域只要有 `api`;`exec` 後與 screener 結果一致(665/665 可編譯) - [Block 已知落差與注意事項](docs/block-caveats.md): 全量驗證基準(665 個積木 screener + codegen 全通過)+ 實測落差——預設值正規化(已修)、`list_conditions` 比 `get_table` 多(停用 vs 漏登)、category 兩套詞彙、共用 id 的積木哪些是錯誤哪些是別名、6 個標啟用卻被靜默丟棄、8 個複合值固定參數未收錄、v24 的大盤總額定義、**積木名稱可能與實際邏輯不符**(`o6` 名為漲跌幅實為近 20 日、`percent1` 是上界) - [台股積木完整參考](docs/block-reference-tw.md): 405 個台股積木,依中文次類別分 37 組,含 id、邏輯模板、詳細說明、參數合法值與預設值 - [美股積木完整參考](docs/block-reference-us.md): 260 個美股積木,含 id、邏輯模板、詳細說明、參數合法值與預設值 ## Data 表格查詢 - [Data 模組總覽](docs/data.md): `api.Data` / `api.USData` 三個方法,以及與 `api.MSMP` 的分工 - [Data.get_table 列出可用表格](docs/data-get-table.md): 台股**共 80 張**表完整清單,含先前漏收的 14 張(分點籌碼 5 張、大盤法人 2 張、盤中逐筆明細 6 張、產業個股清單);參數標記怎麼讀;`產業個股清單` 傳錯 sector 會拋誤導的 `KeyError: 'symbol'` - [Data.get 取得表格資料](docs/data-get.md): `get(table, *args)` 五個範例(清單、還原日K、季財報、分K)與兩種錯誤訊息 - [資料頻率與歷史長度](docs/data-history.md): **日頻硬上限 1000 筆(約 4.1 年)**,週/月/季/年頻回溯 11~16 年;「近五年以上」要降頻;`Data` 的週/月 K 比 `MSMP` 更長;`_千` ÷1e5、`_百萬` ÷1e4 才是億元;**期貨在 `MSMP._fut_TXF`(9.3 年 1 分 K)**;SnowyOwl 沒有選擇權/匯率/央行利率/原物料;**美股規則不同**(週/月K 反而比台股短,長歷史只在財報與股利) - [USData.get_snapshots 美股即時快照](docs/data-get-snapshots.md): **僅美股** `api.USData.get_snapshots(symbols)` 回 `dict[str, Symbol]`,Symbol 9 欄(含現成的 netChange/percentChange);台股 `api.Data` 無此方法 - [盤中、分K與逐筆明細](docs/intraday.md): 23 張盤中表全部盤中實測;**分兩類**——盤中即時類只有當天(適合最新日篩選、不能回測)、歷史分K類約 4 年 968 個交易日(可回測,`get_stock_ohlc` 底層就是它);**最後一根 K 棒還在累加**(25 秒實證)、K 棒用結束時間標記;`日成交金額(千)`/`日成交量` 是當日累計不是這根的量;**內外盤欄名是簡體 `内盤`**;五檔欄名兩套(`買_1量` vs `買1量`);分價量的 `類型` 分 current/pre2Sum/pre4Sum/pre9Sum/pre19Sum;`minutes` 只吃 1/3/5/15/30/60 - [USData 美股表格查詢](docs/usdata.md): 25 張表全部實跑(形狀與欄位為真實輸出),依參數型態分四組;成交量單位是股不是張;日K 已內含 5~250 日均價/均量;`get_snapshots` 回 `Symbol`(9 欄、直接給 percentChange);台股 `api.Data` 沒有 get_snapshots ## MSMP 歷史資料 - [MSMP 矩陣資料總覽](docs/msmp.md): 日期 × 股票代號矩陣、兩種取法、`INDEX`/`INFO`/大盤指數、只到前一交易日 - [MSMP 資料表與欄位完整清單](docs/msmp-tables.md): 台股 25 張表、美股 10 張表的所有欄位名稱;外加 **`api.MSMP._fut_TXF`**——底線開頭、唯一的期貨資料,257 萬列 1 分 K、2017 起、`settlement` 標記合約月、`DateTime` 零重複(單一近月連續序列) - [MSMP.list 股池](docs/msmp-list.md): 8 個股池與檔數;`all` 含一個重複代號的陷阱與去重寫法 - [USMSMP 美股矩陣資料](docs/usmsmp.md): 10 張表的欄位/形狀/期間實測;沒有 `list`/`INFO`/`INDEX`/大盤指數/`_fut_TXF`;**沒有 `漲跌幅` 也沒有 `adj_*`**;**台股「降頻拿長歷史」在美股不成立**(週K 4.5 年、月K 4 年),長歷史只在財報(27.8 年,回到 1998-Q4)與股利(34 年,回到 1993);財報覆蓋 5801 檔 vs 價格 13174 檔;資料日比台股晚一天 ## 回測 - [回測 api.bt 總覽](docs/backtest.md): `api.bt` 是 `SecureMain`、`CallableModule` 技巧;**積木 sig 餵進 Core 的完整實跑路徑**(日 K 也取 MSMP 才對齊)、單檔與組合回測配方 - [回測:事件模型與策略撰寫](docs/backtest-strategy.md): 標準骨架;**一根 bar 內的執行順序**(`on_position` 早於 `on_bar`);`row` 的 key 一律英文;`Position` / `Order` 欄位;`stats` 的 `continue_wins`;`on_init` 下單會 RuntimeError;完全平倉不觸發 `on_position`;`self.char`/`self.char1` 會畫在 `show_monitor` 與 dashboard 的 K 線;`self.row` 是保留屬性;有內建停損時自己的平倉單要綁 `match_uid`,否則會反向開新倉 - [回測:委託、成交價與風控](docs/backtest-order.md): `Condition.Global` 七個參數;同 `(rule, match_uid)` 是更新不是新單;五種 `PriceType`;**12 個成交價案例實測表**(`stop_rod` 跳空以開盤價成交);四個停損停利每根都要重掛,`STL`/`PFT`/`DS`/`TGT` 是保留 rule 名;**委託價依 `tick_map` 四捨五入,期貨要設 `[(inf, 1)]`**;`compel_now` 價格不能給 0 - [回測:資料與週期](docs/backtest-data.md): 三種餵法;`feed_data` **不會**觸發 `on_bar2`;`args` 只是角色對應、`row` 的 key 是英文;`freq` 兩條路徑等價;時序守門與警告訊息;要跟積木訊號對齊不要用 `get_stock_ohlc` - [回測:商品規格與績效報告](docs/backtest-report.md): `fee`/`margin` 依大小自動切換模式;**`tax_long`/`tax_short` 其實是進場稅/出場稅**(台股 `tax_long=0, tax_short=0.003`);**`capital` 只在百分比下單時生效**;部位被夾成 0 時的誤導錯誤訊息;四張報表 + 28 項 KPI 欄位定義(**`MddRatio` 回撤比率、`MddAmount` 回撤金額**,`daily` 有每日回撤金額 `dd`);`rp.dashboard()` 四個分頁與寫檔規則;`rp.save()` 存 xlsx 六個 sheet - [回測:技術指標與參數尋優](docs/backtest-tools.md): `self.Ind` 25 個增量指標(每根都要呼叫、一根只能呼叫一次);`bt.Tools.optimize` 以 `CalmarRatio` 評分、回傳最佳參數 dict、全部結果存 `optimize.xlsx`,不看交易次數 ## AI 工具整合 - [MCP Server](mcp/README.md): 五個 tool(`list_blocks` / `describe_block` / `screen` / `get_screen_code` / `backtest`)覆蓋 659 個積木與回測,stdio 傳輸、零額外相依(不需 `pip install mcp`)。安裝說明見 `mcp/install/`,驗證用 `python mcp/test_protocol.py`(端到端檢查,含真登入、真選股、單檔與組合回測) - Agent Skill:`.claude/skills/snowyowl/SKILL.md`。教 agent 怎麼寫 SnowyOwl 的 Python;MCP 讓 agent 直接抓資料。兩者並存,問「幫我選股」走 MCP,問「幫我寫選股腳本」走 Skill ## 這份文件集是自足的 `api.Data` / `api.USData` 的表格規格、 回測的策略撰寫與報表欄位,都寫在上面各頁裡,不需要另外的文件集。 SnowyOwl **不含下單功能**,`api` 上不存在 `Order`,所以沒有下單與帳務的章節。 ==================================================================================================== # 開始使用 SnowyOwl > 所屬章節:入門 > 以 2026-08-21 實際執行結果為準(資料日 2026-08-20) ## Overview `snowyowl` 是資料 + 選股積木 + 回測的整合套件。兩行就能拿到可用的 api 物件: ```python import snowyowl as so api = so.login('user@x.com', 'pwd') # 或 so.login(type='google') ``` `so.login(person_id, person_pwd, type='account')`:帳密登入要帶帳號密碼;`type='google'/'apple'` 開瀏覽器登入。登入約 10-15 秒,含下載/更新本地 MSMP 快取。 --- ## 先分流:你的問題屬於哪一類 三條路完全不同,走錯會繞遠路: | 你要做的 | 走哪 | 起點 | |---|---|---| | **查一個事實**——今天漲幅 5% 以上、台積電最近一個月、成交額前 10 名 | `api.MSMP` 矩陣,通常一行 | [msmp.md](msmp.md)、[data-history.md](data-history.md) | | **把多個條件 AND 起來篩股**——突破 20 日高 **且** 外資買超 **且** 成交額佔比 >1% | 積木 `api.Block` | [block.md](block.md) | | **驗證一組規則能不能賺錢** | 回測 `api.bt` | [backtest.md](backtest.md) | > **積木是「條件組合」不是「查數據」。** 拿積木回答事實問題常常找不到剛好對的, > 或找到名稱像但語意不同的——例如 `漲跌幅介於P1%到P2%之間` 其實算的是**近 20 日** > 漲跌幅,不是當日。見 [block-caveats.md](block-caveats.md) 第 12 節。 --- ## Manual Sample Input/Output ### Example 1:登入 #### input ```python import snowyowl as so api = so.login('user@x.com', 'pwd') api ``` #### output ```text [系統訊息] MSMP 物件初始化完成。 [系統訊息] USMSMP 物件初始化完成。 [系統訊息] 已將資料存入本地暫存 [系統訊息] Block 積木物件初始化完成。 [系統訊息] API 加載完成,歡迎使用。 Api Instance is ready ``` --- ### Example 2:查一個事實(最短路徑) #### input ```python k = api.MSMP.日_K # index 是日期,columns 是股票代號 t = k.漲跌幅.iloc[-1].dropna() # 最後一個交易日的漲跌幅 len(t[t >= 5]), str(k.Close.index[-1].date()) ``` #### output ```text (89, '2026-08-20') ``` > **回答時要講資料日期。** `api.MSMP` 只到**前一交易日**——使用者說「今天」 > 通常指的是最近一個交易日,用 `k.Close.index[-1]` 取出來明講。 --- ### Example 3:選一次股 #### input ```python block = api.Block.con_tw('今日收盤價<>開高低P%', operator='>', ohlc_field='adj_High', percent=3) result = api.Block.screener_tw([block]) result['date'], result['dataframe'].shape ``` #### output ```text (Timestamp('2026-08-20 00:00:00'), (2416, 8)) ``` `screener_tw` 回傳 dict,四個 key:`code` / `dataframe` / `date` / `sig`。 詳見 [Block.screener 執行選股](block-screener.md)。 --- ### Example 4:取單一標的的歷史資料 #### input ```python api.Data.get('還原日K價量資料(個股、ETF、大盤)-單檔股票多個區間', '2330').tail(3) ``` #### output ```text DataFrame shape: (1000, 14) 日期 股票代號 股票名稱 開盤價 最高價 最低價 收盤價 成交量 漲跌 漲跌幅(%) 997 2026-08-18 2330 台積電 2415 2415 2375 2380 19997.2130 -20 -0.8300 998 2026-08-19 2330 台積電 2340 2355 2335 2350 23618.6120 -30 -1.2600 999 2026-08-20 2330 台積電 2365 2375 2350 2375 16967.7370 25 1.0600 ``` > **日頻一律 1000 筆(約 4.1 年)**,`api.MSMP` 與 `api.Data` 都一樣。 > 要更長的歷史得降頻——週/月/季/年頻回溯 11~16 年。見 [data-history.md](data-history.md)。 --- ## 命名空間 | 命名空間 | 用途 | 文件 | |---|---|---| | `api.Block` | 積木選股(台股 405 個、美股 260 個) | [block.md](block.md) 起 10 頁 | | `api.Data` / `api.USData` | 表格式查詢(台股 80 張表、美股 25 張) | [data.md](data.md)、[usdata.md](usdata.md) | | `api.MSMP` / `api.USMSMP` | 矩陣式歷史資料(日期 × 股票代號) | [msmp.md](msmp.md)、[msmp-tables.md](msmp-tables.md) | | `api.bt` | 回測 | [backtest.md](backtest.md) 起 5 頁 | `snowyowl` **沒有下單功能**,`api` 上不存在 `Order`。詳見 [api-structure.md](api-structure.md)。 ## 文件怎麼查 | 想知道 | 看 | |---|---| | **撞到錯誤訊息** | [errors.md](errors.md)(含 13 項「不報錯但結果是錯的」) | | 有哪些積木、參數怎麼填 | [block-get-table.md](block-get-table.md)、[block-reference-tw.md](block-reference-tw.md) | | 積木有哪些已知落差 | [block-caveats.md](block-caveats.md)(12 節) | | 台股 80 張表按用途分組 | [data-get-table.md](data-get-table.md) | | **某個頻率有多長歷史 / 期貨資料在哪** | [data-history.md](data-history.md) | | MSMP 每張表有哪些欄位 | [msmp-tables.md](msmp-tables.md) | | 寫策略、成交價規則、報表欄位 | [backtest-strategy.md](backtest-strategy.md)、[backtest-order.md](backtest-order.md)、[backtest-report.md](backtest-report.md) | 全部 34 篇的索引在 `llms.txt`,全文串接在 `llms-full.txt`。 ## 三個最常踩的坑 **1. 單位。** `_千` 結尾 ÷1e5 得億元、`_百萬` 結尾 ÷1e4 得億元。 成交量:整股是張、零股是股、期貨是口。 **2. 日頻只有 1000 筆。** 「近五年」以上的問題要降到週/月/季頻。 **3. SnowyOwl 沒有的資料**:選擇權、匯率、央行利率、原物料、海外期貨。 表裡出現的「匯率」是財報的「匯率變動對現金之影響」、「利率」是殖利率/毛利率 這類財務比率——都不是行情。 ==================================================================================================== # 怎麼問,才問得到你要的東西 > 所屬章節:入門 > 三組案例,每組都是「小白版 a」→「進階版 b」的對照 > 目的不是教 API,是教**怎麼把需求講清楚** ## 這頁在講什麼 同一個需求,換個講法,拿到的東西差很多。 以案例 2 為例——同樣是月營收選股,小白版跑出來 **+95%(輸給 0050 的 +296%)**, 進階版是機構等級的多因子輪動。**差別不在我會不會寫,在你有沒有講。** | | 小白版 a | 進階版 b | |---|---|---| | 講的是 | **要什麼結果** | **要什麼規格** | | 長度 | 一兩句 | 一頁 | | 我會做的 | 照字面執行,然後告訴你缺陷 | 照規格實作 | | 適合 | 探索、快速試錯 | 你已經知道要什麼 | **兩種都對。** a 適合開場,b 適合你看過 a 的結果之後。 --- ## 萬用句:先照做,再挑錯 如果只記一句,記這個: ```text 先照我說的做,跑完告訴我這個規格有什麼缺陷,以及要達到機構等級還缺什麼 ``` 這句話讓你保有規格的控制權,同時讓我把「應該有但你沒提」的東西列出來給你決定。 > **為什麼我不自己加?** 你沒要求時我不加,是刻意的。 > 你說「每檔 10 萬」我就照做,不會自作主張改成目標權重輪動—— > 那是把我的判斷凌駕在你的規格上。但我會在跑完後指出問題。 --- ## 案例 1:單檔技術指標回測 ### a. 小白版 ```text 0050 的 adjclose ma5 ma10 多頭排列買入,空頭排列賣出 每次買 10 萬 產回測報告給我,並給我儀表板 ``` **這句話已經夠好了**,四個要素齊全:標的、訊號、部位、輸出。 實跑結果:總報酬 +81.04%、CAGR 16.31%、53 筆交易、成本 20,644。 ### b. 追問:發現輸給 buy&hold ```text 我發現我輸給 buy&hold,請幫我找到適合的參數 ``` 這句追問很關鍵——但**答案可能是「參數救不了」**。 實測掃描 95 組 MA 參數組合: ```text buy&hold: +305.47% CAGR 40.55% MDD -27.48% 最佳 MA: +194.57% CAGR 34.57% MDD -20.36% (MA15/80) >>> 贏過 buy&hold 的組合:0 / 95 >>> 所有組合平均曝險 72.7% ``` **結構性原因**:策略有 39% 時間空手,而 0050 這 4 年漲 3 倍, 空手的每一天都是純虧。曝險越高報酬越高,那極限就是 buy&hold 本身。 > **這類追問要連著問「是不是結構性問題」**,否則我可能真的去掃參數, > 掃完才發現方向錯了。 ### 這個案例該補的話 | 加這句 | 會得到 | |---|---| | 「順便掃一下參數空間,我要看全貌不是單一組合」 | 95 組對照表,而不是一組數字 | | 「同時告訴我曝險率」 | 直接看出空手成本 | | 「交易次數太少的組合要標出來」 | 避開只交易 2~3 次的過度配適解 | --- ## 案例 2:選股輪動策略 ### a. 小白版 ```text 給我一個選股策略,用月營收 yoy 作為選股條件,取最好的 10 檔的上市股票, 在每個月的公告日的下個交易日進行換股,每檔 10 萬。 ``` 規格完整、時間軸明確(公告日的下個交易日,無未來函數)。我照做了。 **結果**: | | 策略 | 0050 B&H | |---|---|---| | 總報酬 | +95.77% | **+296.42%** | | MDD | -30.32% | -27.48% | | Sharpe | 0.98 | 1.57 | **每個維度都輸。** 但問題不在執行,在規格本身: ```text 入選股 YoY 中位數 +464%,最大 +1,073,121% YoY > 200% 佔 83.8% ``` `+1,073,121%` 不是成長,是除以零——去年同期營收趨近於零。 **純 YoY 排序實質上是在篩選財報異常的公司。** ### b. 進階版 先是三句原則: ```text 「做多因子,不要單因子」 「要有可交易性過濾:流動性、衝擊成本、最低股價」 「用目標權重輪動,不要固定金額」 ``` 然後是完整規格: ```text 做一個台股多因子輪動策略,規格如下: 【因子】用 percentile 排名合成分數,等權平均: - 月營收 YoY(正向) - 公告累計EPS(正向) - ROA 稅後資產報酬率(正向) - 營業利益率(正向) - 營業利益成長率(正向) - 無形資產增加 CFI(反向) 【可交易性】三層過濾,排名前先套遮罩: - 20日均成交額排名前 60% - 成交額 >= capital × max_w / 0.02(衝擊成本地板) - 股價 >= 10 元 ※ 成交額要用「未還原」Close 算,Volume 是張要 ×1000 【換股】月頻公告日 ∪ 季頻公告日,同月取最新那個 【部位】目標權重 1/N 輪動,每根 bar 把持倉調到目標,差多少補多少 【對齊】財報日期先 union 再 ffill 再 reindex,不要直接 reindex 【成本】手續費 0.001425 × 0.3 折 top_n=20, capital=100萬, max_w=0.20 ``` ### a 跟 b 差在哪 | | a | b | |---|---|---| | 選股 | 單因子 YoY 排序 | 6 因子 percentile 合成 | | 可交易性 | 成交額 > 0.5 億 | **三層**:流動性排名 + 衝擊成本地板 + 最低股價 | | 部位 | 每檔固定 10 萬(`capital` 不生效、無複利) | 目標權重輪動(`capital` 生效、有複利) | | 換股日 | 只有月頻 | 月頻 ∪ 季頻 | | 對齊 | 直接 reindex | union → ffill → reindex | ### 三句原則為什麼有效 **①「做多因子,不要單因子」** 一句話就從排序變成合成分數。單因子幾乎必然選到極端值—— 案例 2a 有 83.8% 的入選股 YoY > 200%。 **②「要有可交易性過濾:流動性、衝擊成本、最低股價」** 最關鍵的一句。**衝擊成本地板**(`capital × max_w / impact`)這個概念 我不會主動加——除非你說「要考慮衝擊成本」。 **③「用目標權重輪動,不要固定金額」** 「每檔 10 萬」會走固定口數路徑,`capital` 不參與計算、沒有複利。 講「目標權重」我才會用 `1/N` 百分比下單。見 [backtest-report.md](backtest-report.md)。 --- ## 案例 3:期貨策略 ### a. 小白版 ```text 給我一個 txf 的肯特納策略,頻率為一小時,在結算日強制出場。 ``` **這句話的資訊密度很高**,三個要素都是期貨專屬的: | 要素 | 為什麼重要 | |---|---| | `txf` | 資料在 `api.MSMP._fut_TXF`(底線開頭的私有屬性),不在 `api.Data` 的 80 張表 | | `頻率一小時` | 要走 `set_tick_period(freq=60)` + `feed_tick_df`,不是 `feed_data` | | `結算日強制出場` | 要 `need_settlement=True`,判斷式是 `row['DateTime'] == row['Settlement']` | 肯特納通道需要 `ema` + `atr`,兩個 `self.Ind` 都有。 ### 期貨一定要講的四件事 即使沒明講,我也會處理,但**講了更保險**: ```text 期貨規格要對: tick_map=[(np.inf, 1)] ← 最小跳動 1 點,不設會套用股票規格 fee=500 ← 每口固定金額(>= 1 自動切換模式) unit=200 ← 合約乘數 tax_long/tax_short=0.00002 ``` ### 這個案例該補的話 | 加這句 | 會得到 | |---|---| | 「多空都做」 | 否則我可能只寫多單 | | 「結算日出場後當天不再進場」 | 避免結算日當天來回 | | 「跳空時停損以開盤價成交,確認一下」 | 我會把成交價規則講清楚 | | 「日盤夜盤都要,還是只做日盤」 | `period` 參數差很多 | --- ## 三個最常見的提問錯誤 | 這樣問 | 為什麼不好 | 改成 | |---|---|---| | 「幫我找會漲的股票」 | 沒有可對應的條件,只能猜 | 講**可觀測的條件**:營收、法人買超、突破均線 | | 「幫我回測近十年」 | 日頻硬上限 1000 筆(約 4.1 年) | 「近三年」,或明說「可以降到週/月頻」 | | 「順便幫我下單」 | SnowyOwl **沒有下單功能**,`api` 上不存在 `Order` | 選股 + 回測到此為止 | --- ## 每次回測都該問的兩句 不管哪個案例,這兩句永遠適用: ```text ① 扣成本前的毛損益是多少?成本佔投入資金幾 %? ② 回測期間實際是哪一段? ``` **為什麼**: - 案例 1 的 MA20 版本總報酬 -11.31%,但毛損益其實是 **+22,000**—— 虧損幾乎全是成本(51 筆交易吃掉 32 萬)。看到負數就放棄策略是誤判。 - 日頻只有 1000 筆,「過去這幾年」實際上是 2022-08 起的 4.08 年, 不是你以為的十年。 --- ## 提問結構速查 ```text 【標的】 0050 / TXF / 上市股票 【訊號】 MA5 > MA10 / 肯特納突破 / 月營收 YoY 排名 【部位】 每檔 10 萬(固定金額)或 目標權重 1/N(有複利) 【換股/出場】公告日下個交易日 / 結算日強制平倉 【成本】 台股個股 / ETF / 台指期(見 backtest-report.md) 【輸出】 報表 + 儀表板 + 逐筆交易 【追問】 毛損益、成本佔比、回測期間、這規格有什麼缺陷 ``` --- ## 相關頁 - [開始使用 SnowyOwl](getting-started.md):查事實 / 組條件 / 驗規則 的三分法 - [案例集:小白怎麼問回測](case-study-backtest.md):三個回測案例的完整程式碼 - [商品規格與績效報告](backtest-report.md):`unit` / `capital` / `tax_*` 的陷阱 - [錯誤訊息速查](errors.md):13 項「不報錯但結果是錯的」 ==================================================================================================== # 怎麼制定一個 plan > 所屬章節:入門 > 從「我想做一個策略」到「可以交易的東西」中間的完整流程 > 配合 [how-to-ask.md](how-to-ask.md) 使用:那頁教怎麼問一句話,這頁教怎麼規劃一件事 ## 為什麼要有 plan [how-to-ask.md](how-to-ask.md) 的案例 2 示範了一件事: 「用月營收 YoY 選前 10 檔」這句話**每個字都被正確執行**, 結果是 +95.77%、輸給 0050 的 +296.42%。 問題不在執行,在**沒有 plan**——直接從「想法」跳到「回測」, 中間的資料清洗、特徵檢驗、防洩漏全部跳過了。 這頁講的就是中間那段。 --- ## 六階段流程 ```text ① 定義問題 你在賭什麼?用什麼衡量? ↓ ② 資料盤點 有什麼、多長、什麼單位、什麼頻率 ↓ ③ 資料清洗 倖存者偏差、單位、對齊、極端值 ↓ ④ 特徵工程 原始欄位 → 可比較的分數 ↓ ⑤ 訊號驗證 在回測之前先確認特徵有用 ↓ ⑥ 回測 才輪到這一步 ``` **大部分人直接從 ① 跳到 ⑥。** 每跳過一階,錯誤就會被埋進結果裡, 而且**不會報錯**——見 [errors.md](errors.md) 的 13 項「不報錯但結果是錯的」。 --- ## ① 定義問題 開工前先用一句話回答這三題: | 題目 | 爛答案 | 好答案 | |---|---|---| | **你在賭什麼?** | 「找會漲的股票」 | 「營收動能領先股價反應,公告後一個月有超額報酬」 | | **拿什麼比?** | (沒想過) | 「0050 買進持有」或「加權指數」 | | **多爛算失敗?** | (沒想過) | 「Sharpe < 1 或輸給 0050 就放棄」 | > **第三題最常被跳過。** 沒有預設的失敗標準,就會不斷調參數直到好看為止—— > 那不是研究,是過度配適。 ### 提問範本 ```text 我想驗證一個假設:⟨假設⟩ 對照基準用 ⟨0050 / 加權指數⟩ 如果 ⟨Sharpe < 1 / 輸給基準 / 交易次數 < 30⟩ 我就放棄這個方向 先幫我規劃流程,不要急著寫回測 ``` 最後那句很重要——**它讓我先給你 plan 而不是直接跳到程式碼**。 --- ## ② 資料盤點 在寫任何一行邏輯之前,先確認資料的邊界。 ### 四個必問 | 問題 | 為什麼 | 在哪查 | |---|---|---| | **有多長?** | 日頻硬上限 **1000 筆(約 4.1 年)**。「近五年」做不到 | [data-history.md](data-history.md) | | **什麼單位?** | `_千` ÷1e5 得億、`_百萬` ÷1e4 得億。成交量整股是張、期貨是口 | [msmp-tables.md](msmp-tables.md) | | **什麼頻率/index 型態?** | 月營收 index 是**字串** `'2026-M08'`,不是日期;季頻是 `'2026-Q2'` | [data-history.md](data-history.md) | | **資料日到哪?** | `api.MSMP` 只到**前一交易日**;美股比台股**晚一天** | [msmp.md](msmp.md) | ### 提問範本 ```text 我要用 ⟨月營收 / 季財報 / 籌碼⟩ 做研究,先幫我盤點: ① 這張表有多長歷史、index 是什麼型態 ② 每個欄位的單位是什麼 ③ 資料日到哪一天 ④ 有沒有「看起來有但其實沒有」的欄位 先不要寫策略 ``` ### 實例:月營收的時間軸 ```text 月_營收 index: '2026-M08' (字串,營收所屬月份) INDEX['M']: 2026-09-10 (Timestamp,公告日) ↑ 差一個月!8 月營收在 9/10 公告 ``` 搞錯這個就是**未來函數**——用還沒公告的資料選股,回測會漂亮得不真實。 --- ## ③ 資料清洗 這一階最容易被跳過,也最容易埋雷。 ### 四個必做 **a. 倖存者偏差** ```python pools = api.MSMP.list # ❌ 只用現在還在市場上的 universe = pools['tse'] # ✅ 想清楚要不要含已下市的 145 檔 pools['delist'] # 已下市 ``` 只用現存股票回測,等於**事先知道誰沒倒**。這會系統性高估報酬。 **b. 股池純度** ```python universe = set(pools['tse']) - set(pools['etf']) - set(pools['KY']) - set(pools['DR']) ``` ETF 沒有月營收、KY 股財報認列不同、DR 是存託憑證。混在一起排名沒有意義。 **c. 單位** ```python # ❌ 成交額_百萬 當成千元 last_vol = tvol.iloc[-1] / 1e5 # 錯!只剩 1 檔通過 # ✅ 百萬 -> 億是 /100 last_vol = tvol.iloc[-1] / 100 # 對,569 檔通過 ``` > 這是**真實發生過的錯誤**。過濾條件從「篩掉不流動的」變成「篩掉全部」, > 而且**不會報錯**,只是選股結果莫名其妙。 **d. 極端值** ```python 入選股 YoY 中位數 +464%,最大 +1,073,121% YoY > 200% 佔 83.8% ``` `+1,073,121%` 不是成長,是**除以零**——去年同期營收趨近於零。 純排序會讓這種公司佔滿所有名額。 處理方式三選一:設上限、改用累積值、加規模門檻。 ### 提問範本 ```text 在算任何特徵之前,先幫我做資料清洗: ① 股池要排除 ETF / KY / DR,並告訴我要不要含已下市 ② 每個欄位的單位換算列出來給我確認 ③ 檢查極端值分布,告訴我前 1% 長什麼樣 ④ 檢查缺失值比例 做完給我一份「清洗前 vs 清洗後」的檔數對照 ``` 最後那句讓你**看見每一層砍掉多少**——就是上面那個 `/1e5` 錯誤被抓出來的方式。 --- ## ④ 特徵工程 原始欄位不能直接比較,要先轉成同一個尺度。 ### 三種常見做法 | 做法 | 寫法 | 什麼時候用 | |---|---|---| | **Percentile 排名** | `d.rank(axis=1, pct=True)` | 跨股票比較。不受極端值影響 | | **Z-score** | `(d - d.mean()) / d.std()` | 需要保留距離資訊時 | | **分位數分組** | `pd.qcut(d, 5)` | 要看單調性(第 1 組到第 5 組是否遞增) | ### 多因子合成的標準寫法 ```python sc = None for tbl, col, direction in FACTORS: src = getattr(api.MSMP, tbl) d = getattr(src, col) # ★ 先套可交易遮罩再排名,母體才一致 p = d.where(tradable).rank(axis=1, pct=True) p = p if direction == 'long' else 1.0 - p sc = p.fillna(0.5) if sc is None else sc + p.fillna(0.5) sc = (sc / len(FACTORS)).where(tradable) ``` 三個關鍵: 1. **先遮罩再排名**——否則排名的母體包含買不到的股票 2. **反向因子用 `1.0 - p`**——不要用負號 3. **缺值填 `0.5`**——中性,不獎勵也不懲罰 ### 對齊:最容易錯的一步 財報/營收的公告日**不會剛好落在換股日**: ```python # ❌ 直接 reindex,公告日對不上換股日就全變 NaN d = src.reindex(R) # ✅ 先 union 再 ffill 再 reindex d = src.reindex(src.index.union(R)).ffill().reindex(R) ``` > `ffill` 的意思是「用最近一次已公告的值」——這才符合真實交易情境。 ### 提問範本 ```text 幫我把這些原始欄位轉成可比較的特徵: ⟨欄位清單,標註正向/反向⟩ 要求: ① 用 percentile 排名,先套可交易遮罩再排名 ② 反向因子用 1-p,缺值填 0.5 ③ 財報對齊用 union → ffill → reindex,不要直接 reindex ④ 做完給我每個因子的分布統計和缺值比例 ``` --- ## ⑤ 訊號驗證 **這一階是回測的前置,不是回測本身。** 目的是在花時間跑回測之前, 先確認特徵跟未來報酬有沒有關係。 ### 三個檢驗 | 檢驗 | 做什麼 | 看什麼 | |---|---|---| | **IC(資訊係數)** | 特徵值 vs 未來 N 日報酬的相關係數 | 絕對值 > 0.03 算有訊號 | | **分組單調性** | 按特徵分 5 組,看各組平均報酬 | 第 1 組到第 5 組要單調遞增 | | **換手率** | `W.diff().abs().sum(axis=1)` | 太高會被成本吃掉 | ### 為什麼重要 案例 2a 那個策略,**跑完整個回測才發現選到的是財報異常公司**。 如果先做分組檢驗,第一步就會看到最高分那組的報酬不是最好的。 ### 提問範本 ```text 在回測之前先幫我驗證訊號: ① 算每個因子的 IC(特徵 vs 未來 20 日報酬) ② 按因子分 5 組,看各組平均報酬是否單調 ③ 算換手率,估算成本會吃掉多少 如果 IC 太低或不單調,直接告訴我這個因子沒用,不用跑回測 ``` 最後那句省下大量時間。 --- ## ⑥ 回測 前五階做完,這一階反而最單純。 ### 三個必設 ```text 【部位】固定金額(qty >= 1, unit=1)還是目標權重(qty < 1)? → 固定金額:capital 不生效、無複利 → 目標權重:capital 生效、有複利 【成本】台股個股 fee=0.001425, tax_short=0.003, unit=1 台股 ETF tax_short=0.001 台指期 fee=500, unit=200, tick_map=[(inf,1)] 【對照】generate_report(core_dic, benchmark=...) ``` ### 必問的兩句 ```text ① 扣成本前的毛損益是多少?成本佔投入資金幾 %? ② 回測期間實際是哪一段? ``` 案例 1 的 MA20 版本總報酬 -11.31%,但毛損益是 **+22,000**—— 虧損幾乎全是成本。看到負數就放棄是誤判。 --- ## 完整的 plan 提問範本 把整個流程一次講清楚: ```text 我想驗證:⟨假設⟩ 對照基準:⟨0050 / 加權指數⟩ 失敗標準:⟨Sharpe < 1 就放棄⟩ 請按這個順序做,每一階做完先給我結果再繼續: ① 資料盤點——歷史長度、單位、index 型態、資料日 ② 資料清洗——股池純度、單位換算、極端值分布、缺值比例 ※ 給我「清洗前 vs 清洗後」的檔數對照 ③ 特徵工程——percentile 排名、先遮罩再排名、union→ffill→reindex ④ 訊號驗證——IC、分組單調性、換手率 ※ 如果訊號太弱就直接說,不要硬跑回測 ⑤ 回測——目標權重輪動、正確成本、加 benchmark ⑥ 跑完告訴我這個規格有什麼缺陷 不要跳階段,也不要在②之前寫任何策略邏輯 ``` **「每一階做完先給我結果再繼續」** 是最重要的一句—— 它讓你在每個檢查點都能喊停,而不是等到最後拿到一個沒法信任的數字。 --- ## 常見的流程錯誤 | 錯誤 | 後果 | 怎麼避免 | |---|---|---| | 直接從想法跳到回測 | 埋一堆不報錯的雷 | 按六階段走 | | 沒定義失敗標準 | 調參數調到好看為止 | ① 先寫死標準 | | 用現存股票回測 | 倖存者偏差,高估報酬 | ③ 想清楚要不要含 `delist` | | 直接 reindex 財報 | 全變 NaN 或用到未公告資料 | ④ union → ffill → reindex | | 跳過訊號驗證 | 浪費時間跑沒用的回測 | ⑤ 先看 IC 和單調性 | | 只看總報酬 | 看不出是策略還是成本的問題 | ⑥ 一定要問毛損益和成本佔比 | | 尋優後就相信 | 過度配適 | 看 `TotalTrades`,切前後兩段分別驗 | --- ## 相關頁 - [怎麼問,才問得到你要的東西](how-to-ask.md):單句提問的三組案例 - [案例集:小白怎麼問回測](case-study-backtest.md):三個回測案例的完整程式碼 - [錯誤訊息速查](errors.md):13 項「不報錯但結果是錯的」 - [資料頻率與歷史長度](data-history.md):②資料盤點的依據 - [商品規格與績效報告](backtest-report.md):⑥回測的成本與部位設定 - [技術指標與參數尋優](backtest-tools.md):尋優的過度配適警告 ==================================================================================================== # 案例集:小白怎麼問回測 > 所屬章節:入門 > 三個由淺入深的回測案例,每個都附「白話提問 → LLM 產出 → 必須追問的問題」 > 程式碼中的參數合法值以 `get_table_tw()` 與各參考頁為準;績效數字引自各頁實測 這頁不教 API,教**怎麼問**。API 細節在 [backtest.md](backtest.md) 起的五頁。 三個案例共同的一句話:**每次回測結束都要問「成本佔多少」和「回測期間實際是哪一段」。** 文件裡那個 -11.31% 的 MA20 例子,毛損益其實是 +22,000——策略本身沒錯, 錯在日頻訊號進出太頻繁,51 筆交易吃掉 32 萬成本。新手最容易誤判的就是這裡。 | 案例 | 難點 | |---|---| | 一、月營收選股回測 | `unit` 配錯差 1000 倍 | | 二、台指期 TXF 回測 | 期貨四個專屬規格 | | 三、組合回測 + 參數尋優 | 組合視角與過度配適 | --- ## 案例一:月營收選股回測 ### 提問 > 我想找月營收年增率成長超過 20% 的上市股票,挑最多 10 檔, > 每檔投入 10 萬元做回測。手續費和證交稅要算對。 四個要素:**條件**(月營收年增率 >20%)、**股池**(上市)、**檔數上限**(10 檔)、 **每檔金額**(10 萬)。其中「每檔 10 萬」是關鍵——框架**不能直接填金額**, 必須換算成股數,而且 `unit` 配錯會差 1000 倍。 ### LLM 應該產出 ```python import snowyowl as so import pandas as pd api = so.login('user@x.com', 'pwd') # ── 1) 選股:月營收年增率 > 20%,股池限上市 ────────────────── con = api.Block.con_tw('月營收年增率>±P%', operator='>', percent=20) # percent 合法值:20/30/40/50/-20/-30/-40/-50 r = api.Block.screener_tw([con], pool=['tse']) # tse = 上市 1125 檔 print(f"資料日期 {r['date'].date()},選出 {r['dataframe'].shape[0]} 檔") picks = r['dataframe']['stock_id'].head(10).tolist() # ⚠️ head(10) 不是排行 print(picks) # ── 2) 日 K 從 MSMP 取,與 sig 天然對齊 ───────────────────── def daily_bars(api, symbol): k = api.MSMP.日_K zh2en = {'開盤價':'Open','最高價':'High','最低價':'Low','收盤價':'Close','成交量':'Volume'} df = pd.DataFrame({zh: getattr(k, en)[symbol] for zh, en in zh2en.items()}) df.index.name = 'DateTime' return df.reset_index() # ── 3) 策略:每檔固定投入 10 萬元 ─────────────────────────── class RevStrategy(api.bt.Core): def on_init(self): self.amount = 100_000 # 每檔投入金額 def on_bar(self, row): if row['sig'] and self.global_qty == 0: qty = self.amount / row['Close'] # ★ 換算成「股數」,不是張數 self.Condition.Global(True, qty, 0, self.PriceType.market_ioc, None, 'bk') elif not row['sig'] and self.global_qty > 0: self.Condition.Global(True, -self.global_qty, 0, self.PriceType.market_ioc, None, 'bp') # ── 4) 每檔開一個 core,最後一起進報表 ────────────────────── core_dic = {} for s in picks: bars = daily_bars(api, s) bars['sig'] = bars['DateTime'].map(r['sig'][s]).fillna(False) core = RevStrategy() core.feed_data(bars, ['DateTime','開盤價','最高價','最低價','收盤價','成交量'], columns=['sig']) # sig 一定要宣告在 columns # ★ unit=1 以「股」計,qty 才是股數,名目金額才會剛好 10 萬 cfg = api.bt.config(name=s, symbol=s, fee=0.001425, tax_long=0, tax_short=0.003, unit=1) core_dic[cfg] = core rp = api.bt.generate_report(core_dic) print(rp.report.to_string()) ``` ### 最大的坑:`unit` 配錯差 1000 倍 「每檔 10 萬」在框架裡有兩種寫法,**只有一種對**: | 寫法 | 單筆進場金額(實測中位數) | |---|---| | `qty = 100000/price` + **`unit=1`**(以股計) | **100,077** ← 正確,就是 10 萬 | | `qty = 100000/price` + `unit=1000`(以張計) | **100,076,656** ← 差 1000 倍 | 原因:`unit=1000` 時框架把 `qty` 當成**張數**,`100000/2375 = 42.1` 被當成 42 張 = 42,100 股。 堅持用張制就得自己換算並取整: ```python qty = max(1, round(100000 / (row['Close'] * 1000))) # unit=1000 ``` 但實測這樣寫單筆進場中位數是 **653,430**——台股一張最少幾十萬, 10 萬的目標在張制下買不到一張,`max(1, ...)` 只好進位成一張。 **要精準控制 10 萬就必須 `unit=1`。** ### 必須追問的五句 | 追問 | 答案 | |---|---| | **每檔 10 萬要怎麼設?** | `qty = 100000/row['Close']` 搭 **`unit=1`**。直接填金額或用 `unit=1000` 都會錯 | | **`head(10)` 是營收成長最快的 10 檔嗎?** | **不是。** [errors.md](errors.md) 13 項靜默錯誤之一——`dataframe` 沒排序,`head(10)` 只是前 10 列(照代號排)。要挑最強的得對 `cond1_*` 欄位排序 | | **`capital` 要設多少?** | **設了也沒用。** `qty >= 1` 走固定口數路徑,`capital` 完全不參與計算。實測設 10 萬 / 100 萬 / 1 億,報表數字完全相同 | | **報表看哪一欄?** | 固定金額下單要**逐檔各自看**。`Strategy` 欄是共用資金池視角,只在百分比下單時才有意義 | | **扣成本前是賺是賠?** | 永遠要問。見本頁開頭 | ### 變體:如果要的是「10 檔共用資金池」 「每檔 10 萬 × 10 檔」另一種解讀是**總資金 100 萬平均分配**,寫法完全不同: ```python # 共用資金池:qty < 1 走百分比路徑,capital 才會生效 class RevStrategy(api.bt.Core): def on_bar(self, row): if row['sig'] and self.global_qty == 0: self.Condition.Global(True, 1/10, 0, # 佔資金池 1/10 self.PriceType.market_ioc, None, 'bk') cfg = api.bt.config(name=s, symbol=s, fee=0.001425, tax_long=0, tax_short=0.003, unit=1000) # 1000 或 1 都行 rp = api.bt.generate_report(core_dic, capital=1_000_000) # capital 這時才生效 print(rp.report['Strategy']) # 看這一欄 ``` | | 固定 10 萬 | 共用資金池 1/10 | |---|---|---| | `qty` | >= 1,實際股數 | < 1,佔資金池比例 | | `unit` | **必須 1** | 1000 或 1 都行 | | `capital` | **不生效** | 生效,是資金約束 | | 看哪一欄 | 逐檔各自看 | `rp.report['Strategy']` | | 適合 | 看單一規則的期望值 | 資金有限、10 檔輪動 | `1/10` 不是隨便取的——`capital` 只累加**已實現**損益、不扣未平倉佔用, 所以 `qty × 同時持有檔數 > 1` 就是隱性槓桿。取 `1/檔數` 剛好是安全上限。 ### 提問模板 ```text 用「月營收年增率 > 20%」選上市股票(pool=['tse']),最多 10 檔, 每檔固定投入 10 萬元回測。成本用台股個股規格。 跑完告訴我: ① 資料日期和總共選出幾檔 ② unit 設多少、為什麼(我要確認名目金額真的是 10 萬) ③ head(10) 是不是排行,如果不是要怎麼挑最強的 ④ 扣成本前的毛損益,成本佔投入資金幾 % ``` --- ## 案例二:台指期 TXF 回測 ### 提問 > 我想回測台指期。用 60 分 K,突破前 20 根高點就做多,停損 1%、停利 2%。 > 手續費和最小跳動記得用期貨的規格。 期貨跟股票差在四個地方,提問時要交代:**週期**、**規則**、**風控**、**期貨規格**。 ### LLM 應該產出 ```python import numpy as np import snowyowl as so api = so.login('user@x.com', 'pwd') bt = api.bt # 1) 期貨資料在 MSMP._fut_TXF(不在 api.Data 的 80 張表裡) # 2,570,820 列 1 分 K、2017-05 起、DateTime 零重複 = 單一近月連續序列 df1 = api.MSMP._fut_TXF # DateTime, Open, High, Low, Close, TotalVolume, settlement class TxfBreakout(bt.Core): def on_init(self): self.n = 20 self.stl, self.pft = 1.0, 2.0 self.high_list = [] self.tick_map = [(np.inf, 1)] # ★ 期貨最小跳動 = 1 點,不設會套用股票規格 def on_bar(self, row): prev_high = max(self.high_list[-self.n:]) if len(self.high_list) >= self.n else None self.high_list.append(row['High']) if prev_high is None: return # 暖身期不下單 self.Condition.Global(row['Close'] > prev_high and self.global_qty == 0, 1, 0, self.PriceType.market_ioc, None, 'bk') # ★ 停損停利每根都要重掛,不能包在 if 裡 self.Condition.set_STL('bk', self.stl) self.Condition.set_PFT('bk', self.pft) core = TxfBreakout() # 2) 用 set_tick_period 聚合成 60 分(期貨預設日盤 08:45-13:45 + 夜盤 15:00-05:00) core.set_tick_period(freq=60, need_settlement=True, args=['DateTime','Open','High','Low','Close','TotalVolume']) core.feed_tick_df(df1) # 3) 台指期規格:fee 是「每口固定金額」不是比例 cfg = bt.config(name='txf_breakout', symbol='TXF', fee=500, tax_long=0.00002, tax_short=0.00002, unit=200) rp = bt.generate_report({cfg: core}) print(rp.report.to_string()) ``` ### 期貨四個一定會踩的坑 | 追問 | 答案 | |---|---| | **期貨資料在哪?** | `api.MSMP._fut_TXF`,**底線開頭的私有屬性**,不在 `api.Data` 的 80 張表。SnowyOwl **沒有選擇權、海外期貨**。見 [data-history.md](data-history.md) | | **`tick_map` 要設嗎?** | 要。台指期 `self.tick_map = [(np.inf, 1)]`。不設會套用股票的 `[(10,0.01),(50,0.05),...]`,成交價全錯 | | **`fee=500` 為什麼不是小數?** | `bt.config` 的 `fee` 依大小自動切換:`< 1` 為費率、`>= 1` 為每口固定金額。台指期 `fee=500, unit=200` | | **跳空時停損在哪成交?** | `set_STL` 掛的是 `stop_rod`,**跳空以開盤價成交**。[backtest-order.md](backtest-order.md) 有 12 個成交價案例實測表 | 還有一個容易忽略的:**`feed_data` 不會觸發 `on_bar2`**。 要多週期訊號(例如 60 分進場 + 日線過濾)必須走 `set_tick_period(freq=[60,'D'])` + `feed_tick_df`。 判斷結算日的標準寫法:`row['DateTime'] == row['Settlement']`。 ### 提問模板 ```text 用 MSMP._fut_TXF 回測台指期,⟨週期⟩ K 棒,規則是 ⟨白話⟩,停損 X% 停利 Y%。 期貨規格要對:tick_map=[(inf,1)]、fee=500、unit=200。 跑完告訴我: ① 跳空時停損在哪個價成交 ② 有沒有穿越結算日的問題 ③ 扣成本前的毛損益,成本佔多少 ``` --- ## 案例三:組合回測 + 參數尋優 ### 提問 > 我想選「月營收年增率排行前 100 名 + 市值大於 50 億」的股票,排除 ETF, > 然後挑其中 5 檔做組合回測,資金 1000 萬平均分配。 > 跑完幫我看兩件事:一是成本佔多少,二是把均線參數拿去尋優, > 但我要知道尋優是不是過度配適。 進階在三個地方:**多積木 AND**、**組合共用資金池**、**尋優 + 過度配適的警覺**。 ### LLM 應該產出 ```python import sys, snowyowl as so api = so.login('user@x.com', 'pwd') # 1) 多積木 AND 選股(參數合法值一定要先查 get_table_tw) b1 = api.Block.con_tw('月營收年增率排行前N名', top_n=100) # 合法值 50/100/150/200/500/1000 b2 = api.Block.con_tw('市值>M億', value=50) # 合法值 10/20/30/50/100 r = api.Block.screener_tw([b1, b2], pool=['all', '~etf']) print(r['date'], r['dataframe'].shape) # ★ 一定要報資料日期 picks = r['dataframe']['stock_id'].head(5).tolist() # ⚠️ head(5) 不是排行 # 2) 組合回測:MCP 的 BT.run 幫你處理 weight 與百分比下單 sys.path.insert(0, 'mcp') from snowyowl_mcp import backtest as BT con = api.Block.con_tw('今日收盤價<>D日(周月)均線', period=20, table='日_K') rp = BT.run(api, [con], picks, capital=10_000_000) print(rp.snowyowl_weight) # 未指定時自動 = 1/檔數 = 0.2 print(rp.report.to_string()) # ★ 只有 Strategy 欄是組合 ``` 尋優: ```python def opt(period=20): con = api.Block.con_tw('今日收盤價<>D日(周月)均線', period=period, table='日_K') return BT.run(api, [con], picks, capital=10_000_000) best = api.bt.Tools.optimize(opt, {'period': [5, 60, 5]}, times=50) rp_best = opt(**best) print(best, rp_best.report.loc['TotalTrades']) # ★ 一定要看交易次數 ``` ### 組合回測最反直覺的一點 `rp.report` 裡除了 `Strategy` 之外的每一欄,都是「該檔獨佔全部資金」的單獨視角, **逐檔加總不等於 `Strategy`**。實測:逐檔 `Invest` 加總 12,086,944 vs `Strategy` 的 6,313,784。 ### 必須追問的四句 | 追問 | 答案 | |---|---| | **`head(5)` 是不是最強的 5 檔?** | **不是。** [errors.md](errors.md) 13 項靜默錯誤之一。`dataframe` 沒有排序,`head(5)` 只是前 5 列。要排行得自己對某個 `cond_*` 欄位排序 | | **`capital` 有真的生效嗎?** | 用 `qty=1` 固定口數時走向量化路徑,**`capital` 完全不參與計算**。要生效必須用百分比下單(`qty < 1`)。`BT.run` 預設就是這樣 | | **會不會有隱性槓桿?** | 會。`capital` 只累加**已實現**損益,未平倉部位不扣可用資金。N 檔同時進場時 `weight × 同時持有檔數 > 1` 就是槓桿。`weight=1/檔數` 是為了避開這個 | | **尋優出來的參數可信嗎?** | 評分是 `CalmarRatio`(`CAGR / abs(MddRatio)`),**完全不看交易次數**——可能挑出只交易 3 次剛好都對的參數。[backtest-tools.md](backtest-tools.md) 直接寫「尋優本身就是過度配適的來源」,建議至少切成前後兩段分別驗 | ### 提問模板 ```text 用 ⟨積木條件 A⟩ 且 ⟨積木條件 B⟩ 選股,排除 ETF,挑 N 檔做組合回測,資金 X 元。 跑完: ① 只看 Strategy 欄 ② 確認 capital 有真的生效 ③ 成本佔比 ④ 尋優後給我 TotalTrades,我要判斷是不是過度配適 ``` --- ## 小白最常犯的三個提問錯誤 | 這樣問 | 為什麼不好 | 改成 | |---|---|---| | 「幫我找會漲的股票」 | 沒有可對應的積木,LLM 只能猜一個名字像的 | 講**可觀測的條件**:營收、法人買超、突破均線 | | 「幫我回測近十年」 | **日頻硬上限 1000 筆(約 4.1 年)**,十年做不到 | 「近三年」,或明說「可以降到週/月頻」 | | 「順便幫我下單」 | SnowyOwl **沒有下單功能**,`api` 上不存在 `Order` | 選股 + 回測到此為止 | --- ## 相關頁 - [開始使用 SnowyOwl](getting-started.md):三條路的分流 - [回測 api.bt 總覽](backtest.md):積木 sig 餵進 Core 的完整路徑 - [商品規格與績效報告](backtest-report.md):`unit` / `capital` / `tax_*` 的完整說明 - [錯誤訊息速查](errors.md):13 項「不報錯但結果是錯的」 - [Block 已知落差](block-caveats.md):積木名稱可能與實際邏輯不符 ==================================================================================================== # 配方集:照抄就能跑的完整腳本 > 所屬章節:入門 > 每一份都是**實跑驗證過**的完整腳本,貼上換參數就能執行 > 績效數字為實測值,資料日 2026-09-11 ## 這頁在解決什麼 寫一支最簡單的單檔回測,資訊散在六頁裡: ```text backtest.md → daily_bars() 範本、為什麼不用 get_stock_ohlc backtest-strategy.md → 標準骨架、on_init 放參數、暖身期 backtest-order.md → Condition.Global 七個參數 backtest-report.md → unit/capital/tax 陷阱 backtest-tools.md → self.Ind 每根都要呼叫 data-history.md → 日頻 1000 筆上限 ``` **這頁把它們拼好。** 要改需求時再回去查對應那頁。 --- ## 共用前置 ```python import sys sys.path.insert(0, r'') # 用原始碼樹時才需要;pip 裝的不用 import pandas as pd import snowyowl as so api = so.login(type='google') # 或 so.login('user@x.com', 'pwd') bt = api.bt ``` ### 取日 K 的標準函式 **日 K 一律從 `api.MSMP` 取,不要用 `bt.Tools.get_stock_ohlc`**—— 後者是 1 分 K resample,跟積木的日頻 `sig` 對不上,還多一次大量下載。 ```python def daily_bars(api, symbol, adj=True): """回傳可直接餵 feed_data 的 df。adj=True 用還原價。""" k = api.MSMP.日_K p = 'adj_' if adj else '' cols = {'開盤價': f'{p}Open', '最高價': f'{p}High', '最低價': f'{p}Low', '收盤價': f'{p}Close', '成交量': f'{p}Volume' if adj else 'Volume'} df = pd.DataFrame({zh: getattr(k, en)[symbol] for zh, en in cols.items()}) df.index.name = 'DateTime' return df.dropna().reset_index() # ← dropna 必要,未上市期間是 NaN ``` > 要 adjclose 就**整組都用 `adj_*`**(含 `adj_Volume`),不要混用還原價與未還原量。 ### 成本速查 | 標的 | config | |---|---| | 台股個股(以股計) | `fee=0.001425, tax_long=0, tax_short=0.003, unit=1` | | 台股個股(以張計) | 同上但 `unit=1000`,`qty` 要換算成張數 | | **台股 ETF**(0050/0056…) | `fee=0.001425, tax_long=0, tax_short=0.001, unit=1` | | 台指期 | `fee=500, tax_long=0.00002, tax_short=0.00002, unit=200, margin_long=0.13` | | 美股 | `fee=0, tax_long=0, tax_short=0, unit=1` | **台股只填 `tax_short`**,`tax_long` 留 0——兩邊都填會把證交稅收兩次。 --- ## 配方一:單檔技術指標回測(每次固定金額) > 對應 sample.md 案例 1。0050 的 MA5/MA10 多頭排列買、空頭排列賣,每次 10 萬。 ```python SYM, AMOUNT = '0050', 100_000 df = daily_bars(api, SYM, adj=True) class MaCross(bt.Core): def on_init(self): # 只放參數與狀態,下單會 RuntimeError self.n_fast, self.n_slow = 5, 10 self.amount = AMOUNT self.close_list = [] def on_bar(self, row): self.close_list.append(row['Close']) # row 的 key 一律英文 fast = self.Ind.rolling_mean(self.close_list, self.n_fast) slow = self.Ind.rolling_mean(self.close_list, self.n_slow) self.char['ma5'], self.char['ma10'] = fast[-1], slow[-1] # 進 char 才上圖 if len(self.close_list) < self.n_slow: return # 暖身期不下單 if fast[-1] > slow[-1] and self.global_qty == 0: qty = self.amount / row['Close'] # ★ 股數,必須搭 unit=1 self.Condition.Global(True, qty, 0, self.PriceType.market_ioc, None, 'bk') elif fast[-1] < slow[-1] and self.global_qty > 0: self.Condition.Global(True, -self.global_qty, 0, self.PriceType.market_ioc, None, 'bp') core = MaCross() core.feed_data(df, ['DateTime', '開盤價', '最高價', '最低價', '收盤價', '成交量']) cfg = bt.config(name='MA5_10_0050', symbol=SYM, fee=0.001425, tax_long=0, tax_short=0.001, unit=1) # ETF 稅率 bench = df.set_index('DateTime')['收盤價'] rp = bt.generate_report({cfg: core}, capital=1_000_000, benchmark=bench) ``` ### 驗證段(每次回測都跑) ```python COL = 'Strategy' # ★ 單策略時欄名就是這個,不是 config.name td = rp.trade_detail gross, cost = (td['pnl'] + td['cost']).sum(), td['cost'].sum() invest = rp.report.loc['Invest', COL] print(f'毛損益 {gross:,.0f} / 成本 {cost:,.0f}(佔 Invest {cost/invest*100:.1f}%)') print(f'期間 {rp.report.loc["StartDate",COL]} ~ {rp.report.loc["EndDate",COL]}') print(f'曝險率 {(rp.daily["position"].abs()>0).mean()*100:.1f}%') print(f'策略 {rp.report.loc["TotalReturns",COL]*100:.2f}% ' f'vs benchmark {rp.report.loc["TotalReturns","benchmark"]*100:.2f}%') rp.dashboard(path='dashboard.html', view=None) # ★ 腳本裡要給 path ``` ### 實測結果 ```text 期間 2022-08-15 ~ 2026-09-11(4.08 年,日頻 1000 筆上限) 策略 0050 B&H TotalReturns +81.04% +292.84% CAGR 16.31% 41.71% MaxDrawdown -14.23% -27.48% SharpeRatio 1.38 1.56 AnnualisedVol 11.38% 24.28% 毛損益 104,213 / 成本 20,644(佔 Invest 20.0%) 53 筆交易、勝率 48%、盈虧比 2.56、曝險率 61.3% ``` (2026-09 的輸出;2026-10 起 `rp.report` 的 `MaxDrawdown` 改名 `MddRatio`,另有 `MddAmount` 最大回撤金額。) **怎麼讀**:總報酬輸很多,但 MDD 與波動都只有一半。 曝險率 61.3% 是關鍵——38.7% 的時間空手,而標的同期漲 3 倍。 **這是結構問題,不是參數問題**(實測掃 95 組 MA 參數,贏過 buy&hold 的是 0 組)。 --- ## 配方二:積木訊號當進出場 > 積木選出的 `sig` 是日頻矩陣,與 MSMP 日 K 天然對齊,不需 reindex/ffill。 ```python SYM = '2330' con = api.Block.con_tw('今日收盤價<>D日(周月)均線', period=20, table='日_K') r = api.Block.screener_tw([con]) df = daily_bars(api, SYM, adj=True) df['sig'] = df['DateTime'].map(r['sig'][SYM]).fillna(False) class BlockStrategy(bt.Core): def on_bar(self, row): if row['sig'] and self.global_qty == 0: self.Condition.Global(True, 1, 0, self.PriceType.market_ioc, None, 'bk') elif not row['sig'] and self.global_qty > 0: self.Condition.Global(True, -self.global_qty, 0, self.PriceType.market_ioc, None, 'bp') core = BlockStrategy() core.feed_data(df, ['DateTime', '開盤價', '最高價', '最低價', '收盤價', '成交量'], columns=['sig']) # ★ 額外欄位一定要宣告,否則 row 裡沒有 cfg = bt.config(name=f'block_{SYM}', symbol=SYM, fee=0.001425, tax_long=0, tax_short=0.003, unit=1000) rp = bt.generate_report({cfg: core}, capital=1_000_000) ``` **選股結果不要直接當回測標的** —— 用今天選出的股票回測過去是 look-ahead, 等於事先知道誰會被選上。要嘛用固定清單,要嘛在策略內逐日重算。 --- ## 配方三:多檔組合(共用資金池) > 關鍵:`qty` 要填 **0~1 的比例**,`capital` 才會生效。固定口數走向量化路徑,`capital` 完全不參與計算。 ```python SYMS = ['2330', '2317', '2454', '1301', '2882'] W = 1 / len(SYMS) # ★ 1/檔數 是安全上限,見下方說明 class PctStrategy(bt.Core): def on_init(self): self.n_fast, self.n_slow = 5, 20 self.close_list = [] def on_bar(self, row): self.close_list.append(row['Close']) fast = self.Ind.rolling_mean(self.close_list, self.n_fast) slow = self.Ind.rolling_mean(self.close_list, self.n_slow) if len(self.close_list) < self.n_slow: return if fast[-1] > slow[-1] and self.global_qty == 0: self.Condition.Global(True, W, 0, self.PriceType.market_ioc, None, 'bk') elif fast[-1] < slow[-1] and self.global_qty > 0: self.Condition.Global(True, -self.global_qty, 0, self.PriceType.market_ioc, None, 'bp') core_dic = {} for s in SYMS: c = PctStrategy() c.feed_data(daily_bars(api, s), ['DateTime','開盤價','最高價','最低價','收盤價','成交量']) core_dic[bt.config(name=s, symbol=s, fee=0.001425, tax_long=0, tax_short=0.003, unit=1000)] = c rp = bt.generate_report(core_dic, capital=10_000_000) print(rp.report['Strategy']) # ★ 只有這一欄是組合,其餘是「該檔獨佔全部資金」 ``` **`rp.report` 逐檔加總 ≠ `Strategy`。** 其餘各欄是單獨視角。 **為什麼是 `1/檔數`**:`capital` 只累加已實現損益、**不扣未平倉佔用的資金**, 所以 N 檔同時進場時每檔都拿同一份 capital 的比例算口數, `weight × 同時持有檔數 > 1` 就是隱性槓桿。 **資金不夠時的誤導訊息**:`capital × weight` 買不起一張(台股 1000 股)時, `floor` 把口數夾成 0,全部被夾掉會拋 `RuntimeError: make_daily: 每日損益全為 0`——訊息說是版本問題, **實際上幾乎都是資金不夠**。三種解法:提高 `capital`、減少檔數, 或**改用零股 `unit=1`**(檔數多、資金小時這才是正解,見配方五)。 --- ## 配方四:期貨雙均線多空反手(台指期 TXF) > 對應 sample.md 案例 3。60 分 K、快線上穿做多、下穿做空、多空反手、結算日強制出場。 > 期貨資料在 `api.MSMP._fut_TXF`(底線私有屬性),不在 `api.Data` 的 80 張表裡。 ```python import numpy as np df1 = api.MSMP._fut_TXF # DateTime, Open, High, Low, Close, TotalVolume, settlement class DualMA(bt.Core): def on_init(self): self.n_fast, self.n_slow = 5, 20 self.tick_map = [(np.inf, 1)] # ★ 期貨最小跳動 1 點,不設會套股票規格 self.C = [] def on_bar(self, row): self.C.append(row['Close']) fast = self.Ind.rolling_mean(self.C, self.n_fast) slow = self.Ind.rolling_mean(self.C, self.n_slow) if len(self.C) <= self.n_slow: return # 暖身期不下單 self.char['fast'], self.char['slow'] = fast[-1], slow[-1] # ★ 「上穿」要比較前一根,不是單純比大小 cross_up = fast[-2] <= slow[-2] and fast[-1] > slow[-1] cross_dn = fast[-2] >= slow[-2] and fast[-1] < slow[-1] # ★ 多空反手:一次補齊到目標部位(±1 口),不必先平再開 self.Condition.Global(cross_up and self.global_qty < 1, -self.global_qty + 1, 0, self.PriceType.market_ioc, None, 'long') self.Condition.Global(cross_dn and self.global_qty > -1, -self.global_qty - 1, 0, self.PriceType.market_ioc, None, 'short') # 結算日強制平倉 self.Condition.Global(row['DateTime'] == row['Settlement'] and self.global_qty != 0, -self.global_qty, row['Close'], self.PriceType.compel_now, False, '結算') core = DualMA() core.set_tick_period(freq=60, need_settlement=True, # 60 分 K,日盤+夜盤 args=['DateTime','Open','High','Low','Close','TotalVolume']) core.feed_tick_df(df1) # ★ 期貨走 feed_tick_df,不是 feed_data cfg = bt.config(name='dualma', symbol='TXF', fee=500, tax_long=0.00002, tax_short=0.00002, unit=200) rp = bt.generate_report({cfg: core}) ``` ### 多空反手的寫法 `-self.global_qty + 1` 是「**一次補齊到 +1 口**」:手上是 -1 口時送 +2、空手時送 +1、 已經 +1 口時條件 `global_qty < 1` 不成立所以不送。**不需要先平倉再開倉**。 部位檢查要用 `< 1` / `> -1`,不是 `== 0`——用 `== 0` 就只能空手時進場,反不了手。 ### 實測結果(2,589,900 列 1 分 K → 60 分 K) ```text TotalTrades 2508(多 1254 / 空 1254) 多單 pnl +4,922,079 空單 pnl -2,591,080 ← 空單是虧的 ``` **多空分開看損益**,不要只看總和: ```python td = rp.trade_detail for d in ('long', 'short'): s = td[td['direction'] == d] print(f'{d}: {len(s)} 筆, pnl {s["pnl"].sum():,.0f}, 勝率 {(s["pnl"]>0).mean()*100:.1f}%') ``` 這組參數的空單是**淨虧損**的——總報酬為正純粹靠多單撐著。 只看總績效會誤以為「多空都做有效」。 **期貨四個必做**:`tick_map=[(np.inf,1)]`、`fee=500`(>=1 自動切換成每口固定金額)、 `unit=200`、結算日判斷用 `row['DateTime'] == row['Settlement']`。 **要多週期**(60 分進場 + 日線過濾)一定要走 `set_tick_period(freq=[60,'D'])` + `feed_tick_df`, **`feed_data` 不會觸發 `on_bar2`**。 --- ## 配方五:目標權重輪動(選股 + 月頻換股) > 對應 sample.md 案例 2、5。文件到處說「要用目標權重不要固定金額」,這是實作。 > **小資金做多檔輪動一定要用零股**,見下方對照。 ```python TOP_N, CAPITAL = 20, 1_000_000 M = api.MSMP # ── 1) 股池:排除 ETF / KY / DR ───────────────────────── bad = set(M.list['etf']) | set(M.list['KY']) | set(M.list['DR']) close = pd.DataFrame(M.日_K.adj_Close) raw_close = pd.DataFrame(M.日_K.Close) # ★ 未還原價才是真實股價,門檻用它 vol = pd.DataFrame(M.日_K.Volume) # 單位是「張」 univ = [c for c in close.columns if c not in bad] close, raw_close, vol = close[univ], raw_close[univ], vol[univ] R = close.index # ── 2) 可交易性遮罩(排名前先套)──────────────────────── turnover = (raw_close * vol * 1000).rolling(20).mean() # ★ Volume 是張,要 ×1000 tradable = (turnover.rank(axis=1, pct=True) > 0.4) & (raw_close >= 10) # ── 3) 因子:月營收 YoY,用官方方法轉成公告日 ──────────── feat = pd.DataFrame(M.月_營收.YoY.index_str_to_date()).reindex(columns=univ) feat = feat.reindex(feat.index.union(R)).ffill().reindex(R) # union→ffill→reindex # ── 4) 換股日 = 營收公告日,每次選 top_n ───────────────── pub = pd.DataFrame(M.月_營收.YoY.index_str_to_date()).index score = feat.where(tradable) # ★ 先遮罩再排名,母體才一致 picks = {d: score.loc[d].dropna().nlargest(TOP_N).index.tolist() for d in sorted(set(pub) & set(R)) if score.loc[d].notna().any()} # ── 5) 攤成「每天該持有誰」的布林表 ────────────────────── all_syms = sorted({s for v in picks.values() for s in v}) hold = pd.DataFrame(False, index=R, columns=all_syms) cur = [] for d in R: if d in picks: cur = picks[d] if cur: hold.loc[d, [c for c in cur if c in hold.columns]] = True # ── 6) 每檔一個 core,qty=1/N 走百分比路徑 ─────────────── W = 1 / TOP_N class Rotate(bt.Core): def on_bar(self, row): if row['sig'] and self.global_qty == 0: self.Condition.Global(True, W, 0, self.PriceType.market_ioc, None, 'bk') elif not row['sig'] and self.global_qty > 0: self.Condition.Global(True, -self.global_qty, 0, self.PriceType.market_ioc, None, 'bp') k = M.日_K core_dic = {} for s in all_syms: df = pd.DataFrame({'開盤價': k.adj_Open[s], '最高價': k.adj_High[s], '最低價': k.adj_Low[s], '收盤價': k.adj_Close[s], '成交量': k.adj_Volume[s]}).dropna() if len(df) < 100: continue df.index.name = 'DateTime' df = df.reset_index() df['sig'] = df['DateTime'].map(hold[s]).fillna(False) if not df['sig'].any(): continue c = Rotate() c.feed_data(df, ['DateTime','開盤價','最高價','最低價','收盤價','成交量'], columns=['sig']) core_dic[bt.config(name=s, symbol=s, fee=0.001425 * 0.3, # 手續費 3 折 tax_long=0, tax_short=0.003, unit=1)] = c # ★ unit=1 = 零股 rp = bt.generate_report(core_dic, capital=CAPITAL, benchmark=pd.DataFrame(M.日_K.adj_Close)['0050'].dropna()) print(rp.report['Strategy']) # ★ 只有這欄是組合 ``` ### 零股 vs 整股:小資金只能做零股 `unit=1` 是**以股計價**,也就是**零股**。這不是變通寫法—— 小資金做多檔輪動在現實中本來就是買零股。實測對照(capital 100 萬、20 檔、`W=1/20`): | 設定 | 結果 | |---|---| | `unit=1`(零股) | **正常跑**。單筆進場中位 **53,031** 元(≈ capital/20)、股數中位 1560 股、**最小 120 股** | | `lot_size='inf,0,floor,1000'`(整股) | **掛掉**,全期只成交 2 筆 | 整股版之所以掛掉:`capital × 1/20 = 5 萬`,買不起一張台股(動輒幾十萬), `floor` 把口數夾成 0,然後拋出那個**會誤導人的錯誤訊息**: ```text RuntimeError: make_daily: 每日損益全為 0,無法產生報表。 常見原因是 pandas / numpy 版本不相容… ``` **它跟版本無關,就是資金不夠買一個單位。** | 你要的 | 設法 | |---|---| | 零股(1 股一取) | `unit=1`,`lot_size` 用預設 `'inf,0,floor,1'` | | 整股(1000 股一取) | `unit=1` + `lot_size='inf,0,floor,1000'`,且 `capital × W` 要買得起一張 | | 整張思考(qty 是張數) | `unit=1000`,`qty` 自己換算成張數 | > **框架沒有「最低手續費」參數。** `fee` 只有費率(`<1`)與每口固定金額(`>=1`)兩種模式, > 無法表達券商零股常見的 **20 元低消**。小額零股的真實成本會比回測高, > 單筆 5 萬 × 0.1425% × 3 折 ≈ 21 元剛好在低消邊緣,再小就會被低消吃掉。 ### 實測結果(60 檔子集、月營收 YoY 單因子) ```text 股池 2874 → 排除 ETF/KY/DR 後 2331 可交易遮罩:平均每日 1211 檔通過 換股 49 次,每次 20 檔,全期出現過 236 檔 TotalReturns +14.85% vs 0050 benchmark +312.82% MaxPosition 638,979 / capital 1,000,000 ← capital 確實生效 毛損益 90,947 / 成本 25,348(佔 Invest 5.7%) TotalTrades 122 ``` **大幅落後 0050**,原因見**配方六**的 IC 分析—— 月營收 YoY 單因子的 IC 幾乎為零。這正是 [how-to-ask.md](how-to-ask.md) 案例 2 「單因子選股輸給大盤」的完整重現。要改善得做多因子合成(sample.md 案例 5)。 > `MaxPosition < capital` 是**確認 `capital` 有生效**的指標。 > 若遠大於 capital,代表走了固定口數路徑,`capital` 根本沒參與計算。 --- ## 配方六:訊號驗證(IC 與分組單調性) > 對應 sample.md 案例 4 的第 ④ 階。**在花時間跑回測之前先做這個。** ### 兩個一定要知道的陷阱 **① 月頻/季頻的 index 是字串,用 `index_str_to_date()` 轉,不要自己接。** `月_營收` 的 index 是 `'2026-M08'`(營收**所屬月份**),不是公告日。 直接拿去跟日頻對齊就是未來函數——8 月營收要到 9/10 才公告。 MSMP 的矩陣有現成方法: ```python rev = api.MSMP.月_營收.YoY # index: '2026-M06', '2026-M07', '2026-M08' rev_d = rev.index_str_to_date() # index: 2026-07-13, 2026-08-10, 2026-09-10 ``` 它做了三件事,自己接 `INDEX['M']` 都做不到: | 做了什麼 | 說明 | |---|---| | 月頻 → **次月 10 日** | 月營收法定公告日;12 月跨年處理好;再用 `_to_trading_day()` 順延到實際交易日(`2026-M06` → `07-13` 因為 7/10 是週末) | | 季頻 → **財報公告日** | Q1→5/15、Q2→8/14、Q3→11/14、Q4→**次年** 3/21。`2025-Q4` → `2026-03-23` | | **自動遮蔽下市後的資料** | 依 `delist_dates`,下市後布林填 `False`、數值填 `NaN`。**這是防倖存者偏差的關鍵** | 年頻(`'2026-Y'`)同樣支援。**一律用它,不要自己拼日期。** **② `corrwith` 會炸,要先 `pd.DataFrame()` 脫殼。** MSMP 回的是 `ProboDataFrame`(`pd.DataFrame` 的子類),它覆寫了 `__mul__` / `__sub__` 等運算子去做自動 reshape。pandas 的 `corrwith` 內部會做 `ldem * rdem`, 一旦兩邊 index 型態不同就會走進 reshape 然後爆掉: ```text TypeError: '<=' not supported between instances of 'str' and 'Timestamp' ``` **解法是脫殼成純 pandas**: ```python close = pd.DataFrame(api.MSMP.日_K.adj_Close) # ← 加這層就好 ``` > 一般的矩陣運算(相加、相除、比大小)**要保留 `ProboDataFrame`**, > 自動對齊很好用。只有在呼叫 `corrwith` 這類 pandas 內建統計方法時才需要脫殼。 ### 完整程式碼 ```python import pandas as pd close = pd.DataFrame(api.MSMP.日_K.adj_Close) # ★ 脫殼 fwd = close.shift(-20) / close - 1 # 未來 20 日報酬 R = close.index # 特徵:月營收 YoY,轉成公告日後對齊到日頻 feat = pd.DataFrame(api.MSMP.月_營收.YoY.index_str_to_date()) feat = feat.reindex(feat.index.union(R)).ffill().reindex(R) # ★ union→ffill→reindex # ① IC ic = feat.corrwith(fwd, axis=1).dropna() print(f'IC n={len(ic)}, mean={ic.mean():.4f}, IR={ic.mean()/ic.std():.3f}') # ② 分組單調性(5 組) q = feat.rank(axis=1, pct=True) for i in range(5): mask = (q > i/5) & (q <= (i+1)/5) print(f' Q{i+1}: {fwd.where(mask).stack().mean()*100:+.2f}%') ``` ### 實測結果(月營收 YoY) ```text IC n=980, mean=-0.0014 ← 幾乎為零 Q1: +0.69% Q2: +1.07% Q3: +1.34% Q4: +1.66% Q5: +2.14% ← 但分組是單調遞增的 ``` **怎麼讀**:IC 接近零卻分組單調,代表這個因子有**方向性但訊號很弱**, 橫斷面相關係數被極端值稀釋了(月營收 YoY 有 `+1,073,121%` 這種除以零的值)。 單獨用它選前 20 檔會選到一堆財報異常的公司——這正是 [how-to-ask.md](how-to-ask.md) 案例 2 「單因子 YoY 選股輸給 0050」的量化原因。 **判讀標準**:`|IC| > 0.03` 算有訊號;分組要**單調**才可信。 兩個都不過就別跑回測了,先換因子或做極端值處理。 --- ## 配方七:參數尋優 ```python def opt(n_fast=5, n_slow=10): core = MaCross() core.n_fast, core.n_slow = n_fast, n_slow # 覆寫 on_init 設的 self.xxx core.feed_data(df, ['DateTime','開盤價','最高價','最低價','收盤價','成交量']) return bt.generate_report({cfg: core}, capital=1_000_000) best = bt.Tools.optimize(opt, {'n_fast': [3, 20, 1], 'n_slow': [10, 60, 5]}, times=50) rp_best = opt(**best) print(best, rp_best.report.loc['TotalTrades', 'Strategy']) # ★ 一定要看交易次數 ``` **三個警告**: 1. 每次呼叫**都要建新的 `core`**——core 有狀態,重用會累積前一次的部位。 2. 評分是 `CalmarRatio`(`CAGR / abs(MddRatio)`),**完全不看交易次數**—— 可能挑出只交易 3 次剛好都對的參數。 3. **尋優本身就是過度配適的來源。** 至少把資料切前後兩段分別驗。 **掃參數之前先看曝險率**——低曝險 + 大多頭標的時,掃參數救不了,見配方一的結論。 ### 前後兩段分別驗(sample 案例 3、4 都要求) 文件到處都說「至少切前後兩段」,做法是這樣: ```python td = rp.trade_detail d = pd.to_datetime(td['entry_time']) # ★ 時間欄是字串,要先轉 mid = d.min() + (d.max() - d.min()) / 2 for label, mask in (('前段', d < mid), ('後段', d >= mid)): s = td[mask] print(f'{label}: {len(s)} 筆, pnl {s["pnl"].sum():,.0f}, ' f'勝率 {(s["pnl"]>0).mean()*100:.1f}%') ``` 實測配方四那組雙均線參數: ```text 切點 = 2022-01-13 前段: 1258 筆, pnl -457,726, 勝率 34.2% 後段: 1250 筆, pnl +2,788,724, 勝率 37.6% ``` **兩段差距這麼大就不能只看總績效。** 這組參數的獲利幾乎全來自後段, 前段是虧的——代表它吃的是某段特定行情,不是穩定的邊際優勢。 > `entry_time` / `exit_time` 都是 **`strftime` 過的字串**不是 `datetime64`, > 直接用 `.dt` 會失敗,一定要先 `pd.to_datetime()`。 **更嚴格的做法**是只在前段尋優、拿後段驗證(真正的樣本外): ```python # 只餵前段資料尋優 → 得到 best → 用 best 跑後段,看還成不成立 ``` 分段驗證不過的參數,`optimize` 給的分數再漂亮都不能用。 --- ## 跑完一定要回答的三件事 不論哪個配方: | 問題 | 怎麼算 | 為什麼 | |---|---|---| | **毛損益與成本佔比** | `(td['pnl']+td['cost']).sum()`、`cost/Invest` | 日頻策略常常毛損益為正、虧損全來自成本。看到負報酬就否定策略是誤判 | | **回測期間實際多長** | `rp.report.loc['StartDate'/'EndDate', COL]` | 日頻硬上限 1000 筆(約 4.1 年),使用者以為的「近十年」拿不到 | | **曝險率** | `(rp.daily['position'].abs()>0).mean()` | 判斷輸給 buy&hold 是結構問題還是參數問題 | --- ## 相關頁 - [怎麼問,才問得到你要的東西](how-to-ask.md):把需求講清楚的三組案例 - [怎麼制定一個 plan](how-to-plan.md):六階段研究流程 - [案例集:小白怎麼問回測](case-study-backtest.md):三個案例的完整追問清單 - [商品規格與績效報告](backtest-report.md):`unit`/`capital`/`tax_*`、報表欄位定義 - [事件模型與策略撰寫](backtest-strategy.md):事件順序、`row` 欄位、狀態屬性 - [委託、成交價與風控](backtest-order.md):`PriceType`、12 個成交價實測案例 ==================================================================================================== # so.login 登入 > 所屬章節:入門 > 以 2026-08-20 實際執行結果為準 ## Overview 建立並回傳已初始化的 api 物件。 ```python so.login(person_id, person_pwd, type='account') ``` - **帳密登入**(預設 `type='account'`):`person_id` 與 `person_pwd` 兩個都要, 缺一會印「登錄失敗」不登入。`so.login()` 空手呼叫會失敗。 - **google / apple**(`type='google'` / `'apple'`):開瀏覽器讓使用者選帳號,不必給帳密。 首次要在瀏覽器認證,之後 72 小時內走本機快取免認證(帳密登入不快取)。 - 登入結果快取在 `~/.snowyowl/auth.json`;`api.logout()` 清掉,`force=True` 強制重登。 ```python api = so.login('user@x.com', 'pwd') # 帳密 # 或 so.login(type='google') # 開瀏覽器(apple 同理) ``` | 回傳 | 型態 | 說明 | |------|------|------| | api | `snowyowl.main.login` | 已掛好各命名空間的物件,`repr` 為 `Api Instance is ready` | ## Manual Sample Input/Output ### Example 1:登入並檢查掛載結果 #### input ```python import snowyowl as so api = so.login('user@x.com', 'pwd') [n for n in dir(api) if not n.startswith('_')] ``` #### output ```text ['Block', 'Data', 'MSMP', 'USData', 'USMSMP', 'bt', 'login', 'logout', 'person_id', 'person_pwd', 'type'] ``` > 本版不含即時行情訂閱:`api` 上沒有 `SWQuote` / `Quote` / `USQuote` / `FutQuote`。 --- ### Example 2:登入訊息逐行說明 #### output ```text [2026-08-20 11:05:58] INFO - [v6.4.17]開始執行 TokenManager [2026-08-20 11:05:58] INFO - 開始執行 貓頭鷹 Token 取得流程 [2026-08-20 11:05:58] INFO - 成功取得 貓頭鷹 Token 正在下載 ... ← 首次或快取過期時更新 MSMP [系統訊息] MSMP 物件初始化完成。 ← api.MSMP 可用 [系統訊息] USMSMP 物件初始化完成。 ← api.USMSMP 可用 [系統訊息] 已將資料存入本地暫存 [系統訊息] Block 積木物件初始化完成。 ← api.Block 可用 [系統訊息] API 加載完成,歡迎使用。 ``` Token 取不到時會印 `[系統訊息] Token無效,停止初始化行情與資料`, 此時 `api.MSMP` 仍可用(不需 token),但 `api.Data`、`api.Block`、`api.bt` 都不會掛上去。 --- ### Example 3:登出 #### input ```python api.logout() ``` #### output ```text (無輸出) ``` `logout()` 會清空 `api.__dict__`,只保留 `login` 方法本身, 所以登出後可以再 `api.login()` 重新登入。登出後存取 `api.MSMP` 會拋 `AttributeError`。 ==================================================================================================== # api 物件結構 > 所屬章節:入門 > 以 2026-08-20 實際執行結果為準 ## Overview `so.login()` 回傳的物件上掛好這些命名空間,登入時建立。本版不含即時行情訂閱(`api` 上沒有 `SWQuote` / `Quote` / `USQuote` / `FutQuote`)。 ## Manual Sample Input/Output ### Example 1:完整屬性表 #### input ```python for n in sorted(n for n in dir(api) if not n.startswith('_')): print(f"{n:12} {type(getattr(api, n)).__name__}") ``` #### output ```text Block Block Data _DataObj MSMP _MSMP USData _USDataObj USMSMP _MSMP bt SecureMain login method logout method person_id str person_pwd str type str ``` --- ### Example 2:各命名空間的方法 #### input ```python print(api.Block) ``` #### output ```text Block(積木) 台股 get_table_tw() con_tw() screener_tw() 美股 get_table_us() con_us() screener_us() ``` #### input ```python [n for n in dir(api.Data) if not n.startswith('_')] [n for n in dir(api.USData) if not n.startswith('_')] ``` #### output ```text ['get', 'get_table'] # 台股:無 get_snapshots ['get', 'get_snapshots', 'get_table'] # 美股:有 get_snapshots ``` #### input ```python [n for n in dir(api.bt) if not n.startswith('_')] ``` #### 會用到的四個 ```text ['Core', 'Tools', 'config', 'generate_report'] ``` `Core` 寫策略、`config` 設商品規格與成本、`generate_report` 產報表、`Tools` 是取資料與參數尋優。用法見 [backtest.md](backtest.md) 起五頁。 --- ## SnowyOwl 的能力邊界 | 功能 | SnowyOwl | |------|---------| | 表格查詢 `api.Data` / `api.USData` | 有 | | 矩陣資料 `api.MSMP` / `api.USMSMP` | 有(另有 `MSMP._fut_TXF`:台指期 1 分 K,9.3 年) | | 積木選股 `api.Block` | 有(台股 405 個、美股 260 個積木) | | 回測 `api.bt` | 有(backtest_plus) | | 即時行情訂閱(推送) | **沒有**,`api` 上不存在 `SWQuote` / `Quote` / `USQuote` / `FutQuote` | | 盤中快照(拉取式) | 美股 `api.USData.get_snapshots()`;台股用 `api.Data.get()` 分K查詢 | | 下單 / 帳務 | **沒有**,`api` 上不存在 `Order` | `api` 上沒有 `Order`,也沒有 CA 憑證流程——SnowyOwl 是資料、選股與回測用的, 不做交易委託。要下單得用另外的下單套件。 ==================================================================================================== # 錯誤訊息速查 > 所屬章節:入門 > 每一則訊息都是 2026-08-21 實際觸發後抄下來的原文 撞到錯誤先查這頁。最後一節「**不報錯但結果是錯的**」是最該看的—— 那些不會拋例外,只會給你錯的答案。 ## 兩層驗證:`con()` 驗規格,`screener()` 驗 class **這是最常誤解的地方。** `con_tw()` / `con_us()` 只比對 `block_spec.json` 的合法值清單; 積木 class 自己的限制要到 `screener()` 建構物件時才浮現。 ```python B.con_tw('漲跌幅介於P1%到P2%之間', percent1=5, percent2=9) # 沒報錯,回一個 dict B.screener_tw([那個 dict]) # ValueError: percent1 (5) must be greater than percent2 (9) ``` ```python B.con_tw('今日收盤價突(跌)破D日均線', operator='>', period=20, table='日') # 沒報錯 B.screener_tw([那個 dict]) # ValueError: 找不到名為 '日' 的表格。 ``` **所以 `con()` 過了不代表能跑。** 組完積木要真的跑一次 `screener()` 才算驗證過。 --- ## 積木(`api.Block`) | 訊息 | 原因 | 怎麼修 | |---|---|---| | `ValueError: 找不到積木 '不存在的積木'(market=tw)` | 名稱打錯,或那個積木在 `list_conditions` 有但 `get_table` 沒有(停用/漏登錄) | 只信 `get_table_tw()` 的 key。找積木用 `[n for n in B.get_table_tw() if '關鍵字' in n]` | | `ValueError: 積木「…」沒有參數 ['pct']` | 參數名打錯,或那個積木根本不吃參數 | `B.get_table_tw()['積木名']` 看有哪些參數 | | `ValueError: 積木「…」的參數 percent 不支援 4` | 值不在合法值清單裡 | 同上,看合法值。**別依賴預設值**——台股 59 個、美股 18 個積木的預設值不在自己宣告的清單內 | | `ValueError: 積木「…」的參數 ['value'] 已由規格固定,不可指定`
`value = 0.4` | 這個參數被規格釘死,`con()` 會自動帶出來 | 不要傳它。台股 28 個、美股 12 個積木有固定值 | | `ValueError: percent1 (5) must be greater than percent2 (9)` | `o6` 的 `percent1` 是**上界**、`percent2` 是**下界**,與名稱直覺相反 | 大的填 `percent1` | | `ValueError: 找不到名為 '日' 的表格。` | 8 個複合值積木的 `table`/`direction`,`get_table` 顯示 `['日','周','月']` 但 class 要 `'日_K'` | **不要傳這個參數**,用預設值(等於只有日頻)。`o29`/`o30`/`v5`/`v7`/`v8`/`m5`/`m7` 的 `table`、`r4` 的 `direction` | | `TypeError: Block.screener_us() got an unexpected keyword argument 'pool'` | 美股沒有股池 | 自己切 columns,見 [usmsmp.md](usmsmp.md) | | `IndexError: list index out of range` | `screener_tw([])` 傳了空清單 | 至少給一個積木 | | `AttributeError: module 'snowyowl.blocks.data_context' has no attribute 'api'` | 想繞過 `so.login()` 直接拿 api | 走 `api = so.login(person_id, person_pwd)`。資料來源是 login 內部 `bind_api()` 注入的 | --- ## 表格查詢(`api.Data` / `api.USData`) | 訊息 | 原因 | 怎麼修 | |---|---|---| | `ValueError: 找不到 table: 不存在的表` | 表名打錯 | 表名要**完全一致**含全形括號與斜線。常漏的是開頭的「取得」——`取得個股內外盤…` 有,`個股營收資訊…` 沒有 | | `ValueError: 參數輸入錯誤,正確用法:Data.get('…', '2330')` | 參數個數不對(少傳**或多傳**都是這則) | 照訊息裡印的用法改 | | `ValueError: 參數輸入錯誤,正確用法:Data.get('取得即時分K(最後交易日)', '2330', 1) # minutes 可選: [1, 3, 5, 15, 30, 60]` | 分K 表漏傳 `minutes` | 分K 的參數規則不一致,有的要 `minutes` 有的不要,見 [intraday.md](intraday.md) | | `KeyError: 'symbol'` | **看起來像少傳 symbol,其實是 `產業個股清單` 的 sector 值不合法** | sector 要填 `台股產業對照表` 的 `指數彙編分類`(172 種),`'半導體'` 不在其中 | | `KeyError: '內盤'` | 內外盤的欄名是**簡體 `内盤`** | 用 `df['内盤']` | | `IndexError: positional indexers are out-of-bounds` | 代號不存在(例如 `'999999'`) | 先用 `上市櫃/ETF清單(含當沖限制)` 或 `MSMP.INFO` 確認代號 | --- ## 矩陣資料(`api.MSMP` / `api.USMSMP`) | 訊息 | 原因 | 怎麼修 | |---|---|---| | `AttributeError: '_融資券' object has no attribute '融資餘額'` | 欄名打錯。融資券的欄名**帶單位**:`融資餘額_張`、`融券餘額_張` | 查 [msmp-tables.md](msmp-tables.md) 的完整欄位清單 | | `AttributeError: '_MSMP' object has no attribute '日_不存在'` | 表名打錯 | 台股 25 張、美股 10 張,見 [msmp-tables.md](msmp-tables.md) | | `ValueError: cannot reindex on an axis with duplicate labels` | `MSMP.list['all']` 含一個重複代號(`'7834'`),拿它當 DataFrame 的 columns | `list(dict.fromkeys(api.MSMP.list['all']))` 先去重。用 `isin()` 篩不受影響 | --- ## 回測(`api.bt`) | 訊息 | 原因 | 怎麼修 | |---|---|---| | `RuntimeError: 還沒有任何 K 棒就下單了 (self.row 是空的)。Condition.Global 只能在 on_bar / on_intrabar / on_position 裡呼叫,on_init 只用來初始化參數。` | 在 `on_init` 裡下單 | `on_init` 只放參數與狀態容器 | | `RuntimeError: make_daily: 每日損益全為 0,無法產生報表。…常見原因是 pandas / numpy 版本不相容…` | **訊息會誤導。** 實務上最常見的原因是**資金不夠買一個單位**,部位全被 `floor` 夾成 0 張 | 提高 `capital`、減少檔數,或改用單價低的標的。台股一張 1000 股 | | `AttributeError: 'generate_report' object has no attribute 'trade'` | 沒有 `rp.trade` 這個屬性 | 逐筆交易在 **`rp.trade_detail`** | --- ## 不報錯,但結果是錯的 **這一節最重要。** 下面每一項都不會拋例外,只會給你錯的答案。 | 症狀 | 為什麼 | 怎麼發現/避免 | |---|---|---| | **選股 0 檔,想知道是條件嚴格還是積木壞了** | 兩者的 `dataframe` 都是 `(0, 0)`,分不出來 | 看 `r['sig'].shape` 的**欄數**:正常是 `(1000, 2866)`(只是當日沒人通過);`(1000, 0)` 才是積木有問題。**目前全部 659 個積木都沒有這個問題**(`v24` 那個已修),這條是留給日後的診斷法 | | **檔數跟預期差很多** | 積木名稱與實際邏輯不符。例如 `漲跌幅介於P1%到P2%之間` 算的是**近 20 日**漲跌幅,不是當日 | `print(r['code'])` 看它實際算什麼。**積木名稱不是規格,`code` 才是** | | **`其他_大盤` 除個股矩陣得到空的** | `其他_大盤` 的 columns 是 **29 個法人分類**,不是股票代號 | 算佔比要用個股自己加總:`df.div(df.sum(axis=1), axis=0)` | | **改 `capital` 完全沒反應** | 固定口數(`qty >= 1`)下單時走向量化路徑,`capital` 不參與計算 | 要資金池生效,`qty` 填 0~1 的比例。見 [backtest-report.md](backtest-report.md) | | **回測成本高得離譜** | 證交稅被收了兩次 | **台股只填 `tax_short=0.003`**,`tax_long` 留 0(預設就是 0)。`tax_long` 乘的是進場價、`tax_short` 乘出場價,台股買進不課證交稅 | | **名目金額差 1000 倍** | 明確把 `unit` 設成 `1000`(以張計)之後又用 `qty = 金額/price`,`qty` 被當成張數 | **`unit` 預設就是 `1`(以股計),用 `qty = 金額/price` 不用改它**。只有刻意以張計時才要把 `qty` 換算成張數 | | **`from ...data_context import msmp` 拿到 `None`** | 沒注入時**安靜回 `None`**,之後才在別處炸成 `AttributeError` | 走 `api = so.login(person_id, person_pwd)` | | **分K 最後一根的量偏小** | 最後一根還在形成中,量還會累加 | 做訊號丟掉最後一根。K 棒用**結束時間**標記 | | **月營收數字差 100 倍** | `金額_千` 的單位是千元 | `÷ 1e5` 得億元(`_百萬` 結尾則 `÷ 1e4`) | | **`head(5)` 不是「最好的 5 檔」** | `r['dataframe']` 是**按代號排序**的 | 要挑標的自己排序(按成交額或積木的中間值欄) | | **美股漲幅排行全是沒聽過的代號** | 13174 檔裡有大量權證、次分錢股與反分割假象 | 加成交值門檻。美股**沒有成交額欄**,要 `Volume × Close` 自己算 | | **台股與美股的日期對不起來** | 美股資料日通常比台股**晚一天** | 各自取 `index[-1]`,不要假設一致 | | **「近五年」的資料只有四年** | 日頻硬上限 1000 筆(約 4.1 年) | 台股降到週/月/季頻(11~16 年)。**美股不行**,週月 K 也只有 4 年——長歷史只在財報與股利。見 [data-history.md](data-history.md) | --- ## 相關頁 - [Block 已知落差與注意事項](block-caveats.md):12 節,積木層的完整落差清單 - [資料頻率與歷史長度](data-history.md):各頻率能回溯多久 - [回測:商品規格與績效報告](backtest-report.md):成本與部位大小的設定 - [盤中、分K與逐筆明細](intraday.md):盤中資料的用途界線 ==================================================================================================== # 積木 Block 總覽 > 所屬章節:積木 Block > 以 2026-09-21 實際執行結果為準(台股 405 個積木、美股 260 個) ## Overview `api.Block` 把選股條件包成「積木」:每個積木是一個具名條件,帶固定的參數與合法值。 組好一組積木後交給 screener,回傳符合條件的股票清單、中間計算值,以及**等價的可執行程式碼**。 台股與美股各一組同名結尾的方法,market 已綁定,呼叫端不用再傳: | 台股 | 美股 | 用途 | |------|------|------| | `get_table_tw()` | `get_table_us()` | 每個積木的參數與**合法值** | | `con_tw(name, **params)` | `con_us(name, **params)` | 組出一個積木 dict | | `screener_tw(block_list, pool=None, date='now')` | `screener_us(block_list, date='now')` | 執行選股 | > **找不到合用的積木?** 405 顆原生積木都把窗格、聚合、位移、倍數寫死在 class 裡, > 參數合法值清單外的需求一律無解。這時用[通用積木](block-auto.md)的 `a1`/`a2`/`a3`—— > 把這些全部參數化,29 條常見條件(KD/MACD/RSI/布林/ADX/K棒型態/財報/營收/排行) > 實測全部組得出來。 ## 標準流程 ```python # 1. 查有哪些積木、參數能填什麼 api.Block.get_table_tw()['今日收盤價<>開高低P%'] # {'id': 'o1', # 'operator': ['<', '>'], # 'ohlc_field': ['adj_Open', 'adj_High', 'adj_Low'], # 'percent': [1, 2, 3, 5, 7, 9]} # 2. 組積木(不指定的參數走預設值;也可用 id='o1' 或整包 dict 指定積木) b1 = api.Block.con_tw('今日收盤價<>開高低P%', operator='>', ohlc_field='adj_High', percent=3) # {'id': 'o1', 'operator': '>', 'ohlc_field': 'adj_High', 'percent': 3, # 'close_field': 'adj_Close', 'period': 1} <- 尾端是規格固定值,con 自動補 # 3. 執行(多個積木是 AND) r = api.Block.screener_tw([b1]) # 4. 取用 r['dataframe'] # 符合的股票 + 各積木的中間值 r['date'] # 這批結果對應的資料日期 r['sig'] # 完整訊號矩陣(日期 × 股票代號 的 bool) r['code'] # 等價的可執行 python(作用域有 api 就能跑) ``` ## Manual Sample Input/Output ### Example 1:積木數量 #### input ```python len(api.Block.get_table_tw()), len(api.Block.get_table_us()) ``` #### output ```text (405, 260) ``` #### input ```python from snowyowl.blocks import list_conditions len(list_conditions(market='tw')), len(list_conditions(market='us')) ``` #### output ```text (409, 301) ``` > `list_conditions` 比 `get_table` 多,因為前者讀 condition registry(程式碼裡註冊的 > 全部類別),後者讀 `block_spec.json`(只收 Excel 中「狀態=啟用」的積木)。 > **多出來的積木無法用 `con` 建立**,詳見 [積木清單查詢](block-list-conditions.md)。 > `list_conditions` 不是 `api.Block` 的方法,要從 `snowyowl.blocks` 匯入。 --- ### Example 2:完整一次選股 #### input ```python b1 = api.Block.con_tw('今日收盤價<>開高低P%', operator='>', ohlc_field='adj_High', percent=3) b2 = api.Block.con_tw('今日收盤價(開低高)與近D日內最高價 # list_conditions 積木清單查詢 > 所屬章節:積木 Block > 以 2026-09-21 實際執行結果為準 ## Overview 列出 condition registry 裡註冊的積木類別與其 metadata。 ```python from snowyowl.blocks import list_conditions list_conditions(category=None, market='tw') list_conditions(category=None, market='us') ``` | 參數 | 型態 | 說明 | |------|------|------| | `category` | `str`, optional | 只列出該分類。**吃英文模組名**,不是中文次類別 | | `market` | `'tw'` / `'us'` | 市場,預設台股 | > **這不是 `api.Block` 的方法。** 早期版本掛過 > `api.Block.list_conditions_tw()` / `api.Block.list_conditions_us()`,現已移除—— > 它回的是內部 registry 的 metadata,不是選股會用到的東西。 > 要列出**可用**的積木,用 [`get_table`](block-get-table.md) 的 key。 > > `api.Block` 現在只有 6 個方法: > `get_table_tw/us`、`con_tw/us`、`screener_tw/us`。 回傳 `dict[str, ConditionMetadata]`,key 是積木 id。`ConditionMetadata` 欄位: | 欄位 | 說明 | |------|------| | `id` | 積木編碼,例如 `'o1'`、`'v1'`、`'dfunc5'` | | `name` | 積木名稱(`con` 的第一個參數用這個) | | `category` | **英文模組名**,例如 `'volume'`、`'ohlc'` | | `path` | 內部路徑字串(格式不統一,僅供參考) | | `cls` | condition 類別本身 | | `defaults` | `__init__` 的預設參數 | | `market` | `'tw'` 或 `'us'` | ## Manual Sample Input/Output ### Example 1:前三筆 #### input ```python d = list_conditions(market='tw') print(type(d).__name__, len(d)) for k, v in list(d.items())[:3]: print(f"{k} -> id={v.id} name={v.name!r} category={v.category!r}") print(f" defaults={v.defaults}") ``` #### output ```text dict 406 v1 -> id=v1 name='短均日數vs長均日數' category='volume' defaults={'period1': 5, 'period2': 20, 'operator': '>', 'table': '日_K', 'field': 'Volume', 'data_context': None} v2 -> id=v2 name='近D日成交量周轉率' category='volume' defaults={'period': 10, 'threshold': 50, 'operator': '>', 'volume_table': '日_K', 'volume_field': 'Volume', 'shares_table': '日_三大法人', 'shares_field': '發行總張數', 'data_context': None} v3 -> id=v3 name='日(週)成交金額>M億' category='volume' defaults={'threshold': 10, 'operator': '>', 'table': '日_K', 'field': '成交額_百萬', 'data_context': None} ``` > `defaults` 裡的 `data_context: None` 是內部參數,不要傳給 `con`。 --- ### Example 2:category 只接受英文模組名 #### input ```python import collections collections.Counter(m.category for m in list_conditions(market='tw').values()) ``` #### output ```text {'financial': 94, 'ohlc': 86, 'technical': 79, 'ranking': 32, 'moving_average': 25, 'sanda': 20, 'volume': 19, 'margin_trading': 18, 'dahu': 16, 'industry': 9, 'chips': 8} ``` 美股(7 種): ```text {'technical': 79, 'ohlc': 78, 'financial': 70, 'moving_average': 25, 'ranking': 23, 'volume': 17, 'industry': 5} ``` #### input ```python len(list_conditions(category='volume', market='tw')) ``` #### output ```text 19 ``` **用中文分類會得到空結果**,因為 metadata 的 `category` 是英文: #### input ```python list_conditions(category='漲跌幅', market='tw') ``` #### output ```text {} ``` 中文次類別(`漲跌幅`、`K棒型態`、`MACD指標` 等 37 種)只存在於 `block_spec.json`,用於 [台股積木完整參考](block-reference-tw.md) 的分組, 不能拿來過濾 `list_conditions`。 --- ### Example 3:list_conditions 比 get_table 多的那些 #### input ```python reg = set(list_conditions(market='tw')) spec_ids = { # get_table 的 key 是名稱,取其 id m.id for n, m in list_conditions(market='tw').items() if m.name in api.Block.get_table_tw()} sorted(reg - spec_ids) ``` #### output ```text ['m15', 'o2x', 'r22', 'r23', 'r24', 's9x', 's9y'] ``` 這 7 個(美股 42 個)在程式碼裡有註冊,但 Excel 規格把它們標為非啟用, 所以 `get_table` 與 `con` 都看不到。**列得出來但建不出來**,要建會拋 `ValueError: 找不到積木 ...`。 ==================================================================================================== # Block.get_table 積木參數與合法值 > 所屬章節:積木 Block > 以 2026-09-21 實際執行結果為準 ## Overview 回傳每個積木的 **python 編碼 `id`** 與可填參數的**合法值清單**。`con` 只接受這裡列出的值。 ```python api.Block.get_table_tw() api.Block.get_table_us() ``` 沒有參數。回傳 `dict`: ```text {積木名稱: {'id': 編碼, 參數名: [合法值, ...]}} ``` `id` 就是條件 dict 裡的 `'id'`,查表和寫條件可以一次完成: ```python t = api.Block.get_table_tw() t['dataA<>dataB+C']['id'] # 'a1' api.Block.con_tw(id='a1', left='日_K.Volume', operator='>', const=3000) ``` 其餘的 key 都是參數名,值為合法值清單(通用積木為自由值,清單為空)。 台股 416 筆(含 11 筆以 `a1`/`a3` 寫成的具名積木)、美股 260 筆。資料來源是 `block_spec.json`(由 `bulid_spec/build_spec.py` 從「台股積木API.xlsx / 美股積木API.xlsx」離線產生,再複製進 `snowyowl/blocks/`)。 ## Manual Sample Input/Output ### Example 1:查單一積木能填什麼 #### input ```python api.Block.get_table_tw()['今日收盤價<>開高低P%'] ``` #### output ```text {'id': 'o1', 'operator': ['<', '>'], 'ohlc_field': ['adj_Open', 'adj_High', 'adj_Low'], 'percent': [1, 2, 3, 5, 7, 9]} ``` --- ### Example 2:前四筆 #### input ```python for k, v in list(api.Block.get_table_tw().items())[:4]: print(f"{k!r}: {v}") ``` #### output ```text '今日收盤價<>開高低P%': {'id': 'o1', 'operator': ['<', '>'], 'ohlc_field': ['adj_Open', 'adj_High', 'adj_Low'], 'percent': [1, 2, 3, 5, 7, 9]} '今日收盤價距今日最低價 <>-P%': {'id': 'o10', 'percent': [3, 5, 7, 9]} '今日收盤價(開低高)與近D日內最高價開高低P%'] ``` #### output ```text {'id': 'o1', 'operator': ['<', '>'], 'field1': ['Open', 'High', 'Low'], 'percent': [1, 2, 3, 5, 7, 9]} ``` 台股叫 `ohlc_field`、美股叫 `field1`,值也不同(台股是還原價 `adj_*`, 美股是未還原 `Open/High/Low`)。**同名積木不能假設參數一致**,兩邊都要各查一次。 --- ### Example 4:搜尋積木 `get_table` 的 key 就是積木名稱,直接用字串比對即可: #### input ```python [n for n in api.Block.get_table_tw() if '均線' in n][:5] ``` #### output ```text ['D日均線糾結T日均線', 'D日均線<>T日均線<>H日均線', '今日收盤價<>D日(周月)均線'] ``` --- ## 注意:規格固定值不在這張表裡 有 33 個積木的部分參數被 Excel 規格**釘死**(例如 `今日收盤價<>開高低P%` 的 `period` 固定為 1)。這些值不是選項、無從挑選,所以不會出現在 `get_table` 的 輸出中。 自己手寫條件 dict 時漏掉它們,condition class 會退回自己 `__init__` 的預設值, 而那**未必等於規格值**——實測有 8 個積木兩者不同,結果會靜靜地跑掉: ```python # 錯:漏掉規格固定值 period=1,class 預設是 100 api.Block.screener_tw([{'id': 'o1', 'operator': '>', 'percent': 3}]) # 1779 檔 # 對:交給 con_tw 補齊 api.Block.screener_tw([api.Block.con_tw(id='o1', percent=3)]) # 595 檔 ``` 所以手寫 dict 建議只用在**通用積木**(`a1`/`a2`/`a3`,沒有固定值), 其他積木一律走 [`con`](block-con.md)——它會自動補上固定值,也會擋掉打錯的參數名。 完整清單(含每個積木的邏輯說明、預設值)見 [台股積木完整參考](block-reference-tw.md)、[美股積木完整參考](block-reference-us.md)。 ==================================================================================================== # Block.con 組積木 > 所屬章節:積木 Block > 以 2026-09-21 實際執行結果為準 ## Overview 把「積木 + 參數」組成 screener 吃的 dict。 ```python api.Block.con_tw(name, **params) api.Block.con_us(name, **params) ``` | 參數 | 型態 | 說明 | |------|------|------| | `name` | `str` / `dict` / 省略 | 積木名稱(`get_table` 的 key)、積木 `id`,或一份帶 `'id'` 的條件 dict | | `**params` | | 要覆寫的參數。沒指定的走該積木類別的預設值。`id` 是保留字,用來指定積木 | 回傳 `dict`,固定含 `id`,其餘是參數: ```text {'id': 'o1', 'operator': '>', 'ohlc_field': 'adj_High', 'percent': 3, 'close_field': 'adj_Close', 'period': 1} ``` 指定的參數會對照 `get_table` 的合法值驗證,不合法就拋 `ValueError`。 ### 三種指定積木的寫法 以下**輸出完全相同**,挑順手的用: ```python api.Block.con_tw('dataA<>dataB+C', left='日_K.Volume', operator='>', const=3000) api.Block.con_tw(id='a1', left='日_K.Volume', operator='>', const=3000) api.Block.con_tw({'id': 'a1', 'left': '日_K.Volume', 'operator': '>', 'const': 3000}) ``` dict 形式讓「先手寫條件、再補完驗證」變成同一條路徑:自己組的 dict 丟進來, 回傳的就是補齊預設值與規格固定值、且驗證過的版本。傳 dict 時不可再混用 keyword。 `id` 之所以能當保留字,是因為**沒有任何積木的參數叫這個名字**(台股 416、 美股 260 個積木都查過)。 ## Manual Sample Input/Output ### Example 1:全用預設值 #### input ```python api.Block.con_tw('今日收盤價<>開高低P%') ``` #### output ```text {'id': 'o1', 'operator': '>', 'ohlc_field': 'adj_Low', 'percent': 3, 'close_field': 'adj_Close', 'period': 1} ``` 尾端的 `close_field` / `period` 是規格固定值,見 Example 7。 --- ### Example 2:指定參數 #### input ```python api.Block.con_tw('今日收盤價<>開高低P%', operator='>', ohlc_field='adj_High', percent=3) ``` #### output ```text {'id': 'o1', 'operator': '>', 'ohlc_field': 'adj_High', 'percent': 3, 'close_field': 'adj_Close', 'period': 1} ``` --- ### Example 3:可以用中文標籤 Excel 規格為部分選項附了中文標籤,`con` 會自動轉回內部值: #### input ```python api.Block.con_tw('今日收盤價<>開高低P%', ohlc_field='最高價', percent=3) ``` #### output ```text {'id': 'o1', 'operator': '>', 'ohlc_field': 'adj_High', 'percent': 3, 'close_field': 'adj_Close', 'period': 1} ``` `'最高價'` 被轉成 `'adj_High'`。哪些選項有中文標籤,看 [台股積木完整參考](block-reference-tw.md) 的「合法值」欄(有標籤的會顯示成 `adj_High(最高價)`)。 字串型數字也接受:`percent='3'` 等同 `percent=3`。 --- ### Example 4:用 id 指定積木 三種寫法等價: #### input ```python api.Block.con_tw('o1') # id 當位置引數 api.Block.con_tw(id='o1') # id 當 keyword api.Block.con_tw({'id': 'o1'}) # dict ``` #### output ```text {'id': 'o1', 'operator': '>', 'ohlc_field': 'adj_Low', 'percent': 3, 'close_field': 'adj_Close', 'period': 1} ``` 但**一個 id 可能對到多個名稱**,那時用 id 會拋錯: ```text ValueError: 編碼 'm9' 對應到多個積木:['D日均線斜率<>0.4', 'D日均線斜率<>-0.4'] ``` 台股 4 組、美股 2 組 id 重複(`m9`、`m21`、`s1`、`r4`、`r23`), **這些積木只能用名稱**。其餘一律可用 id。 同時給名稱和 `id=` 且兩者不同,會擋下來: ```text ValueError: 同時指定了積木 'D日均線斜率<>0.4' 和 id='m5',請擇一 ``` --- ### Example 5:negate 參數自動取負 有些積木語意上就是負值(跌幅、距低點),Excel 把該參數標記為 negate。 不論你傳正或負,輸出一律是負值: #### input ```python api.Block.con_tw('今日跳空跌>-P%') ``` #### output ```text {'id': 'o18', 'percent': -3} ``` #### input ```python api.Block.con_tw('今日跳空跌>-P%', percent=5) # 傳正數 api.Block.con_tw('今日跳空跌>-P%', percent=-5) # 傳負數 ``` #### output ```text {'id': 'o18', 'percent': -5} {'id': 'o18', 'percent': -5} ``` 台股共 9 個積木有 negate 參數:`o10`、`o12`、`o14`、`o18`、`o20`、`o23`、 `o28`、`o36`、`mfunc1`。 --- ### Example 6:三種錯誤訊息 參數名打錯: #### input ```python api.Block.con_tw('今日收盤價<>開高低P%', pct=3) ``` #### output ```text ValueError: 積木「今日收盤價<>開高低P%」沒有參數 ['pct'] 可用參數:['operator', 'ohlc_field', 'percent'] ``` 值不合法: #### input ```python api.Block.con_tw('今日收盤價<>開高低P%', percent=4) ``` #### output ```text ValueError: 積木「今日收盤價<>開高低P%」的參數 percent 不支援 4 可用:1 / 2 / 3 / 5 / 7 / 9 ``` 積木名打錯(會提示相近的名稱): #### input ```python api.Block.con_tw('今日收盤價') ``` #### output ```text ValueError: 找不到積木 '今日收盤價'(market=tw),是不是想找:['今日收盤價<>開高低P%', '今日收盤價距今日最低價 <>-P%', '今日收盤價(開低高)與近D日內最高價昨天收盤價P%'] ``` --- ### Example 7:規格固定的參數會自動帶進輸出 Excel 的『python參數』欄會把部分 kwarg 釘死成字面常數(例如 `'value': -0.4`)。 這些值不是選項、使用者無從挑選,但**規格已經指定**,`con()` 會直接帶進輸出: #### input ```python api.Block.get_table_tw()['D日均線斜率<>0.4'] # value 不在選項裡 api.Block.con_tw('D日均線斜率<>0.4') ``` #### output ```text {'id': 'm9', 'period': [5, 10, 20, 60, 120, 240], 'operator': ['<', '>']} {'id': 'm9', 'period': 20, 'operator': '>', 'value': 0.4} ``` 固定值排在可選參數之後。因為是規格釘死的,**不能指定**: #### input ```python api.Block.con_tw('D日均線斜率<>0.4', value=0.4) ``` #### output ```text ValueError: 積木「D日均線斜率<>0.4」的參數 ['value'] 已由規格固定,不可指定 value = 0.4 ``` 台股 28 個、美股 10 個積木有這種固定值。少了它們,condition class 會退回自己 `__init__` 的預設值,而那未必等於規格值——例如「開盤漲幅>P%」的 `operator` 規格是 `'>'`、class 預設卻是 `'<'`,語意相反。 --- --- ### Example 8:輸出可以直接餵回去(冪等) `con()` 的輸出丟回 `con()` 得到同一份結果,所以可以拿既有條件回來改參數: #### input ```python c = api.Block.con_tw('今日收盤價<>開高低P%', percent=3) api.Block.con_tw(dict(c)) == c ``` #### output ```text True ``` 改其中一個參數: ```python c2 = api.Block.con_tw({**c, 'percent': 5}) ``` 規格固定值出現在輸入 dict 裡不會被拒絕(值相同即放行),只有**想改成別的值** 才會擋。 --- > **注意**:`con()` 輸出的預設值會正規化成 `get_table` 的詞彙。Excel 規格與 > condition class 對同一個值常用不同寫法(規格 `'以上'`/class `'up'`、 > 規格 `'周'`/class `'week'`),`con()` 一律吐規格那一側,所以輸出的每個值 > 都找得到對應的合法值。兩者送進 class 後等價,選股結果不變。 > 其他已知落差見 [已知落差與注意事項](block-caveats.md)。 ==================================================================================================== # Block.screener 執行選股 > 所屬章節:積木 Block > 以 2026-08-20 實際執行結果為準(資料日 2026-08-19) ## Overview 把一組積木跑成選股結果。多個積木之間是 **AND**。 ```python api.Block.screener_tw(block_list, pool=None, date='now') api.Block.screener_us(block_list, date='now') ``` | 參數 | 型態 | 說明 | |------|------|------| | `block_list` | `list[dict]` | `con_tw()` / `con_us()` 產生的積木清單,彼此 AND | | `pool` | `list[str]`, optional | 股池,僅台股。預設 `['all']`。見 [股池](block-pool.md) | | `date` | `str` | `'now'`(預設)、`'last'`,或 `'YYYY-MM-DD'` | 回傳 `dict`,四個 key: | key | 型態 | 說明 | |-----|------|------| | `dataframe` | `DataFrame` | 符合條件的股票,一列一檔,含各積木的中間計算值 | | `date` | `Timestamp` | 這批結果對應的資料日期 | | `sig` | `DataFrame` | 完整訊號矩陣,日期(index)× 股票代號(columns),值為 `bool` | | `code` | `str` | 等價的可執行 python 程式碼,見 [產生的程式碼](block-codegen.md) | `api.Block` 沒有開放 `include_values=False`,`dataframe` 一律含中間值。 ## Manual Sample Input/Output ### Example 1:單一積木 #### input ```python b1 = api.Block.con_tw('今日收盤價<>開高低P%', operator='>', ohlc_field='adj_High', percent=3) r = api.Block.screener_tw([b1]) print(list(r)) print(r['date'], r['dataframe'].shape, r['sig'].shape) r['dataframe'].head(3) ``` #### output ```text ['code', 'dataframe', 'date', 'sig'] 2026-08-19 00:00:00 (2343, 8) (1000, 2865) stock_id sig cond1_sig cond1_close cond1_ohlcData cond1_ohlc_processed cond1_olhc_metrics cond1_comparison_ratio 0 00400A True True 14.7200 14.3600 11.0725 10.7500 1.3294 1 00401A True True 13.3800 13.1500 10.8150 10.5000 1.2372 2 00402A True True 9.7200 9.6300 9.1670 8.9000 1.0603 ``` 欄位規則: - `stock_id`:股票代號 - `sig`:最終訊號(全部為 `True`,因為只列出通過的) - `cond_*`:第 N 個積木的中間值。`cond1_sig` 是該積木自己的訊號,其餘欄名由該積木類別決定 `sig` 是完整矩陣(1000 個交易日 × 2865 檔),不只當日。 --- ### Example 2:多積木 AND #### input ```python b1 = api.Block.con_tw('今日收盤價<>開高低P%', operator='>', ohlc_field='adj_High', percent=3) b2 = api.Block.con_tw('今日收盤價(開低高)與近D日內最高價_*` 欄位會累加。 --- ### Example 3:date 參數 #### input ```python for d in ('now', 'last'): r = api.Block.screener_tw([b1], date=d) print(f"date={d!r} -> {r['date']}, {r['dataframe'].shape[0]} 檔") ``` #### output ```text date='now' -> 2026-08-19 00:00:00, 2343 檔 date='last' -> 2026-08-19 00:00:00, 2343 檔 ``` - `'now'`:取 **≤ 今天** 的最後一個可用日期 - `'last'`:取矩陣的最後一列,不管是否已過今天 - 指定日期字串:取 **≤ 該日期** 的最後一個可用日期 盤中執行時 MSMP 只到前一交易日,所以 `'now'` 與 `'last'` 通常相同。 兩者會分歧的情況是季頻/月頻積木——那些資料的 index 可能排到未來 (例如 `api.MSMP.INDEX['Q']` 最後一筆是 2026-11-16),此時 `'last'` 會取到未來日期。 --- ### Example 4:美股 美股不開放 `pool`(`api.USMSMP` 沒有 `list`)。 #### input ```python b = api.Block.con_us('今日收盤價<>開高低P%', operator='>', field1='Open', percent=1) r = api.Block.screener_us([b]) print(r['date'], r['dataframe'].shape, r['sig'].shape) r['dataframe'].head(3) ``` #### output ```text 2026-08-18 00:00:00 (1569, 6) (1000, 13169) stock_id sig cond1_sig cond1_close cond1_rhs cond1_threshold 0 AACG True True 0.9959 0.9605 0.9701 1 AAOZ True True 9.8800 8.4500 8.5345 2 AAPB True True 38.2200 37.6000 37.9760 ``` --- ### Example 5:零命中時 dataframe 是 (0, 0) 沒有任何股票通過時,`dataframe` 是**完全空的**——連欄位都沒有: #### input ```python b = api.Block.con_us('今日收盤價<>開高低P%', operator='>', field1='High', percent=3) r = api.Block.screener_us([b]) print(r['dataframe'].shape, list(r['dataframe'].columns), r['sig'].shape) ``` #### output ```text (0, 0) [] (1000, 13169) ``` (收盤價要高於當日最高價的 1.03 倍,本質上不可能成立。) 所以**不能無條件存取 `r['dataframe']['stock_id']`**,會 `KeyError`。安全寫法: ```python df = r['dataframe'] symbols = df['stock_id'].tolist() if len(df) else [] ``` --- ### Example 6:選不出股票時,先看 sig 的欄數 「選出 0 檔」有兩種完全不同的意思,看 `sig` 的**欄數**就能分辨: | `sig` 形狀 | 意思 | |-----------|------| | `(1000, 2865)` 但 `dataframe` 是 `(0, 0)` | 條件正常,只是當日沒有股票通過 | | `(1000, 0)` | **訊號矩陣裡根本沒有股票**,這個積木壞了 | #### input ```python r = api.Block.screener_tw([b]) print(r['sig'].shape, r['dataframe'].shape) ``` #### output ```text (1000, 2865) (0, 0) # 正常,只是沒人通過 ``` `sig` 欄數為 0 通常是積木內部把兩個**欄位對不起來**的矩陣相除或相比 (例如個股矩陣的 columns 是股票代號,另一邊卻是法人類別), pandas 對齊後交集為空。這是 bug,不是篩選結果。 台股有 20 個積木在 2026-08-19 這天合理地選出 0 檔(孤島晨星、一紅吃三黑、 十字線這類很嚴格的 K 線型態,以及年度股利的緊門檻),它們的 `sig` 欄數都正常。 --- ### Example 7:首次呼叫會下載資料 積木用到的 MSMP 欄位是延遲載入的,第一次碰到某個欄位會即時下載: ```text 正在下載 最高價: 100%|##########| 10.6M/10.6M [00:01<00:00, 5.71MB/s] 下載成功 正在下載 最低價: 100%|##########| 6.63M/6.63M [00:01<00:00, 5.11MB/s] 下載成功 ``` 所以同一組積木第一次跑約 6 秒,第二次約 0.8 秒。要量測效能請跑第二次以後。 ==================================================================================================== # Block 股池 pool > 所屬章節:積木 Block > 以 2026-08-20 實際執行結果為準 ## Overview `screener_tw(block_list, pool=...)` 限定選股範圍。**只有台股有股池。** ```python api.Block.screener_tw(block_list, pool=['all', '~etf']) ``` | 寫法 | 意思 | |------|------| | `['all']` | 全市場(預設,等同 `pool=None`) | | `['tse']` | 只有上市 | | `['otc']` | 只有上櫃 | | `['tse', 'otc']` | 上市 ∪ 上櫃(多個不帶 `~` 的取聯集) | | `['all', '~etf']` | 全市場排除 ETF(`~` 前綴是排除) | | `['all', '~etf', '~KY', '~DR']` | 可疊加多個排除 | 可用的股池名稱來自 `api.MSMP.list`: | 名稱 | 檔數(2026-08-20) | 說明 | |------|------|------| | `all` | 2873 | 全市場 | | `tse` | 1125 | 上市 | | `otc` | 923 | 上櫃 | | `esm` | 412 | 興櫃 | | `etf` | 382 | ETF | | `KY` | 143 | KY 股 | | `DR` | 14 | 存託憑證 | | `delist` | 145 | 已下市 | ## Manual Sample Input/Output ### Example 1:同一積木在不同股池 #### input ```python b1 = api.Block.con_tw('今日收盤價<>開高低P%', operator='>', ohlc_field='adj_High', percent=3) for pool in (None, ['all'], ['tse'], ['all', '~etf']): r = api.Block.screener_tw([b1], pool=pool) print(f"pool={pool!r:22} -> {r['dataframe'].shape[0]} 檔") ``` #### output ```text pool=None -> 2343 檔 pool=['all'] -> 2343 檔 pool=['tse'] -> 955 檔 pool=['all', '~etf'] -> 2102 檔 ``` `pool=None` 與 `['all']` 結果相同,確認預設就是全市場。 --- ### Example 2:查股池成員 #### input ```python {k: len(v) for k, v in api.MSMP.list.items()} ``` #### output ```text {'all': 2873, 'tse': 1125, 'otc': 923, 'esm': 412, 'etf': 382, 'KY': 143, 'DR': 14, 'delist': 145} ``` #### input ```python api.MSMP.list['etf'][:5] ``` #### output ```text ['00400A', '00401A', '00402A', '00403A', '00404A'] ``` --- ### Example 3:美股沒有股池 #### input ```python hasattr(api.USMSMP, 'list') ``` #### output ```text False ``` `screener_us()` 的簽名裡就沒有 `pool` 參數,傳進去會 `TypeError`。 這是刻意的——內部的 `_build_pool()` 對美股一律回 `None`, 開放參數只會讓人誤以為有生效。 --- > **注意**:`api.MSMP.list['all']` 目前含一個重複代號(2873 筆但只有 2872 個不同代號, > `'7834'` 出現兩次)。`screener` 的股池過濾用 `columns.isin(pool)`,不受重複影響; > 但若你自己拿 `api.MSMP.list['all']` 當 DataFrame 的 columns 使用, > 記得先去重(`list(dict.fromkeys(...))`),否則後續 reindex 會拋 > `InvalidIndexError: Reindexing only valid with uniquely valued Index objects`。 ==================================================================================================== # 通用積木(自訂比較) > 所屬章節:積木 Block > 以 2026-09-29 實際執行結果為準(資料日 2026-09-24,季報 2026-08-14)。 > 台股 416 個積木(402 原生 + 3 通用 + 11 以通用積木寫成的具名積木)、美股 260 個 ## Overview 402 顆原生積木每一顆都把**窗格、聚合方式、位移、倍數**寫死在 class 裡, 任一項不合用就無解——參數合法值清單裡沒有你要的數字、要比的是前一根而積木只比當根、 要連續 N 天而積木寫死 3 天。 通用積木把這些全部參數化,三顆涵蓋絕大多數「原生積木表達不了」的條件: | 積木名稱 | id | 式子 | |---|---|---| | `dataA<>dataB+C` | `a1` | 左 `<>` 右 + 常數 | | `(dataA-dataB)/abs(dataB)<>C` | `a2` | (左 − 右) ÷ \|右\| `<>` 常數(變化率) | | `dataA/abs(dataB)<>C` | `a3` | 左 ÷ \|右\| `<>` 常數(比值) | - `a2` / `a3` 的**分母取絕對值**;分母為 0 時視為不成立。 - `a2` / `a3` 的常數是**比值**:`0.2` = 20%、`0.05` = 5%。 - 美股同名,用 `con_us()` / `screener_us()`,但**沒有 `pool` 參數**(美股沒有股池)。 > **不要自己拿 MSMP 算。** 自己算出來的布林矩陣不是積木, > `screener` 的 `r['code']` 產不出來,也無法與其他積木 AND。 > **2026-09-29 異動**:`a2` 由「左 − 右 `<>` 常數」改為變化率——舊式移項後就是 `a1`, > 兩者等價。`a3` 由「分母需為正」改為分母取絕對值。三顆的名稱也改了, > 舊名稱(`通用:兩側比較…`、`通用:兩側相減…`、`通用:兩側相除…`)已不能用, > 用 id(`con_tw(id='a1', ...)`)的寫法不受影響。 --- ## `left` / `right` 能填什麼 格式一律 **`'表.欄'`** 單一字串。常用的: | 要什麼 | 填什麼 | |---|---| | 價量 | `日_K.Open` `.High` `.Low` `.Close` `.Volume` `.漲跌幅` `.成交額_百萬` `.市值_百萬` `.adj_Close` | | **技術指標**(現成的,不用自己算) | `日_技術指標.K` `.D` `.rsi_5` `.rsi_6` `.rsi_10` `.macd_dif` `.macd_dea` `.macd_hist` `.bulin_upper` `.bulin_lower` `.bulin_sma` `.plus_di` `.minus_di` `.ADX` | | 三大法人 | `日_三大法人.外資買賣超張數` `.投信買賣超張數` `.自營買賣超張數` `.三大法人買賣超_張數` `.主力買賣超張數` | | 估值 | `日_指標.本益比` `.股價淨值比` `.市值` `.peg` | | 融資券 | `日_融資券.融資餘額_張` `.融券餘額_張` `.券資比` | | 籌碼集中 | `其他_籌碼集中.籌碼集中度_20日` `.主力買賣超張數_5日` `.家數差_20日` | | 月營收 | `月_營收.YoY` `.MoM` `.金額_千` `.累積YoY` | | 季財報 | `季財報_財務指標.營業毛利率` `.營業利益率` `.稅後淨利率` `.ROE_稅後權益報酬率` `.每股稅後淨利` `.負債比率` `.營收成長率`、`季財報_損益表_千.eps`(單季) | | 股利 | `季股利資訊.年殖利率` `.現金股利` `.填權息天數`(年頻)、`.現金股利_季`(季頻,依盈餘所屬季;年配息記在 Q4) | | 週/月頻 | `週_K.*` `月_K.*` `週_技術指標.*` `月_技術指標.*` | 美股(`con_us`):`日_K.Open/High/Low/Close/Volume`、`季財報_財務指標.*`、 `季營收.YoY`、`季股利資訊.*`。美股**沒有** `漲跌幅`、`adj_*`、`日_技術指標`、`日_三大法人`。 完整清單見 [MSMP 資料表與欄位](msmp-tables.md)(台股 25 張表、美股 10 張)。 --- ## 參數 左右兩側對稱,各有一組。`left` 與 `operator` 必填,其餘都有預設值。 | 參數 | 說明 | 預設 | |---|---|---| | `left` / `right` | 資料來源,**單一字串 `'表.欄'`**,例如 `'日_K.Volume'`、`'日_三大法人.投信買賣超張數'`、`'季財報_財務指標.營業毛利率'` | `left` 必填 | | `operator` | `>`、`<`、`>=`、`<=`、`==`、`crossup`、`crossdown` | **必填** | | `left_rolling` / `right_rolling` | 窗格長度。**1 = 不聚合,直接取原值**(1 日均量即成交量)。資料不足 N 根時用現有的根數算(`min_periods=1`) | `1` | | `left_agg` / `right_agg` | 聚合方式:`mean`、`max`、`min`、`sum`、`std`、`last` | `mean` | | `left_shift` / `right_shift` | 往前位移幾根。**1 = 取前一根的值(不含當根)** | `0` | | `left_pct` / `right_pct` | 該側增減百分比。`35` = ×1.35、`-20` = ×0.8 | `0` | | `const` | 常數。`a1` 加在右側;`a2` / `a3` 是比較門檻,**以比值表示** | `0`(`a3` 為 `1.0`) | | `continue_days` | 窗格 K:連續成立幾根才算數 | `1` | | `continue_times` | 近 K 根中**至少 M 根**成立。不給 = K(全部成立);M > K 時條件恆不成立 | `None` | | `rank` | 取排名前 N 名。`operator='>'` 取大的、`'<'` 取小的 | `None`(不取) | | `pool` | **`rank` 的母體股池**,如 `['tse','otc','~etf']`。`~` 為排除語法 | `['all']` | 單側的完整算式: ```text 該側 = agg( data , rolling ).shift(shift) * (1 + pct/100) ``` ### 從 `get_table_tw()` 取回來填 `get_table_tw()[名稱]` 回傳的是「每個參數的選項清單」,通用積木的自由值參數是 `[]`。 直接拿來填幾格再丟給 `con_tw()` 是可以的——沒填的格子會自動處理: - 值為 `[]` 的參數視為沒指定,用預設值; - `left_agg` / `right_agg` 還是整份清單(`['mean','max',...]`)時,一律當 `'mean'`。 ```python p = api.Block.get_table_tw()['dataA<>dataB+C'] p['left'] = '日_三大法人.投信買賣超張數' p['operator'] = '>' p['const'] = 200 api.Block.con_tw(p) # {'id': 'a1', 'left': '日_三大法人.投信買賣超張數', 'left_rolling': 1, 'left_agg': 'mean', # ..., 'const': 200, 'continue_days': 1, 'continue_times': None, 'rank': None, 'pool': None} ``` --- ## Manual Sample Input/Output ### Example 1:門檻型——`right` 不用寫 `right` 不給時右側視為 0,整條退化成「左 `` const」。 #### input ```python N = 'dataA<>dataB+C' b = api.Block.con_tw(N, left='日_K.Volume', operator='>', const=3000) b ``` #### output ```text {'id': 'a1', 'left': '日_K.Volume', 'left_rolling': 1, 'left_agg': 'mean', 'left_shift': 0, 'left_pct': 0, 'operator': '>', 'right': None, 'right_rolling': 1, 'right_agg': 'mean', 'right_shift': 0, 'right_pct': 0, 'const': 3000, 'continue_days': 1, 'continue_times': None, 'rank': None, 'pool': None} ``` ```python api.Block.screener_tw([b], pool=['tse','otc','~etf','~KY','~DR'])['dataframe'].shape[0] # 222 ``` 更多門檻型: ```python # 近 5 日均量 > 2000 張 con_tw(N, left='日_K.Volume', left_rolling=5, left_agg='mean', operator='>', const=2000) # 370 檔 # 月營收 YoY > 20%(月頻,自動轉日頻) con_tw(N, left='月_營收.YoY', operator='>', const=20) # 793 檔 ``` --- ### Example 2:雙側比較——明寫 `right` 「成交量 > 前一根的 5 日均量 × 1.35」。`right_shift=1` 讓均量**不含當根**。 #### input ```python b = api.Block.con_tw(N, left='日_K.Volume', operator='>', right='日_K.Volume', right_rolling=5, right_agg='mean', right_shift=1, right_pct=35) api.Block.screener_tw([b], pool=['tse','otc','~etf','~KY','~DR'])['dataframe'].shape[0] ``` #### output ```text 263 ``` 同一件事也可以用 `a3` 寫成比值,結果相同(263 檔): ```python con_tw('dataA/abs(dataB)<>C', left='日_K.Volume', right='日_K.Volume', right_rolling=5, right_agg='mean', right_shift=1, operator='>', const=1.35) ``` --- ### Example 3:`continue_days`、`continue_times` 與 `rank` ```python # 前 2~21 天投信買賣超皆為 0 # left_shift=1 把區間推到前一天起算(不含當日) # continue_days=20 要求連續 20 根 -> 正好是「前 2~21 天」 con_tw(N, left='日_三大法人.投信買賣超張數', left_shift=1, operator='==', const=0, continue_days=20) # 近 10 日中至少 7 日投信買超 con_tw(N, left='日_三大法人.投信買賣超張數', operator='>', const=0, continue_days=10, continue_times=7) # 88 檔 # 三大法人買賣超 > 300 張,取最大的前 30 名 con_tw(N, left='日_三大法人.三大法人買賣超_張數', operator='>', const=300, rank=30, pool=['tse','otc','~etf','~KY','~DR']) # 30 檔 # 收盤價最低的前 20 名(operator='<' 時 rank 取小) con_tw(N, left='日_K.Close', operator='<', const=9999, rank=20, pool=['tse','otc','~etf','~KY','~DR']) # 20 檔 ``` `continue_times` 讓「N 期中至少 M 期」這類計數條件也能表達, 例如「前 8 季至少 6 季 EPS > 0」: ```python con_tw(N, left='季財報_損益表_千.eps', operator='>', const=0, continue_days=8, continue_times=6) ``` --- ### Example 4:`a2` 變化率——季財報季增 `a2` 的左右同欄位、右側 `shift=1`,就是「(本季 − 上季) ÷ |上季|」。 #### input ```python b = api.Block.con_tw('(dataA-dataB)/abs(dataB)<>C', left='季財報_財務指標.營業毛利率', right='季財報_財務指標.營業毛利率', right_shift=1, operator='>', const=0) api.Block.screener_tw([b], pool=['tse','otc','~etf','~KY','~DR'])['dataframe'].shape[0] ``` #### output ```text 925 ``` 這等價於原生積木 `f7 毛利率較上一季成長(衰退)`,但**換成任何一個財報欄位都能用**—— `營業利益率`、`稅後淨利率`、`ROE_稅後權益報酬率`、`每股淨值`…… 不必等有人刻對應積木。 要求成長幅度時,常數寫比值: ```python # 單季 EPS 較上季成長 20% 以上 con_tw('(dataA-dataB)/abs(dataB)<>C', left='季財報_損益表_千.eps', right='季財報_損益表_千.eps', right_shift=1, operator='>', const=0.2) # 896 檔 ``` 分母取絕對值,所以上季虧損也能正確判斷方向:上季 −0.37、本季 −0.18, 變化率是 +51%(虧損縮小),不會因為分母為負被算成 −51%。 --- ### Example 5:`a3` 相除——佔比 ```python # 投信買賣超 / 成交量 > 5% con_tw('dataA/abs(dataB)<>C', left='日_三大法人.投信買賣超張數', right='日_K.Volume', operator='>', const=0.05) # 49 檔 ``` 分母取絕對值,分母為 0 的格子一律不成立。 --- ## 33 條實測:通用積木能表達什麼 **下列全部以通用積木組成並實跑通過**(資料日 2026-09-24,季報 2026-08-14, pool 為上市櫃排除 ETF `['tse','otc','~etf']`)。 過去以為只能用原生積木的技術指標類,因為 `日_技術指標` 表早有現成欄位,直接比即可。 | 條件 | 積木與參數 | 檔數 | |---|---|---| | K > 80 | `a1, left='日_技術指標.K', operator='>', const=80` | 145 | | K < 20 | 同上 `operator='<', const=20` | 181 | | RSI6 > 80 | `left='日_技術指標.rsi_6', operator='>', const=80` | 95 | | MACD 柱 > 0 | `left='日_技術指標.macd_hist', operator='>', const=0` | 1228 | | MACD 黃金交叉 | `left='日_技術指標.macd_dif', operator='crossup', right='日_技術指標.macd_dea'` | 66 | | KD 黃金交叉 | `left='日_技術指標.K', operator='crossup', right='日_技術指標.D'` | 105 | | ADX > 25 | `left='日_技術指標.ADX', operator='>', const=25` | 613 | | 穿越布林上軌 | `left='日_K.Close', operator='crossup', right='日_技術指標.bulin_upper'` | 54 | | MACD 紅柱連 3 日遞增 | `a2, left/right='日_技術指標.macd_hist', right_shift=1, const=0, continue_days=3` | 704 | | ROE > 15% | `left='季財報_財務指標.ROE_稅後權益報酬率', operator='>', const=15` | 51 | | 毛利率 > 30% | `left='季財報_財務指標.營業毛利率', operator='>', const=30` | 786 | | 營收 YoY > 20% | `left='月_營收.YoY', operator='>', const=20` | 853 | | 營收連 3 月 YoY > 0 | 同上 `const=0, continue_days=3` | 1057 | | 營收 MoM > 10% | `left='月_營收.MoM', operator='>', const=10` | 412 | | 本益比 < 15 | `left='日_指標.本益比', operator='<', const=15` | 1015 | | 股價淨值比 < 1 | `left='日_指標.股價淨值比', operator='<', const=1` | 371 | | 殖利率 > 5% | `left='季股利資訊.年殖利率', operator='>', const=5` | 2(見注意事項 7) | | EPS 季增 | `a2, left/right='季財報_財務指標.每股稅後淨利', right_shift=1, const=0` | 1231 | | 近四季 EPS > 0 | `left='季財報_損益表_千.eps', left_rolling=4, left_agg='sum', operator='>', const=0` | 1537 | | 前 8 季至少 6 季 EPS > 0 | `left='季財報_損益表_千.eps', operator='>', const=0, continue_days=8, continue_times=6` | 1293 | | 現金股利發放率 > 30% 且近四季 EPS > 0 | `a3, left='季股利資訊.現金股利_季', right='季財報_損益表_千.eps'`,兩側 `rolling=4, agg='sum'`、`const=0.3`,再 AND 上一列 | 1154 | | 營收創 12 月新高 | `left/right='月_營收.金額_千', right_rolling=12, right_agg='max', right_shift=1` | 326 | | 漲幅 > 5% | `left='日_K.漲跌幅', operator='>', const=5` | 56 | | 漲停(>9.9%) | 同上 `const=9.9` | 15 | | 連 3 日上漲 | 同上 `const=0, continue_days=3` | 86 | | 收紅 K | `left='日_K.Close', operator='>', right='日_K.Open'` | 903 | | 創 20 日新高 | `left/right='日_K.Close', right_rolling=20, right_agg='max', right_shift=1` | 166 | | 破 20 日低 | 同上 `right_agg='min', operator='<'` | 121 | | 5 日線 > 20 日線 | `left_rolling=5, left_agg='mean', right_rolling=20, right_agg='mean'` | 996 | | 黃金交叉 5/20 | 同上 `operator='crossup'` | 106 | | 振幅 > 3% | `a3, left='日_K.High', right='日_K.Low', const=1.03` | 504 | | 成交額前 100 大 | `left='日_K.成交額_百萬', const=0, rank=100, pool=[...]` | 100 | ### 什麼時候才回頭找原生積木 MSMP 沒有現成欄位、而且 rolling / shift / continue 組不出來的語意: 「連續 N 年配息」「葛林布雷排名」「分點籌碼」「產業分類」, 以及需要「年度對年度」對齊的比值。 「近四季累計」(`rolling=4, agg='sum'`)、「最近 N 期至少有 M 期…」(`continue_times`)、 「填權息天數」(`季股利資訊.填權息天數`,年頻)現在都能用通用積木寫。 --- ## 這三顆解掉的實際問題 | 需求 | 原生積木卡在哪 | 通用積木怎麼寫 | |---|---|---| | 成交量 > 前一根 5 日均量 ×1.35 | `v5x` 有倍數但無 shift(5ma **含當根**)、`v11` 有 shift 但倍數固定 1.0、`v12` 兩者都有但 agg 固定 `max` | `right_rolling=5, right_agg='mean', right_shift=1, right_pct=35` | | 前 2~21 天投信買賣超皆為 0,且當日 >50 | `s6x` 的 `rolling(D).sum()==D` **含當日**,與「當日 >50」互斥,AND 必為 0 檔;`days` 合法值也沒有 21 | `left_shift=1, operator='==', const=0, continue_days=20` | | 三大法人買賣超 >300 張取前 30 | 排行榜積木無法表達「先篩門檻再排序取 N」;`s1` 的 `n` 合法值也沒有 300 | `operator='>', const=300, rank=30, pool=[...]` | | 近 5 日均量 > 2000 張 | `v37` 的 `threshold` 最低 20000 | `left_rolling=5, left_agg='mean', const=2000` | | 任一財報欄位的季增 | 只有毛利率/營益率/稅後淨利率有 `f7`/`f11`/`f15`,其餘欄位沒有 | `a2` 左右同欄位、`right_shift=1`、`const=0` | | 近 N 日中至少 M 日投信買超 | `s13` 只有「超過 N 日」且選項固定 | `continue_days=N, continue_times=M` | --- ## 以通用積木寫成的具名積木 Excel 規格上有一批積木是用 `a1` / `a3` 寫成的:python參數把資料來源、agg、shift 等釘死, 只開放少數參數。用法與原生積木相同,`con_tw(名稱, ...)` 會自動補上釘死的值。 | 積木名稱 | id | 開放的參數 | |---|---|---| | 投信買賣超(張數)連續P日<>N張 | a1 | `continue_days`、`operator`、`const` | | 近N個交易日投信買賣超(千股)<>V | a1 | `left_rolling`、`operator`、`const` | | 近N個交易日三大法人買賣超合計(千股)>0 | a1 | `left_rolling` | | 連續N年(不含今年)填權息天數皆上一季 | a1 | (無) | | 稅後純益率(%)>上一季 | a1 | (無) | | 券資比<>N%的Top20清單 | a1 | `operator`、`const` | | 前N季EPS至少有M季<>V元 | a1 | `continue_days`、`continue_times`、`operator`、`const` | | 近N個交易日投信買超天數>=M天 | a1 | `continue_days`、`continue_times` | | 現金股利發放率>N% | a3 | `const`(比值,0.05 = 5%) | | 近四季EPS>0 | a1 | (無) | ```python api.Block.con_tw('前N季EPS至少有M季<>V元', continue_days=8, continue_times=6, operator='>', const=0) # {'id': 'a1', 'continue_days': 8, 'continue_times': 6, 'operator': '>', 'const': 0, # 'left': '季財報_損益表_千.eps'} ``` `現金股利發放率>N%` 的分母取絕對值,近四季 EPS 為負、仍有配息的公司也會通過 (實測發放率 > 5% 的 1611 檔中有 91 檔)。要排除就 AND 上 `近四季EPS>0`。 --- ## 七個會咬人的地方 ### 1. `rank` 的 `pool` 要和 `screener_tw(pool=...)` 填一樣 `rank` 是**橫斷面**運算,母體不同結果就不同。與 `ranking.py` 一致, 通用積木在排名**之前**先套 `pool`。 只在 `screener_tw` 給 pool、而 `con_tw` 沒給時,會先在全市場排完前 30, 再被 screener 切掉不在池內的,最後拿到的**不足 30 檔**: ```text con_tw 不給 pool(預設全市場)-> 30 檔,落在 tse+otc-etf/KY/DR 內只剩 13 檔 con_tw 給 pool=['tse','otc','~etf','~KY','~DR'] -> 完整 30 檔 ``` ### 2. 「排除 X < N」要寫成 `> N` 積木是「**留下**符合的」,不是「排除符合的」。 共同定義寫「排除近 5 日均量 < 2000 張」,積木要寫 `operator='>', const=2000`。 寫成 `<` 會變成只留下低量股(實測 1487 檔 vs 正確的 370 檔)。 ### 3. 「為 0」是 `==`,不是 `<` `<` 是賣超、`>` 是買超、`==` 才是沒有買賣。 「連續 20 天投信買賣超為 0」寫成 `operator='<', const=0, continue_days=20` 會變成「連續 20 天都賣超」——現實中幾乎不存在,實測 **0 檔**, 而正確寫法有 1345 檔。 ### 4. 月/季/年頻資料自動轉日頻 `季財報_財務指標.*`、`月_營收.*`、`季股利資訊.*` 的 index 是字串 (`'2026-Q2'`、`'2026-M08'`),不轉的話 screener 會拋: ```text TypeError: '<=' not supported between instances of 'str' and 'Timestamp' ``` 通用積木內部已用 `index_str_to_date().ffill()` 轉成**公告日** (月頻→次月 10 日、季頻→財報公告日)並自動遮蔽下市後的資料, **sig 與所有中間值都會轉**,直接餵給 screener 不會炸,也不需要自己處理頻率。 最新一季沒有資料的股票(未公告、下市)不會沿用舊值,條件不成立。 ### 5. `a2` / `a3` 的常數是比值,不是百分比 「成長 20%」寫 `const=0.2`,不是 `20`。`a1` 的 `const` 則是原始單位 (張、元、%——看欄位本身)。 ### 6. 左右兩側頻率不同時,對齊的是「各自最新公告值」 ProboDataFrame 會把兩側都轉成公告日再對齊,所以跨頻率算得出數字, 但不保證是同一期間。例如 `季股利資訊.現金股利`(年頻)÷ 季財報 EPS, 2330 在 2026-05-15 會算出 22.00 ÷ 22.08 = 99.6%——2025 全年股利除以 2026Q1 累計 EPS, 數字看起來合理但是錯的。兩側盡量用同頻率的欄位(例如 `現金股利_季` 配 `eps`)。 ### 7. `季股利資訊.年殖利率` 的今年列目前多為 0 2026-Y 這一列已經出現,但大多數股票的值是 0 或不完整(2412、2884、1101 為 0.0, 2330 為 0.29)。它的公告日一到就蓋過 2025 年的值,所以「殖利率 > 5%」 現在只剩 2 檔(全市場看 2025-Y 那一列,> 5% 的有 390 檔)。這是資料源的狀態,不是積木的問題; 要用去年殖利率就加 `left_shift=1`。 --- ## 完整範例:三個策略 ```python N = 'dataA<>dataB+C' B = api.Block POOL = ['tse', 'otc', '~etf', '~KY', '~DR'] # ── 量能強 ──────────────────────────────────────────────── # 昨日成交量 > 3000 張,且最新一根量 > 第二根 5 日均量 ×1.35 b1 = B.con_tw(N, left='日_K.Volume', left_shift=1, operator='>', const=3000) b2 = B.con_tw(N, left='日_K.Volume', operator='>', right='日_K.Volume', right_rolling=5, right_agg='mean', right_shift=1, right_pct=35) B.screener_tw([b1, b2], pool=['tse','otc','~etf']) # 32 檔 # ── 外資關注 ────────────────────────────────────────────── # 近5日均量 >2000 張,前 2~21 天投信買賣超皆為 0,當日投信買超 >50 張 c1 = B.con_tw(N, left='日_K.Volume', left_rolling=5, left_agg='mean', operator='>', const=2000) c2 = B.con_tw(N, left='日_三大法人.投信買賣超張數', left_shift=1, operator='==', const=0, continue_days=20) c3 = B.con_tw(N, left='日_三大法人.投信買賣超張數', operator='>', const=50) B.screener_tw([c1, c2, c3], pool=POOL) # 當日 0 檔,全期 460 次 / 262 個交易日 # ── 三大法人買超 Top30 ──────────────────────────────────── d1 = B.con_tw(N, left='日_三大法人.三大法人買賣超_張數', operator='>', const=300, rank=30, pool=POOL) B.screener_tw([d1], pool=POOL) # 30 檔 ``` > 「外資關注」當日 0 檔是**真的沒有符合的股票**(②有 1361 檔、③有 60 檔, > 交集為空),不是積木壞了——`sig` 形狀 `(1000, 1877)` 欄數正常。 > 全期回看有 460 次訊號,最近一次是 2026-09-08 的大銀微系統(4576)。 > 判讀方式見 [已知落差與注意事項](block-caveats.md)。 --- ## 餵進回測 通用積木產生的 `sig` 與原生積木**格式完全相同**(日期 × 股票代號的 bool 矩陣), 回測配方原樣適用: ```python r = B.screener_tw([c1, c2, c3], pool=POOL) df['sig'] = df['DateTime'].map(r['sig'][SYM]).fillna(False) core.feed_data(df, ['DateTime','開盤價','最高價','最低價','收盤價','成交量'], columns=['sig']) # 額外欄位一定要宣告 ``` 完整骨架見 [回測總覽](backtest.md) 與 [配方集](recipes.md) 的配方二。 > **選股結果不要直接當回測標的**——用今天選出的股票回測過去是 look-ahead。 > 要嘛用固定清單,要嘛用 `sig` 逐日決定進出場。 --- ## 相關文件 - [積木 Block 總覽](block.md) - [組積木 con](block-con.md) - [執行選股 screener](block-screener.md) - [股池 pool](block-pool.md) - [已知落差與注意事項](block-caveats.md) - [MSMP 資料表與欄位完整清單](msmp-tables.md):`left` / `right` 能填哪些 `表.欄` - [台股積木完整參考](block-reference-tw.md) - [美股積木完整參考](block-reference-us.md) ==================================================================================================== # Block 產生的程式碼 code > 所屬章節:積木 Block > 以 2026-09-21 實際執行結果為準(資料日 2026-09-18) ## Overview `screener_tw()` / `screener_us()` 回傳的 `code` 是**這組積木的等價 python 程式碼**。 用途有三個: 1. 看懂積木實際算了什麼(積木名稱是中文描述,程式碼是真正的運算) 2. 貼進回測腳本或自己的流程,不必依賴 `api.Block` 3. 當作範本改寫成自訂條件 程式碼**自給自足**:作用域裡只要有已登入的 `api`,貼進 cell 就能直接跑, 不需要任何 `import`。它自己會做三件事: - 開頭 `msmp = api.MSMP`(美股是 `usmsmp = api.USMSMP`)取得資料源 - 用到的 helper(`_continue`、`index_str_to_date`、`_rank`…)**直接寫成函式定義**, 和 `_operators` 一樣,不從 SnowyOwl 內部匯入 - 只寫出這組積木真正用到的部分,沒用到的 helper 不會出現 執行完會留下一個 `sig` 變數,即訊號矩陣。 ## Manual Sample Input/Output ### Example 1:取出並閱讀 #### input ```python b = api.Block.con_tw('日K<>日D', operator='>') r = api.Block.screener_tw([b]) print(b) print(r['dataframe'].shape, r['date']) print(r['code']) ``` #### output ```text {'id': 't2', 'operator': '>'} (2004, 5) 2026-09-18 00:00:00 msmp = api.MSMP # Stock pool pool = msmp.list['all'] _operators = { 'crossup': lambda x, y: (x > y) & (x.shift(1) < (y if isinstance(y, (int, float)) else y.shift(1))), 'crossdown': lambda x, y: (x < y) & (x.shift(1) > (y if isinstance(y, (int, float)) else y.shift(1))), '>': lambda x, y: x > y, '<': lambda x, y: x < y, '>=': lambda x, y: x >= y, '<=': lambda x, y: x <= y, '==': lambda x, y: x == y, } K = msmp.日_技術指標.K D = msmp.日_技術指標.D op_func = _operators['>'] sig1 = op_func(K, D) # sig1 variable is ready # Combine conditions sig1 = sig1.loc[:, sig1.columns.isin(pool)] sig = sig1 ``` 程式碼結構固定為這幾段(沒用到的段落會省略): | 段落 | 內容 | |------|------| | `msmp = api.MSMP` | 資料源。美股是 `usmsmp = api.USMSMP` | | `# Helper functions` | 這組積木用到的 helper 函式定義,見 Example 5 | | `# Stock pool` | 由 `pool` 參數展開成 `msmp.list[...]` 的運算 | | `_operators` | 比較運算子的 lambda 表(`crossup` / `crossdown` 是穿越,不是單純比大小) | | 各積木的運算 | 一個積木一段,變數名為 `sig1`、`sig2`… | | `# Combine conditions` | 套用股池過濾,並把各 `sigN` 以 `&` 合併成 `sig` | --- ### Example 2:實際執行,驗證與 screener 結果一致 命名空間只要給 `api`,其餘由程式碼自己建立: #### input ```python ns = {'api': api} exec(r['code'], ns) sig = ns['sig'] print('sig shape =', sig.shape) print('最後一列 True 檔數 =', int(sig.iloc[-1].sum())) print('screener 回報檔數 =', r['dataframe'].shape[0]) ``` #### output ```text sig shape = (1000, 2874) 最後一列 True 檔數 = 2004 screener 回報檔數 = 2004 ``` 兩者相同,`code` 與 `screener` 是同一套運算。 執行後可用的名稱: ```text ['api', 'msmp', 'pool', '_operators', 'K', 'D', 'op_func', 'sig1', 'sig'] ``` --- ### Example 3:美股用 usmsmp 美股積木產生的程式碼開頭是 `usmsmp = api.USMSMP`,一樣只要給 `api`: ```python b = api.Block.con_us('今日收盤價<>開高低P%', operator='>', field1='Open', percent=1) r = api.Block.screener_us([b]) ns = {'api': api} exec(r['code'], ns) sig = ns['sig'] ``` 美股沒有股池,所以產生的程式碼不含 `# Stock pool` 段落。 --- ### Example 4:多積木時的合併段落 兩個積木時,`# Combine conditions` 會變成: ```python # Combine conditions sig = sig1 & sig2 sig = sig.loc[:, sig.columns.isin(pool)] ``` `&` 是 pandas 的元素級 AND,兩個矩陣的 index/columns 會自動對齊。 不同頻率(日/月/季)的積木由 screener 內部先用 union + forward fill 對齊, 產生的程式碼中已反映對齊後的結果。 --- ### Example 5:helper 函式會寫進程式碼 通用積木(`a1`/`a2`/`a3`)與部分原生積木會呼叫 helper。這些函式**直接以原始碼 形式寫進輸出**,不是 import 進來的,所以貼到任何地方都能跑: #### input ```python b1 = api.Block.con_tw(id='a1', left='日_K.Volume', operator='>', const=3000) b2 = api.Block.con_tw(id='a1', left='日_三大法人.三大法人買賣超_張數', operator='>', const=300, rank=30) r = api.Block.screener_tw([b1, b2], pool=['tse', 'otc', '~etf']) print(r['code']) ``` #### output(節錄開頭) ```python msmp = api.MSMP # Helper functions def _continue(sig, days): """連續 days 根都成立。days<=1 時原樣回傳。""" if days is None or days <= 1: return sig return sig.rolling(days).sum() == days def index_str_to_date(df): """月/季/年頻的字串 index 轉成日頻公告日;日頻與常數原樣回傳。""" if not hasattr(df, 'index_str_to_date'): return df return df.index_str_to_date().ffill() def _build_market_pool(pool): ... def _rank(sig, value, n, operator, pool): ... # Stock pool ls_tse = msmp.list['tse'] ... ``` | helper | 何時出現 | |--------|----------| | `_continue` | 積木有 `continue_days` 參數時 | | `index_str_to_date` | 讀月/季/年頻資料時(把字串 index 轉成公告日) | | `_rank` | 積木有 `rank` 參數時 | | `_build_market_pool` | `_rank` 的相依,會自動一起帶出來 | 沒用到的不會出現——第一個例子(`日K<>日D`)就完全沒有 `# Helper functions` 段落。 --- ### Example 6:全部 665 個積木都驗證過 台股 405 + 美股 260,每個積木都實際跑過一次 screener 並檢查產生的程式碼: ```text con() 建構 665 / 665 成功 screener 實際選股 665 / 665 成功 產生的 code 可編譯 665 / 665 通過 自由名稱檢查 0 個未定義(除了 api) ``` 所以 `code` 可以直接信任——貼進 cell 執行的結果,與 `screener` 回報的一致。 ==================================================================================================== # Block 已知落差與注意事項 > 所屬章節:積木 Block > 以 2026-09-21 全量實跑結果為準(台股 405 / 美股 260,合計 665 個啟用積木) > > 部分章節保留 2026-08-20 當時的實測記錄(當時台股 403 / 美股 257), > 需要現況請以 `len(api.Block.get_table_tw())` 為準。 > 標示「已修」的章節說明的是**舊行為**,現況見該節內文。 ## Overview 積木的參數規格來自 Excel(`block_spec.json`),條件邏輯來自 python 類別 (condition registry)。兩邊是各自維護的,因此存在幾處落差。 這頁列出實測確認的項目,讓呼叫端知道該防什麼。 **全量驗證基準(2026-09-21)**:台股 405 + 美股 260 個積木,每一個都實際跑過 `screener_tw` / `screener_us`,並檢查產生的 `code` 能否編譯: ```text con() 建構 665 / 665 成功 screener 實際選股 665 / 665 成功 產生的 code 可編譯 665 / 665 通過 失敗 0 選出檔數中位數:437 檔 ``` 選出 0 檔的有 12 個,查證後都正常:孤島晨星、內困三日翻紅、連續跌停這類罕見 型態當天沒出現;以及通用積木 `a3` 不給 `right` 時分母為 0,被除零防護擋掉 (相除積木不給分母本來就沒有意義)。 所以下面列的落差**都不會讓積木執行失敗**,它們影響的是「參數能不能調」 與「結果是否符合名稱」。 --- ## 1. 預設值會正規化成 get_table 的詞彙(已修) > **這一節的問題已在 2026-09-21 修掉**,保留說明是因為舊筆記和舊程式碼可能還 > 依賴當時的行為。 以前 `con()` 對**你指定的**參數驗證合法值,但**預設值不驗**,所以 「`con(name)` 的輸出再傳回 `con()` 會被拒絕」——台股 59 個、美股 18 個積木中招。 成因是 Excel 規格與 condition class 對同一個值用不同寫法: | 積木 | class 預設 | 規格合法值 | |------|-----------|-----------| | `r19` 市值排名前N名以上(下)公司 | `direction='up'` | `以上` / `以下` | | `dfunc4` 持股N張以上大戶,周月增減<>P% | `period_type='week'` | `周` / `月` | | `dfunc12` 散戶(大戶)持股… | `up_down='up'` | `<` / `>` | | `o29` 連續D日(周、月) K棒為紅K | `table='日_K'` | `日` / `週` / `月` | | `i14` 近D日個股Beta<>N倍 | `multiple=1.0` | `0.5` / `0.8` / `1` / … | 兩者送進 class 後**等價**(`'以上'` 與 `'up'` 都得到 `'up'`),所以選股結果從來 沒錯,錯的是輸出的寫法與表上對不上。 現在 `con()` 會把預設值正規化成規格那一側: ```python api.Block.con_us(id='r19') # 之前: {'id': 'r19', 'top_n': 50, 'direction': 'up'} # 現在: {'id': 'r19', 'top_n': 50, 'direction': '以上'} ``` 台股 26 個、美股 4 個參數受影響,**全部歸零**。實測 665 個積木 resolve 後的行為, 只有 3 個從 `1.0` 變成 `1`(數值相同),其餘完全未變。 連帶 `con()` 變成**冪等**——輸出丟回去得到同一份結果,所以可以拿既有條件改參數: ```python c = api.Block.con_tw('今日收盤價<>開高低P%', percent=3) api.Block.con_tw(dict(c)) == c # True c2 = api.Block.con_tw({**c, 'percent': 5}) ``` **現況往返測試**: | 市場 | 積木數 | 往返成功 | 仍失敗 | |------|--------|---------|--------| | 台股 | 405 | 394 | 8(全部是第 4 節的重複編碼) | | 美股 | 260 | 252 | 5(同上) | (各扣掉 3 個 `operator` 必填的通用積木,它們不給參數本來就建不出來。) 剩下的失敗**只剩重複編碼**一種原因:那些積木不能用 id 指定,要用名稱。 --- ## 2. list_conditions 比 get_table 多,多的那些建不出來 #### input ```python len(list_conditions(market='tw')), len(api.Block.get_table_tw()) ``` #### output ```text (406, 403) ``` 美股是 `(301, 260)`。`list_conditions` 讀 registry(程式碼裡註冊的全部類別), `get_table` 讀 `block_spec.json`(只收 Excel 中「狀態=啟用」的積木)。 多出來的分兩種,成因不同: | 情況 | 台股 | 美股 | 說明 | |------|------|------|------| | Excel 有列但標「停用」 | 4:`m15`、`r22`、`r23`、`r24` | 42:`o53`~`o94` 等 | **刻意停用**。例如 `m15`(今日收盤價<>D日均線)已被啟用中的「今日收盤價<>D日(周月)均線」取代 | | Excel **完全沒有這個編碼** | 3:`o2x`、`s9x`、`s9y` | 0 | 程式碼已完整實作(分別 222 / 217 / 245 行、有 docstring 與完整參數),但 Excel 未登錄,看起來是**漏登** | #### input ```python api.Block.con_tw('m15') ``` #### output ```text ValueError: 找不到積木 'm15'(market=tw) ``` **建議**:要列出「可用」的積木,用 `get_table_tw()` 的 key,不要用 `list_conditions()`。 --- ## 3. category 有兩套詞彙,互不通用 | 來源 | 值 | 用在哪 | |------|-----|--------| | `ConditionMetadata.category` | 英文模組名,台股 11 種(`ohlc`、`volume`、`financial`…) | `list_conditions(category=...)` 的過濾 | | `block_spec.json` 的 `category` | 中文次類別,台股 37 種(`漲跌幅`、`K棒型態`、`MACD指標`…) | [積木完整參考](block-reference-tw.md) 的分組 | #### input ```python list_conditions(category='漲跌幅', market='tw') # 中文 -> 空的 ``` #### output ```text {} ``` #### input ```python len(list_conditions(category='volume', market='tw')) # 英文 -> 有結果 ``` #### output ```text 19 ``` 美股的 `block_spec.json` 次類別**全為空字串**,所以美股完整參考頁只有一個「(未分類)」群組。 --- ## 4. 多個積木名稱共用同一個 python編碼 台股 4 組、美股 2 組的積木名稱共用同一個 `python編碼`(`con()` 輸出的 `id`)。 **共用本身不是問題**,判斷標準是:兩個名稱是否**宣稱不同的邏輯**卻跑出同一件事。 | 市場 | id | 兩個名稱 | 判定 | |------|-----|----------|------| | 台股 | `m9` | `D日均線斜率<>0.4` / `<>-0.4` | 曾是錯誤,**已修** | | 美股 | `m9` | `D日均線斜率<>0.4` / `<>-0.4` | 曾是錯誤,**已修** | | 台股 | `s1` | `近N日期間外資/投信/自營/官股/三大買賣超 <> V張` / `官股買(賣)超>N張` | 正常,參數集不同 | | 台股 | `r4` | `近D日,官股買(賣)超張數前N名` / `法人買賣超排行前N名` | 正常,參數集不同 | | 台股 | `m21` | `長期四均線糾結(5MA/10MA/20MA)` / 同名 `(old)` | **不是錯誤**,同一積木的舊別名 | | 美股 | `r23` | `成交值排行前N名` / `成交金額排行前N名` | **不是錯誤**,同一積木的別名 | ### m9:曾經是真錯誤(已修) 兩個名稱宣稱的門檻不同(`0.4` / `-0.4`),但 `con()` 產生的 dict 一模一樣, 等於其中一個名稱在說謊。兩個市場的成因不同: - **台股**:兩列的『python參數』都寫 `'value': -0.4`(複製貼上漏改), 但『邏輯基礎』欄正確帶著各自的符號。`build_spec.py` 在**映射毫無歧義時** (`python參數` 恰好一個數值固定值、模板恰好一個數字字面值)以模板為準校正。 全部 660 個積木裡只有這一列被校正,校正會在 `python build_spec.py` 的輸出中列出。 - **美股**:兩列的『python參數』**完全沒有** `value` kwarg,所以都用 class 預設的 `0.4`, `-0.4` 那個名稱取用不到。已在 `美股積木API.xlsx` 的「均線積木」分頁補上。 修好後: ```python api.Block.con_tw('D日均線斜率<>0.4') # value=0.4 -> 2 檔 api.Block.con_tw('D日均線斜率<>-0.4') # value=-0.4 -> 2697 檔 api.Block.con_us('D日均線斜率<>0.4') # value=0.4 -> 56 檔 api.Block.con_us('D日均線斜率<>-0.4') # value=-0.4 -> 12531 檔 ``` ### m21 與 r23:別名,不是錯誤 這兩組的兩個名稱描述的是**同一件事**,跑出同一個結果也就是正確的, 沒有任何名稱在說謊: - `m21` 的 `(old)` 後綴本身就標示它是舊別名,兩列所有機器可讀欄位完全相同。 - `r23` 的「成交值」與「成交金額」在中文財經語境同義,class 相同。 唯一差別是 `top_n` 的選項清單: ```text 成交值排行前N名 top_n: [50, 100, 150, 200, 500, 1000] 成交金額排行前N名 top_n: [5, 10, 100, 150, 200, 500, 1000] ← 多了 5、10 ``` 傳同一個 `top_n` 給兩者,`con()` 的 dict 與選出的股票**完全相同**(實測 `top_n=100` 與 `200` 皆是)。所以只在**不指定 `top_n`**(預設都是 50)時才看起來撞在一起, 明確指定就沒有歧義——這也是第 1 節「不要依賴預設值」的用意。 > `成交金額排行前N名` 的『python參數』把 `id` 寫死成 `'r23'` 而非 `'${ID}'`, > 且『功能說明』欄留著別的積木的文字(`股本:小於N億…`)。兩者都不影響行為 > (`build_spec.py` 忽略 `id` 欄、不讀『功能說明』),但看 Excel 時會誤導。 --- ## 5. 零命中時 dataframe 是 (0, 0),沒有欄位 見 [執行選股 Example 5](block-screener.md)。安全寫法: ```python df = r['dataframe'] symbols = df['stock_id'].tolist() if len(df) else [] ``` --- ## 6. api.MSMP.list['all'] 含重複代號 2873 筆但只有 2872 個不同代號(`'7834'` 出現兩次)。 `screener` 的股池過濾不受影響,但自己拿去當 DataFrame 的 columns 會踩到 `InvalidIndexError`。見 [股池](block-pool.md) 末段。 --- ## 7. ConditionMetadata.path 格式不統一 同一批 metadata 裡出現四種格式: ```text '/blocks.api.ppi.volume/v1' '/blocks.api.api.volume/v2' '/blocks-api/api/volume/v3x' '/blocks-api/api/us/ohlc/o1' ``` 這個欄位目前沒有被程式使用,**不要拿它做解析或路由**。 --- ## 8. 有 6 個標記「啟用」的積木被靜默丟棄 `build_spec.py` 第 86 行 `df.dropna(subset=['python編碼', '積木名稱'])` 會砍掉沒填 `python編碼` 的列,**且不發任何警告**。 Excel 中有 6 列狀態是「啟用」卻沒填 `python編碼`,因此完全不會出現在 `get_table` / `con` 裡: | 市場 | 分頁 | 積木名稱 | |------|------|----------| | 台股 | 漲跌幅積木 | `未知` | | 台股 | 漲跌幅積木 | `停利,較成本價獲利>P%` | | 台股 | 漲跌幅積木 | `停利,較成本價獲利>M千元` | | 台股 | 漲跌幅積木 | `停損,較成本價虧損>P%` | | 台股 | 產業概念&市值 | `已公布股利政策的股票` | | 美股 | 財報積木 | `最近一季合約負債佔股本年增率<>P%` | 所以「Excel 標啟用的數量」與「實際可用的積木數」不相等: ```text 台股 Excel 啟用 408 列 -> 扣掉缺 python編碼 5 列 -> block_spec.json 403 個 美股 Excel 啟用 261 列 -> 扣掉缺 python編碼 1 列 -> block_spec.json 260 個 ``` 要判斷某個積木到底能不能用,**只看 `get_table_tw()` 的 key**, 不要以 Excel 的狀態欄為準。 --- ## 9. 有 8 個積木的固定值仍未收錄(複合值) 規格釘死的字面常數(例如 `'value': -0.4`)現在會由 `con()` 帶進輸出,見 [組積木 Example 7](block-con.md)。但『python參數』裡「佔位符 + 字面後綴」的 **複合值**仍未支援,因為需要模板代入: | id | 積木 | python參數裡的複合值 | |----|------|----------------------| | `o29` | 連續D日(周、月) K棒為紅K | `'table': '${A}_K'` | | `o30` | 連續D日(周、月) K棒為黑K | `'table': '${A}_K'` | | `v5` | 今日(周)成交量>上一日(周)成交量P倍 | `'table': '${A}_K'` | | `v7` | 日周月成交量創近D日新高(低) | `'table': '${A}_K'` | | `v8` | 日(周)成交量漸增(減)連續3次 | `'table': '${A}_K'` | | `m5` | 今日收盤價突(跌)破D日均線 | `'table': '${T}_K'` | | `m7` | 今日收盤價(乖離率)<>D日均線P% | `'table': '${T}_K'` | | `r4` | 近D日,官股買(賣)超張數前N名 | `'direction': '${A}超'` | 這 8 個積木的該參數不會出現在 `con()` 輸出,condition class 會用自己的預設值, 所以**「周」「月」的變體目前選不到**(例如 `o29` 只會跑日 K)。 `python build_spec.py` 會把這 8 個逐筆列出。 --- ## 10. v24 的「大盤總成交金額」是全市場個股加總 `今日(周月)成交金額佔今日(周月)大盤總成交金額>P%`(`v24`)的分母, 是**同一張個股矩陣橫向加總**得到的全市場成交金額,不是某個現成欄位—— MSMP 裡沒有大盤總成交金額這個欄位(`api.MSMP.TSE` 只有 OHLC 與技術指標)。 ```python market_value = stock_value.sum(axis=1) # 全市場當日成交額 ratio = stock_value.div(market_value, axis=0) * 100 ``` 所以分母包含 TSE + OTC + 興櫃 + ETF(也就是 `日_K` 覆蓋的全部標的), 各檔占比加總為 100%。實測 2026-08-19: | threshold | 檔數 | 占比範圍 | |-----------|------|----------| | `>1%` | 25 | 1.01% ~ 5.13% | | `>3%` | 2 | 3.11% ~ 5.13% | | `>5%` | 1(2330) | 5.13% | | `>10%` | 0 | — | `>1%` 那 25 檔占比合計 43.9%。換 `stock_table` 成 `週_K` / `月_K` 也適用, 分母會自動變成該頻率的全市場加總。 --- ## 11. 美股沒有股池 `api.USMSMP` 沒有 `list`,`screener_us()` 也沒有 `pool` 參數。見 [股池](block-pool.md)。 --- ## 12. 積木名稱可能與實際邏輯不符 —— 以 `o6` 為例 `漲跌幅介於P1%到P2%之間`(`o6`)的名稱沒提任何期間,參數也只有 `percent1` / `percent2`, 讀起來像「當日漲跌幅」。實際產生的程式碼是: ```python close = msmp.日_K.adj_Close close_shifted = close.shift(20) # ← 20 天,硬寫死 change_pct = ((close / close_shifted) - 1) * 100 lower_bound = change_pct > percent2 upper_bound = change_pct < percent1 ``` 也就是**近 20 日**漲跌幅,而且 `20` **沒有做成參數**、改不了。 實測差距(資料日 2026-08-20,`pool=['all','~etf']`): | 問法 | 檔數 | |---|---| | `con_tw('漲跌幅介於P1%到P2%之間', percent1=9, percent2=5)` | **183** | | 直接算 `日_K.漲跌幅` 當日落在 5~9% | **49** | 另外兩點: - **`percent1` 是上界、`percent2` 是下界**(要求 `percent1 > percent2`)。 按名稱直覺寫 `percent1=5, percent2=9` 會拋 `ValueError: percent1 (5) must be greater than percent2 (9)`。 - 台股**沒有**「當日漲幅 > P%」的純積木。最接近的 `o27` 是 `當日為長紅K,且漲幅>P%`,多綁了一個長紅K條件。 要純粹的當日漲跌幅請直接用 `api.MSMP.日_K.漲跌幅`。 ### 通則 **積木名稱不是規格。** 遇到「檔數與預期差很多」時,第一件事是印出 `screener_tw(...)['code']` 看它實際算什麼——那份程式碼是唯一可信的語意來源, `get_table_*()` 只告訴你參數的合法值,不告訴你邏輯。 --- ## 13. 參數合法值清單外的需求,改用通用積木 上面幾節講的都是「積木的規格與名稱對不上」,但更常見的情況是 **規格本身就沒有你要的值**——`threshold` 最低 20000、`days` 沒有 21、 `n` 沒有 300、5ma 固定含當根、倍數固定 1.0。 這些不是 bug,是每顆積木把窗格/聚合/位移/倍數寫死在 class 裡的必然結果。 遇到時不要硬套名稱相近的積木(那會選出語意不同的股票), 改用[通用積木](block-auto.md) `a1`/`a2`/`a3`,這些全部是參數。 實測 29 條常見條件(KD/MACD/RSI/布林/ADX/K棒型態/財報/營收/排行) 全部組得出來——技術指標類因為 `日_技術指標` 表早有現成欄位,直接比即可。 ==================================================================================================== # 台股積木完整參考 > 所屬章節:積木 Block(台股) > 以 SnowyOwl 實際載入的 `block_spec.json` 與 condition registry 產生,共 405 個積木 ## Overview 台股共 405 個積木,依 Excel 規格的次類別分組。分類名稱與 `list_conditions(category=..., market='tw')` 接受的值**不同**——後者吃的是英文模組名,詳見 [積木清單查詢](block-list-conditions.md)。 積木名稱就是 `con` 的第一個參數。`合法值` 欄是 `get_table` 回報的可選值;`預設值` 是不指定該參數時 `con` 會填入的值。 ```python api.Block.con_tw('<積木名稱>', <參數>=<值>) ``` --- ## KD(12 個) ### 日KD的D值<>N - `id`: `t1` - 邏輯:`日KD的D值${operator}${percent}` - 說明:日KD指標中的D值,代表股價在一段時間內的平均動能趨勢。當D值不等於N時,這表示目前的股價動能並未處於N所代表的特定關鍵狀態,例如超買(D>80)、超賣(D<20)或多空平衡點(D=50)。這通常意味著市場尚未達到或已經脫離了N所定義的某個重要轉折或趨勢確認點,因此需要結合K線走勢及其他指標來判斷後續方向。 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `operator` | `>`、`<` | `'<'` | | `percent` | `20`、`50`、`80` | `20` | ```python api.Block.con_tw('日KD的D值<>N') ``` ### 月KD 黃金交叉 - `id`: `t10` - 說明:「月KD 黃金交叉」代表著股價在月線圖上,快速反應的K值向上突破慢速反應的D值。這通常被視為一個中長期趨勢由空翻多、股價可能進入上升通道的買進訊號,暗示著市場動能正在增強,投資人信心回升。 - 無參數 ```python api.Block.con_tw('月KD 黃金交叉') ``` ### 日K<>日D - `id`: `t2` - 邏輯:`日K${operator}日D` - 說明:「日K<>日D」指的是KD指標中的K線與D線發生交叉。K線是快速線,D線是慢速線,兩者的交叉代表市場動能的轉變。當K線向上突破D線時,稱為「黃金交叉」,通常被視為買進訊號,暗示股價可能從低點反轉向上;反之,當K線向下跌破D線時,稱為「死亡交叉」,則被視為賣出訊號,預示股價可能從高點反轉向下。 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `operator` | `>`、`<` | `'>'` | ```python api.Block.con_tw('日K<>日D') ``` ### 周K<>周D - `id`: `t3` - 邏輯:`周K${operator}周D` - 說明:「周K<>周D」表示在週線圖上,隨機指標(Stochastic Oscillator)的K線與D線目前並未重合。這代表市場的短期動能(K線)與長期動能(D線)之間存在差異,暗示著股價趨勢正在形成或延續,而非處於盤整或轉折的關鍵時刻。 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `operator` | `>`、`<` | `'>'` | ```python api.Block.con_tw('周K<>周D') ``` ### 月K<>月D - `id`: `t4` - 邏輯:`月K${operator}月D` - 說明:「月K<>月D」這個技術條件表示月線圖上的隨機指標(KD指標)中,K值與D值並未重疊。這意味著市場在月級別的動能並非處於完全停滯或極度盤整的狀態,而是存在著明確的趨勢方向或動能變化。換句話說,月線KD指標正在積極地反映市場的長期買賣力道,而非處於無方向的膠著狀態。 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `operator` | `>`、`<` | `'>'` | ```python api.Block.con_tw('月K<>月D') ``` ### 日KD 死亡交叉 - `id`: `t5` - 說明:日KD死亡交叉代表短期趨勢線(快線K值)向下穿越長期趨勢線(慢線D值),這通常被視為股價動能由強轉弱的訊號。這暗示著股價可能面臨下跌壓力,投資人應留意潛在的賣出時機或風險。 - 無參數 ```python api.Block.con_tw('日KD 死亡交叉') ``` ### 日KD 黃金交叉 - `id`: `t6` - 說明:「日KD黃金交叉」是指KD指標中的K值(快線)從下方向上突破D值(慢線)的現象。這通常被視為一個多方訊號,暗示股價可能從低點開始反轉向上,是潛在的買進時機。特別是當黃金交叉發生在KD值20以下的超賣區時,其參考價值更高,代表市場買盤動能正在回溫。 - 無參數 ```python api.Block.con_tw('日KD 黃金交叉') ``` ### 周KD 死亡交叉 - `id`: `t7` - 說明:當週KD指標出現死亡交叉時,這通常意味著股價的短期動能正在減弱,並可能預示著中期趨勢將由上漲轉為下跌。由於是週線級別的訊號,其可靠性相對較高,投資人應留意股價可能進入一段修正或盤整期。 - 無參數 ```python api.Block.con_tw('周KD 死亡交叉') ``` ### 最近一日(周月)KD的D值<>N - `id`: `t78` - 邏輯:`最近一${A}KD的D值${O}${N}` - 說明:D值N(通常N=80,超買區):市場處於極度狂熱狀態。在盤整市中代表短線即將見高點;但在強勢多頭中,這稱為『高檔鈍化』,代表軋空行情正在狂飆。D值穿越N(通常N=50,多空分水嶺):代表中長線資金動能的板塊位移,50以上為多方控盤,50以下為空方控盤。 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `table` | `日_技術指標`(日)、`週_技術指標`(周)、`月_技術指標`(月) | `'日_技術指標'` | | `operator` | `<`、`>` | `'<'` | | `percent` | `20`、`25`、`50`、`75`、`80` | `20` | ```python api.Block.con_tw('最近一日(周月)KD的D值<>N') ``` ### 近N個月內,曾發生月KD黃金(死亡)交叉 - `id`: `t79` - 邏輯:`近${N}個月內,曾發生月KD${A}交叉` - 說明:近N月內黃金交叉:代表該標的結束了長達數季甚至數年的空頭跌勢,長線買盤正式奪回主導權。這類股票底氣極強,後續極易走出『長線保護短線』的大多頭波段。近N月內死亡交叉:代表長線景氣循環見頂,或基本面出現結構性衰退。大資金正在堅決撤退,任何短線的反彈都是逃命波。 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `period` | `1`、`2`、`3`、`4`、`5`、`6`、`9`、`12` | `5` | | `operator` | `crossup`(黃金)、`crossdown`(死亡) | `'crossup'` | ```python api.Block.con_tw('近N個月內,曾發生月KD黃金(死亡)交叉') ``` ### 周KD 黃金交叉 - `id`: `t8` - 說明:「週KD黃金交叉」是指在週線圖上,KD指標中的K線(快線)從下方向上突破D線(慢線)的現象。這通常被視為一個中長期趨勢可能由空轉多的重要買進訊號,暗示著市場的賣壓減弱,買盤力量正在增強,股價動能有機會從低點開始反轉向上,進入新的上漲週期。 - 無參數 ```python api.Block.con_tw('周KD 黃金交叉') ``` ### 月KD 死亡交叉 - `id`: `t9` - 說明:「月KD死亡交叉」是指在月線圖上,KD指標中的K值(快線)由上方向下跌破D值(慢線)的現象。這通常被視為一個強烈的長期看跌訊號,暗示股價的上升動能正在減弱,可能預示著股價將進入一段較長時間的下跌趨勢或修正波段。由於是月線級別的交叉,其訊號的可靠性較高,但出現頻率相對較低,對投資人而言是判斷中長期趨勢轉變的重要參考依據。 - 無參數 ```python api.Block.con_tw('月KD 死亡交叉') ``` --- ## K棒型態(46 個) ### 當日為長紅K,且漲幅>P% - `id`: `o27` - 邏輯:`當日為長紅K,且漲幅>${P}%` - 說明:當日出現長紅K線,代表市場買盤力道強勁,股價從開盤到收盤呈現顯著上漲,顯示多方主導了當天的交易。若漲幅更超越特定百分比 (P%),則進一步確認了這股買氣的強度與市場的積極情緒,可能預示著股價短期內具備上攻動能或趨勢反轉的潛力。 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `percent` | `3.5`、`5`、`7`、`9` | `5` | ```python api.Block.con_tw('當日為長紅K,且漲幅>P%') ``` ### 當日為長黑K,且跌幅>-P% - `id`: `o28` - 邏輯:`當日為長黑K,且跌幅>-${P}%` - 說明:「當日為長黑K,且跌幅>-P%」代表該股在交易日中遭遇了顯著的賣壓,導致收盤價大幅低於開盤價,並伴隨了超過P%的跌幅。這通常被解讀為市場情緒極度悲觀的訊號,暗示股價短期內可能面臨進一步的下行風險。 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `percent` | `3.5`、`5`、`7`、`9`(傳入正負皆輸出負值) | `-5` | ```python api.Block.con_tw('當日為長黑K,且跌幅>-P%') ``` ### 連續D日(周、月) K棒為紅K - `id`: `o29` - 邏輯:`連續${D}根${A}K棒為紅K` - 說明:這個技術條件表示在過去D個交易日(或週、月)中,股價的收盤價持續高於開盤價。這是一個明確的多頭訊號,顯示市場買盤強勁,股價呈現連續上漲的趨勢,通常預示著股價可能進入或正在經歷一段上升行情。 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `period` | `1`、`2`、`3`、`4`、`5` | `3` | | `table` | `日`、`周`、`月` | `'日_K'` | ```python api.Block.con_tw('連續D日(周、月) K棒為紅K') ``` ### 連續D日(周、月) K棒為黑K - `id`: `o30` - 邏輯:`連續${D}根${A}K棒為黑K` - 說明:「連續D日(周、月) K棒為黑K」代表在D個連續的交易日、週或月內,該股票的收盤價都低於開盤價。這是一個明確的空頭訊號,顯示市場賣壓持續且強勁,投資人情緒趨於悲觀,股價可能處於下跌趨勢或即將反轉向下。 這種型態,特別是連續出現時,暗示著多方力量的衰竭,空方主導市場,後市股價可能進一步走弱。 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `period` | `1`、`2`、`3`、`4`、`5` | `3` | | `table` | `日`、`周`、`月` | `'日_K'` | ```python api.Block.con_tw('連續D日(周、月) K棒為黑K') ``` ### 最近一日收盤K為實體長紅K,且上影線P% - `id`: `o9` - 邏輯:`今日收盤價距今日最高價${O}${P}%` - 說明:當收盤價與盤中最高價之間存在顯著差距時,這通常暗示股價在衝高後遭遇強勁賣壓,未能守住漲幅。這反映出市場在較高價位承接力道不足,或有獲利了結賣盤湧現,可能預示短期上漲動能減弱。 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `percent` | `3`、`5`、`7`、`9` | `3` | ```python api.Block.con_tw('今日收盤價距今日最高價 <>P%') ``` ### 最近D日內曾發生過一紅吃三黑 - `id`: `o90` - 邏輯:`最近${D}日內曾發生過一紅吃三黑` - 說明:本策略篩選出最近三個交易日K線完美組成『孤島晨星』型態的標的。此為『晨星』與『島狀反轉』的究極結合體。第一日為長黑K;第二日『向下跳空』留下缺口,收出實體極小的星線(十字星);第三日(今日)『向上跳空』留下缺口,收出一根實體長紅K。第二日的星線被左右兩個缺口徹底孤立,在線圖上宛如一座『孤島』。此型態代表市場情緒從極度恐慌瞬間切換至極度貪婪,空軍被徹底坑殺在島上,是動能最強、勝率最高的波段起漲訊號。 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `period` | `3`、`5`、`7`、`10`、`20` | `5` | ```python api.Block.con_tw('最近D日內曾發生過一紅吃三黑') ``` ### 最近一日收盤K為孤島晨星 - `id`: `o91` - 說明:最近一日收盤K為孤島晨星 - 無參數 ```python api.Block.con_tw('最近一日收盤K為孤島晨星') ``` ### 最近D日內曾發生過孤島晨星 - `id`: `o92` - 邏輯:`最近${D}日內曾發生過孤島晨星` - 說明:孤島晨星發動時伴隨強大跳空,極易引發短線當沖客的獲利了結賣壓。透過D日的觀察期,系統旨在追蹤多方主力對『向上跳空缺口』的防守意志。若股價在整理期間量縮,且絕對不回補該跳空缺口,即為市場最強勢的『缺口回測買點』,預示著一波狂暴的主升段即將展開。 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `period` | `3`、`5`、`7`、`10`、`20` | `5` | ```python api.Block.con_tw('最近D日內曾發生過孤島晨星') ``` --- ## MACD指標(31 個) ### DIF-MACD<>0 - `id`: `t13` - 邏輯:`DIF-MACD${operator}${percent}` - 說明:「DIF-MACD<>0」指的是MACD指標中的柱狀圖不為零。這代表DIF快線與MACD慢線尚未發生交叉,市場的動能趨勢仍在持續中。當柱狀圖為正值時,表示DIF線在MACD線上方,多頭動能強勁;當柱狀圖為負值時,則顯示DIF線在MACD線下方,空頭動能佔優勢,有助於判斷當前趨勢的強度與方向。 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `operator` | `>`、`<` | `'>'` | | `percent` | `0` | `0` | ```python api.Block.con_tw('DIF-MACD<>0') ``` ### DIF-MACD正轉負 - `id`: `t14` - 說明:「DIF-MACD正轉負」在技術分析中,指的是DIF線(快線)由上方向下穿越MACD線(慢線),這通常被稱為「死亡交叉」。這個訊號意味著股價的短期上漲動能正在減弱,甚至可能預示著股價即將進入調整或下跌趨勢。此時,投資者應密切關注市場走勢,並考慮風險管理,因為這可能是一個賣出訊號或趨勢反轉的警示.。 - 無參數 ```python api.Block.con_tw('DIF-MACD正轉負') ``` ### DIF-MACD負轉正 - `id`: `t15` - 說明:「DIF-MACD負轉正」指的是MACD指標中的柱狀圖(Histogram)從負值轉為正值。這代表著DIF線(快線)向上穿越了MACD線(慢線),形成所謂的「黃金交叉」買入訊號。 這個技術條件意味著短期市場動能開始增強,多頭力量逐漸佔據主導地位,通常被視為股價可能由跌轉漲或加速上漲的潛在買進時機。 - 無參數 ```python api.Block.con_tw('DIF-MACD負轉正') ``` ### DIF-MACD近D日持續增加(減少) - `id`: `t16` - 邏輯:`DIF-MACD近${period}日持續${operator}` - 說明:這是在幫你找『順風』或『逆風』。如果這兩個數值的差持續變大,就像風愈吹愈大,你跟著風走會比較省力(趨勢強勁);如果差值開始縮小,就代表風快停了,這時候要小心可能快要轉向了。 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `period` | `1`、`2`、`3`、`4`、`5`、`10` | `3` | | `operator` | `>`(增加)、`<`(減少) | `'>'` | ```python api.Block.con_tw('DIF-MACD近D日持續增加(減少)') ``` ### DIF<>0 - `id`: `t17` - 邏輯:`DIF${operator}0` - 說明:DIF(差離值)是MACD指標中的核心組成部分,它代表了短期移動平均線與長期移動平均線之間的差值。當DIF不等於零時,表示短期與長期趨勢線之間存在明顯的距離,這暗示著市場正處於一個明確的趨勢之中,而非盤整或趨勢不明的狀態。具體來說,DIF大於零通常被視為多頭趨勢的訊號,而DIF小於零則傾向於空頭趨勢。 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `operator` | `>`、`<` | `'>'` | ```python api.Block.con_tw('DIF<>0') ``` ### DIF正轉負 - `id`: `t18` - 說明:DIF(差離值)是MACD指標中的一條快線,它代表短期與長期移動平均線之間的差值,用來衡量市場的短期動能。當DIF從正值轉為負值時,表示短期動能由強轉弱,從多頭主導轉為空頭主導,這通常被視為一個潛在的賣出訊號,暗示股價可能由漲轉跌或下跌動能增強。 這意味著市場的短期趨勢開始弱於長期趨勢,投資者應留意股價可能進入回檔或下跌的階段。 - 無參數 ```python api.Block.con_tw('DIF正轉負') ``` ### DIF負轉正 - `id`: `t19` - 說明:「DIF負轉正」是指MACD指標中的DIF(差離值)線從零軸下方穿越至零軸上方。這代表短期移動平均線已向上突破長期移動平均線,顯示市場的短期動能由空方轉為多方,暗示股價可能從下跌趨勢轉為上漲趨勢。這是一個重要的多頭訊號,預示著潛在的趨勢反轉或新一輪上漲行情的啟動。 - 無參數 ```python api.Block.con_tw('DIF負轉正') ``` ### DIF近D日持續增加(減少) - `id`: `t20` - 邏輯:`DIF近${D}日持續${H}` - 說明:DIF(差離值)是MACD指標中的「快線」,它反映了短期與長期指數移動平均線之間的差值,用來衡量市場的短期動能變化。 當DIF在近D日持續增加時,這代表短期上漲動能持續增強,相對於長期趨勢而言,多頭力量正在累積,顯示市場可能處於上升趨勢或即將轉強。 反之,若DIF持續減少,則表示短期下跌動能持續增強,空頭力量佔據主導,暗示市場可能處於下降趨勢或面臨回檔壓力。 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `period` | `2`、`3`、`4`、`5`、`6`、`8`、`10`、`20` | `3` | | `operator` | `>`(增加)、`<`(減少) | `'>'` | ```python api.Block.con_tw('DIF近D日持續增加(減少)') ``` ### DIF黃金交叉上穿過MACD - `id`: `t21` - 說明:當DIF線從下方穿越MACD線,形成「黃金交叉」時,這通常被視為一個看漲訊號。這表示短期動能正在增強,超越了長期動能,暗示股價可能即將進入上升趨勢或延續其漲勢。 - 無參數 ```python api.Block.con_tw('DIF黃金交叉上穿過MACD') ``` ### DIF死亡交叉下穿過MACD - `id`: `t22` - 說明:「DIF死亡交叉下穿過MACD」是指在MACD指標中,DIF快線由上方向下跌破MACD慢線(也稱為DEA線或訊號線)的現象。這通常被視為一個看跌訊號,暗示著市場的短期動能正在減弱,可能預示著股價將進入下跌趨勢或現有跌勢將持續。簡單來說,這代表短期平均買進價格小於長期平均價格,賣壓轉強,投資人應考慮獲利了結或止損。 - 無參數 ```python api.Block.con_tw('DIF死亡交叉下穿過MACD') ``` ### 周DIF-MACD<>0 - `id`: `t23` - 邏輯:`周DIF-MACD${operator}${percent}` - 說明:「周DIF-MACD<>0」代表週線圖上的MACD柱狀圖不為零,這意味著DIF快線與MACD慢線目前並未交叉。這顯示市場正處於一個明確的趨勢慣性之中,而非趨勢轉折的關鍵時刻,有助於判斷中長期趨勢的延續性。 具體來說,DIF(差離值)是短期指數移動平均線(通常為12日EMA)減去長期指數移動平均線(通常為26日EMA)的結果,反映了短期與中期價格趨勢的偏離程度。 MACD線(又稱DEA或訊號線)則是DIF的9日指數移動平均線,對DIF進行了平滑處理,使其信號更為穩定。 當DIF與MACD線不相等時,MACD柱狀圖就會顯示數值(正值或負值),這表示DIF線與MACD線之間存在距離,市場動能正在持續,而非處於即將發生黃金交叉或死亡交叉的轉折點。 由於是「周」線級別的分析,這種趨勢的延續性通常具有較高的可靠性,適合用於判斷中長期的市場方向。 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `operator` | `>`、`<` | `'>'` | | `percent` | `0` | `0` | ```python api.Block.con_tw('周DIF-MACD<>0') ``` ### 周DIF-MACD正轉負 - `id`: `t24` - 說明:「周DIF-MACD正轉負」表示DIF線(短期與長期移動平均線的差值)已由正值轉為負值,這是一個重要的中長期趨勢反轉訊號。它暗示著股價的上升動能正在衰竭,市場可能從多頭格局轉為空頭格局,投資人應留意潛在的下跌風險。 - 無參數 ```python api.Block.con_tw('周DIF-MACD正轉負') ``` ### 周DIF-MACD負轉正 - `id`: `t25` - 說明:「周DIF-MACD負轉正」代表在週線圖上,DIF線(快線)從負值區間向上穿越MACD線(慢線),形成「黃金交叉」買入訊號。這通常意味著股價的短期動能由弱轉強,且超越了長期動能,暗示著市場情緒從空頭轉為多頭,可能預示著一波中長期上漲趨勢的開始或強勁反彈。由於是週線級別的訊號,其可靠性與趨勢的持續性通常會比日線級別的訊號更強。 - 無參數 ```python api.Block.con_tw('周DIF-MACD負轉正') ``` ### 周DIF-MACD近D日持續增加(減少) - `id`: `t26` - 邏輯:`周DIF-MACD近${period}日持續${operator}` - 說明:這個技術條件指的是MACD指標中的「柱狀圖」(或稱MACD動能柱)在週線圖上的表現。當周DIF-MACD在近D週持續增加時,這代表股價的上升動能正在增強,或者下跌動能正在減弱,通常被視為一個看漲訊號,暗示股價可能進入上升趨勢或其上升趨勢正在加速。反之,若周DIF-MACD在近D週持續減少,則表示股價的上升動能正在減弱,或者下跌動能正在增強,這通常被視為一個看跌訊號,暗示股價可能進入下跌趨勢或其下跌趨勢正在加速。由於是使用週線數據,這個訊號對於判斷中長期趨勢的轉變具有較高的參考價值。 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `period` | `1`、`2`、`3`、`4`、`6`、`8` | `3` | | `operator` | `>`(增加)、`<`(減少) | `'>'` | ```python api.Block.con_tw('周DIF-MACD近D日持續增加(減少)') ``` ### 周DIF<>0 - `id`: `t27` - 邏輯:`周DIF${operator}0` - 說明:當「周DIF<>0」時,這代表在週線圖上,DIF線(快線)並未處於零軸位置。這意味著市場的短期週線動能與長期週線動能之間存在明顯差異,顯示股價正處於一個有方向性的趨勢中,而非盤整或中性狀態。具體來說,DIF大於零表示多頭動能較強,而DIF小於零則表示空頭動能佔優。 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `operator` | `>`、`<` | `'>'` | ```python api.Block.con_tw('周DIF<>0') ``` ### 周DIF正轉負 - `id`: `t28` - 說明:「周DIF正轉負」代表著股價的短期移動平均線(通常是12週EMA)已經向下穿越了長期移動平均線(26週EMA)。這是一個重要的賣出訊號,暗示著股價的上升動能正在減弱,並可能預示著中長期趨勢由多轉空,投資人應提高警覺。 - 無參數 ```python api.Block.con_tw('周DIF正轉負') ``` ### 周DIF負轉正 - `id`: `t29` - 說明:「周DIF負轉正」是指在MACD指標中,代表短期動能的DIF線(快線)從零軸下方穿越至零軸上方。這通常意味著股價的短期平均成本已超越長期平均成本,市場的空頭力量減弱,多頭力量開始增強,預示著股價可能從下跌趨勢轉為上漲趨勢,是一個潛在的買入訊號。 - 無參數 ```python api.Block.con_tw('周DIF負轉正') ``` ### 周DIF近D周持續增加(減少) - `id`: `t30` - 邏輯:`周DIF近${D}周持續${H}` - 說明:「周DIF持續增加」表示在過去D週內,股價的短期動能相對於長期趨勢持續增強,這通常預示著市場買盤力道穩健,股價有望維持上漲趨勢。反之,「周DIF持續減少」則代表短期動能持續減弱,賣壓可能正在累積,需留意股價可能面臨回檔或轉弱的風險。DIF(差離值)是MACD指標中的核心組成部分,它反映了短期指數移動平均線與長期指數移動平均線之間的差值,用以衡量市場動能的強弱與方向。 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `period` | `1`、`2`、`3`、`4`、`5`、`6`、`9`、`12` | `3` | | `operator` | `>`(增加)、`<`(減少) | `'>'` | ```python api.Block.con_tw('周DIF近D周持續增加(減少)') ``` ### 周DIF黃金交叉上穿過周MACD - `id`: `t31` - 說明:當週線圖上的DIF線向上穿越MACD線形成「黃金交叉」時,這是一個強烈的看漲訊號。這表示短期動能已顯著增強並超越了長期趨勢,暗示股價可能正從下跌或盤整格局轉為一個更為穩固且持續的上升趨勢。 - 無參數 ```python api.Block.con_tw('周DIF黃金交叉上穿過周MACD') ``` ### 周DIF死亡交叉下穿過周MACD - `id`: `t32` - 說明:當週線DIF(差離值)向下穿越週線MACD(訊號線)時,這通常被視為一個看跌的「死亡交叉」訊號。它意味著股票的短期動能正在減弱,並可能預示著股價將進入一段下跌趨勢,或是現有跌勢的延續,投資人應留意風險。 - 無參數 ```python api.Block.con_tw('周DIF死亡交叉下穿過周MACD') ``` ### 月DIF-MACD<>0 - `id`: `t33` - 邏輯:`月DIF-MACD${operator}${percent}` - 說明:「月DIF-MACD<>0」這個技術條件,指的是月線圖上的MACD柱狀圖不為零。這意味著月線的DIF快線與MACD慢線目前並未交叉,顯示市場的長期動能處於明確的趨勢之中,而非處於盤整或轉折的關鍵時刻。當柱狀圖為正值時,代表多頭動能強勁;當為負值時,則顯示空頭趨勢佔優。 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `operator` | `>`、`<` | `'>'` | | `percent` | `0` | `0` | ```python api.Block.con_tw('月DIF-MACD<>0') ``` ### 月DIF-MACD正轉負 - `id`: `t34` - 說明:「月DIF-MACD正轉負」代表在月線圖上,DIF線(快線)從MACD線(慢線)上方穿越至下方,形成一個「死亡交叉」的賣出訊號。 這通常預示著股價的上升動能正在減弱,甚至可能進入中長期下跌趨勢,對於投資者而言,這是一個需要高度警惕的訊號,可能需要考慮減持或出場以規避潛在的下行風險。 - 無參數 ```python api.Block.con_tw('月DIF-MACD正轉負') ``` ### 月DIF-MACD負轉正 - `id`: `t35` - 說明:「月DIF-MACD負轉正」這個技術條件,指的是在月線圖上,MACD指標中的DIF線(快線)由下往上穿越MACD線(慢線或訊號線),使得兩者之間的差值(即MACD柱狀圖)從負值轉為正值。 這是一個強烈的長期買入訊號,代表股價的月線級別動能由空轉多,暗示著市場趨勢可能正從下跌或盤整轉為上升,是中長期投資者判斷趨勢轉折的重要依據。 - 無參數 ```python api.Block.con_tw('月DIF-MACD負轉正') ``` ### 月DIF-MACD近D月持續增加(減少) - `id`: `t36` - 邏輯:`月DIF-MACD近${period}月持續${operator}` - 說明:當月DIF線與MACD線的差值(即MACD柱狀圖)在近D個月持續增加時,這代表著股價的上升動能正在穩定且持續地增強,顯示多方力量逐漸佔據主導地位。反之,若持續減少,則意味著下跌動能不斷累積,空方力量正在增強,股價可能面臨更大的下行壓力。 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `period` | `1`、`2`、`3`、`4`、`5`、`6` | `3` | | `operator` | `>`(增加)、`<`(減少) | `'>'` | ```python api.Block.con_tw('月DIF-MACD近D月持續增加(減少)') ``` ### 月DIF<>0 - `id`: `t37` - 邏輯:`月DIF${operator}0` - 說明:「月DIF<>0」表示月線MACD指標中的DIF線不為零,這意味著在月線級別上,股價的短期與長期趨勢之間存在著動能差異。當DIF不為零時,市場正處於一個有方向性的趨勢中,無論是多頭或空頭,都顯示出一定的力量,而非處於盤整或無明確方向的狀態。 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `operator` | `>`、`<` | `'>'` | ```python api.Block.con_tw('月DIF<>0') ``` ### 月DIF正轉負 - `id`: `t38` - 說明:當月DIF從正值轉為負值時,這代表著MACD指標中的快線(DIF)向下穿越慢線(DEM),形成死亡交叉。這通常被視為股價動能由強轉弱的訊號,暗示著中長期趨勢可能從上漲轉為下跌或進入盤整階段。 - 無參數 ```python api.Block.con_tw('月DIF正轉負') ``` ### 月DIF負轉正 - `id`: `t39` - 說明:「月DIF負轉正」代表著股價的短期動能已從弱勢轉為強勢,這是MACD指標中一個重要的多頭訊號。這表示月線圖上的短期移動平均線已向上穿越長期移動平均線,顯示市場的買盤力道正在增強,股價可能從下跌趨勢中反轉向上,進入上升階段。 - 無參數 ```python api.Block.con_tw('月DIF負轉正') ``` ### 月DIF近D月持續增加(減少) - `id`: `t40` - 邏輯:`月DIF近${period}月持續${operator}` - 說明:「月DIF近D月持續增加」表示在較長的時間週期內,股價的短期動能持續超越長期趨勢,暗示市場買盤力道穩健增強,有利於股價維持上升格局。 反之,若「月DIF近D月持續減少」,則意味著短期賣壓不斷加重,股價可能面臨持續下行的風險。 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `period` | `1`、`2`、`3`、`4`、`5`、`6` | `3` | | `operator` | `>`(增加)、`<`(減少) | `'>'` | ```python api.Block.con_tw('月DIF近D月持續增加(減少)') ``` ### 月DIF黃金交叉上穿過月MACD - `id`: `t41` - 說明:當月DIF線從下方穿越月MACD線形成黃金交叉時,這是一個強烈的多頭訊號,代表股價的短期動能已轉強並超越長期動能。這通常預示著股價可能進入一個新的、更為穩固的長期上升趨勢,顯示市場買盤力道正在增強。 - 無參數 ```python api.Block.con_tw('月DIF黃金交叉上穿過月MACD') ``` ### 月DIF死亡交叉下穿過月MACD - `id`: `t42` - 說明:「月DIF死亡交叉下穿過月MACD」表示在月線圖上,DIF線(快線)向下穿越MACD線(慢線)。這是一個強烈的長期看跌訊號,通常預示著股價的上升動能已經耗盡,並可能進入一段較長時間的下跌趨勢或盤整期,投資者應警惕市場趨勢可能反轉向下。 - 無參數 ```python api.Block.con_tw('月DIF死亡交叉下穿過月MACD') ``` ### DMI多方(空方)股 - `id`: `t65` - 邏輯:`ADX${operator}${percent}` - 說明:「DMI多方股」指的是當DMI指標中的「+DI線」(上升動向指數)位於「-DI線」(下降動向指數)上方時,顯示買方力量強於賣方,股價處於上升趨勢。 相反地,「DMI空方股」則表示「-DI線」在「+DI線」上方,代表賣方力量佔優,股價傾向下跌。 結合ADX線(平均趨向指數)判斷趨勢強度,能更精準地確認該股是處於強勁的多頭或空頭走勢。 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `operator` | `>`(DMI多方)、`<`(DMI空方) | `'>'` | | `percent` | `5`、`10`、`15`、`20`、`25` | `15` | ```python api.Block.con_tw('DMI多方(空方)股') ``` --- ## RSI指標(10 個) ### 日RSI(5)<>RSI(10) - `id`: `t43` - 邏輯:`日RSI(5)${operator}RSI(10)` - 說明:「日RSI(5) > RSI(10)」這個技術條件,代表著短期(5日)的股價動能已超越了中期(10日)的動能。RSI(相對強弱指標)是一種衡量價格變動速度與幅度的動量震盪指標,數值介於0到100之間,通常用於判斷市場的超買或超賣狀態。 當短期RSI(例如5日)向上突破長期RSI(例如10日)時,這通常被視為一個股價動能轉強的「黃金交叉」訊號,暗示著近期買盤力道增強,股價可能正處於或即將進入一個上升趨勢。這表示在較短的時間週期內,股價上漲的強度大於下跌的強度,且這種短期強勢已超越了中期的表現,是潛在的買入訊號。 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `operator` | `>`、`<` | `'>'` | ```python api.Block.con_tw('日RSI(5)<>RSI(10)') ``` ### 日周月RSI(5)值<>N - `id`: `t44` - 邏輯:`${A}RSI(5)值${O}${N}` - 說明:「日周月RSI(5)值<>N」這個條件,代表您正在同時觀察一檔股票在日線、週線和月線圖上,其5日相對強弱指標(RSI)的數值是否符合您設定的特定條件N。5日RSI是一個短週期動量指標,能靈敏反映股價的短期漲跌力道;透過在不同時間週期上檢視其與N值的關係,您可以綜合判斷該股票在短期、中期及長期趨勢中的動能狀態,例如判斷是否超買超賣,或動能轉強轉弱,為您的交易決策提供多維度的參考。 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `table` | `日_技術指標`(日)、`週_技術指標`(周)、`月_技術指標`(月) | `'日_技術指標'` | | `operator` | `>`、`<` | `'<'` | | `percent` | `20`、`50`、`80` | `20` | ```python api.Block.con_tw('日周月RSI(5)值<>N') ``` ### RSI(5)死亡交叉下穿過RSI(10) - `id`: `t45` - 說明:當RSI(5)死亡交叉下穿過RSI(10)時,這代表短期市場動能已明顯轉弱,並跌破了中期的動能支撐。這通常被視為一個看跌訊號,暗示股價上漲的力道正在減退,未來可能面臨回檔或下跌的壓力。 - 無參數 ```python api.Block.con_tw('RSI(5)死亡交叉下穿過RSI(10)') ``` ### RSI(5)黃金交叉上穿過RSI(10) - `id`: `t46` - 說明:RSI(5)黃金交叉上穿RSI(10)代表短期市場買盤力道增強,並超越了中長期動能。這通常被視為一個看漲訊號,暗示股價可能即將進入上升趨勢或延續其漲勢,反映了市場情緒的積極轉變。 - 無參數 ```python api.Block.con_tw('RSI(5)黃金交叉上穿過RSI(10)') ``` ### 周RSI(5)死亡交叉下穿過周RSI(10) - `id`: `t47` - 說明:當週RSI(5)死亡交叉下穿過週RSI(10)時,這通常被視為一個中長期趨勢轉弱的訊號。它意味著短期內的上漲動能正在快速減弱,並已跌破較長期的平均動能,暗示股價可能進入一段修正或下跌的趨勢。這代表市場的買盤力道正在消退,賣壓可能逐漸增強。 - 無參數 ```python api.Block.con_tw('周RSI(5)死亡交叉下穿過周RSI(10)') ``` ### 周RSI(5)黃金交叉上穿過周RSI(10) - `id`: `t48` - 說明:「週RSI(5)黃金交叉上穿週RSI(10)」這個技術條件,代表著短期動能(5週RSI)已經超越了長期動能(10週RSI),顯示市場買盤力道正在增強。這通常被視為一個中長期看漲的訊號,暗示股價的上升動能正在累積,可能預示著一波上漲趨勢的開始或延續。 - 無參數 ```python api.Block.con_tw('周RSI(5)黃金交叉上穿過周RSI(10)') ``` ### 周RSI(5)<>周RSI(10) - `id`: `t49` - 邏輯:`周RSI(5)${operator}周RSI(10)` - 說明:這代表短期(5週)的相對強弱指標RSI,已經超越了中期(10週)的RSI。這通常被視為一個看漲訊號,暗示股價的短期上漲動能正在增強,並可能預示著股價趨勢由弱轉強或持續上漲。在技術分析中,這被稱為RSI的「黃金交叉」,是判斷買入時機的常見指標之一。 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `operator` | `>`、`<` | `'>'` | ```python api.Block.con_tw('周RSI(5)<>周RSI(10)') ``` ### 月RSI(5)死亡交叉下穿過月RSI(10) - `id`: `t50` - 說明:這個技術條件表示在月線圖上,短期動能指標RSI(5)已經向下穿越長期動能指標RSI(10),形成一個「死亡交叉」訊號。這通常被解讀為股價的短期上漲動能正在減弱,並可能預示著中長期趨勢將由強轉弱,投資人應留意潛在的賣壓或趨勢反轉風險。 - 無參數 ```python api.Block.con_tw('月RSI(5)死亡交叉下穿過月RSI(10)') ``` ### 月RSI(5)黃金交叉上穿過月RSI(10) - `id`: `t51` - 說明:當月RSI(5)黃金交叉上穿月RSI(10)時,這代表短期市場動能已顯著增強,並超越了中長期動能。這通常被視為一個強烈的看漲訊號,暗示股價在月線圖上可能正從底部反轉,或現有的上升趨勢將進一步加速。 - 無參數 ```python api.Block.con_tw('月RSI(5)黃金交叉上穿過月RSI(10)') ``` ### 月RSI(5)<>月RSI(10) - `id`: `t52` - 邏輯:`月RSI(5)${operator}月RSI(10)` - 說明:「月RSI(5) <> 月RSI(10)」這個條件,從技術分析的角度來看,表示在月線級別上,衡量短期(5個月)與中期(10個月)股價動能的相對強弱指標數值並不一致。這暗示著市場的短期動能與中期動能之間存在著動態的變化,而非處於完全同步的狀態。這種差異是許多動能策略(例如黃金交叉或死亡交叉)形成的前提,因為它反映了市場力量的消長與潛在趨勢轉變的可能。 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `operator` | `>`、`<` | `'>'` | ```python api.Block.con_tw('月RSI(5)<>月RSI(10)') ``` --- ## 其他技術分析指標(13 個) ### 威廉指標N% - `id`: `t12` - 邏輯:`威廉指標${operator}${percent}%` - 說明:當威廉指標(Williams %R)數值高於N%時,這通常意味著股價在過去一段時間內已達到相對高點,進入了超買區間,暗示短期內可能面臨回檔或整理壓力。然而,在極度強勢的市場中,威廉指標長時間維持在高檔,也可能反映出強勁的買盤動能,股價仍有上攻潛力。 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `operator` | `>` | `'>'` | | `percent` | `-20`、`-50`、`-80` | `-20` | ```python api.Block.con_tw('威廉指標>N%') ``` ### TR(1)>ATR(20)P% - `id`: `t66` - 邏輯:`TR(1)>ATR(20)${P}%` - 說明:這個技術條件表示當前交易日的真實波動幅度 (True Range) 顯著大於過去 20 個交易日的平均真實波動幅度 (Average True Range) 的 P%。這代表市場在當前交易日出現了異常劇烈的價格波動,可能預示著市場情緒的劇烈變化,或是重大事件導致的股價大幅度移動,值得投資人密切關注。 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `percent` | `0`、`50`、`100`、`150`、`200` | `100` | | `operator` | `>`、`<` | `'>'` | ```python api.Block.con_tw('TR(1)>ATR(20)P%') ``` ### 日(周月)DMI 黃金(死亡)交叉 - `id`: `t67` - 邏輯:`${A}DMI ${B}交叉` - 說明:本策略利用DMI指標中的+DI(多方動向)、-DI(空方動向)與ADX(平均動向指數)來捕捉趨勢。黃金交叉:當+DI由下往上突破-DI,代表多方力道正式超越空方,為波段起漲訊號。死亡交叉:當+DI由上往下跌破-DI,代表空方力道壓過多方,為波段起跌訊號。搭配日/周/月不同時間級別,可分別過濾出短線強勢股、中線波段主升段、以及長線宏觀大趨勢。 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `period_type` | `日`、`周`、`月` | `'日'` | | `operator` | `>`(黃金)、`<`(死亡) | `'>'` | ```python api.Block.con_tw('日(周月)DMI 黃金(死亡)交叉') ``` ### D日MTM<>0 - `id`: `t68` - 邏輯:`${D}日MTM${O}0` - 說明:本策略利用D日動量指標與零軸的交叉來判斷趨勢轉折。MTM的公式極度簡單:今日收盤價-D天前的收盤價。MTM>0(向上突破零軸):代表今日價格正式超越D天前的價格,股價『加速度』轉正,為動能轉強的偏多訊號。MTM<0(向下跌破零軸):代表今日價格跌破D天前的價格,股價『加速度』轉負,為動能轉弱的偏空訊號。零軸(0)就是多空動能的絕對分水嶺。 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `period` | `5`、`10`、`20`、`60`、`240` | `10` | | `operator` | `<`、`>` | `'>'` | ```python api.Block.con_tw('D日MTM<>0') ``` ### D日MTM突(跌)破0軸 - `id`: `t69` - 邏輯:`D日MTM${A}破0軸` - 說明:本策略精準篩選出D日動量指標在『最近一日』剛好完成零軸穿越的標的。突破0軸(黃金交叉):股價擺脫過去D日的頹勢,今日收盤價正式超越D日前的價格。代表多方動能瞬間點火,為波段右側的『起漲轉折訊號』。跌破0軸(死亡交叉):今日收盤價正式跌破D日前的價格。代表空方動能瞬間摜破防線,為波段右側的『起跌逃命訊號』。 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `operator` | `突`、`跌` | `'突'` | ```python api.Block.con_tw('D日MTM突(跌)破0軸') ``` ### 連續D日10日MTM遞(減) - `id`: `t70` - 邏輯:`連續${D}日10日MTM${A}` - 說明:本策略追蹤10日動量指標在過去D個交易日內的『數值變化斜率』。連續遞增:代表股價上漲的『加速度』正在持續放大,多方推升力道一天比一天猛烈,為強勢主升段的特徵。若發生在MTM<0,則代表跌勢正在急速煞車。連續遞減:代表股價推升的力道開始衰退(油門鬆開),或下跌的加速度正在加劇。若股價創新高但MTM連續遞減,即構成經典的『高檔動能背離』,為強烈反轉示警訊號。 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `period` | `2`、`3`、`4`、`5` | `3` | | `operator` | `>`(增)、`<`(減) | `'>'` | ```python api.Block.con_tw('連續D日10日MTM遞(減)') ``` ### 今日ADX<>N - `id`: `t71` - 邏輯:`今日ADX${O}${N}` - 說明:本策略利用ADX指標,來判斷市場是否具備明確的趨勢。ADX本身不區分多空方向,它只測量『趨勢的強度』。ADX向上突破N:代表市場擺脫無方向的盤整,趨勢動能正式點火。ADX向下跌破N:代表市場動能衰退,進入『死水盤整區』,此時所有的趨勢跟隨策略都容易產生頻繁虧損的假訊號。 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `operator` | `<`、`>` | `'>'` | | `threshold` | `25`、`50`、`75` | `25` | ```python api.Block.con_tw('今日ADX<>N') ``` ### D日OBV<>T日OBV - `id`: `t72` - 邏輯:`${D}日OBV${O}${T}日OBV` - 說明:利用OBV指標的短天期移動平均線與長天期移動平均線進行黃金或死亡交叉判定 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `d_period` | `5`、`10`、`20`、`60`、`120` | `5` | | `operator` | `<`、`>` | `'>'` | | `t_period` | `10`、`20`、`60`、`120`、`240` | `20` | ```python api.Block.con_tw('D日OBV<>T日OBV') ``` ### OBV呈多(空)頭排列 - `id`: `t73` - 邏輯:`OBV呈${A}頭排列` - 說明:將經典的『多頭排列』概念,完美移植到 OBV(能量潮指標)之上。其嚴格定義為:提取OBV的三條不同天期移動平均線(如 5日、10日、20日),且今日數值必須呈現『短天期 > 中天期 > 長天期』(例如 5日 OBV MA > 10日 OBV MA > 20日 OBV MA),同時這三條均線的斜率皆必須為正(向上彎折)。此型態代表市場資金在短期、中期、長期的維度上,全面達成『買進大於賣出』的強烈共識,是推升股價走長波段大多頭的最強燃料庫。 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `trend` | `多`、`空` | `'多'` | ```python api.Block.con_tw('OBV呈多(空)頭排列') ``` ### 收盤價標準差<>N - `id`: `t75` - 邏輯:`收盤價標準差${O}${N}` - 說明:標準差是衡量價格離散程度的統計工具,無關多空方向。標準差>N(向上突破):代表股價擺脫長期的死水盤整,波動率瞬間急遽放大。若伴隨價格向上突破頸線,為極強勢的『波段起漲/軋空發動訊號』。標準差` | `'>'` | | `threshold` | `3`、`5`、`7`、`10` | `5` | ```python api.Block.con_tw('收盤價標準差<>N') ``` ### 近D日標準差平均<>N - `id`: `t76` - 邏輯:`近D日標準差平均${O}${N}` - 說明:旨在識別標的的常態波動慣性,透過拉長時間軸來排除單日極端波動,確保策略執行的環境具備穩定的波動基調。 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `operator` | `<`、`>` | `'>'` | | `threshold` | `3`、`5`、`7`、`10` | `5` | ```python api.Block.con_tw('近D日標準差平均<>N') ``` ### 夏普指數<>N - `id`: `t77` - 邏輯:`夏普指數${O}${N}` - 說明:夏普指數指標是金融界最常用來衡量投資組合性價比的指標。公式是(預期年化報酬率-無風險利率)/年化標準差 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `operator` | `<`、`>` | `'>'` | | `threshold` | `0`、`1`、`2` | `1` | ```python api.Block.con_tw('夏普指數<>N') ``` --- ## 區間震幅(4 個) ### 今日區間振幅>近D日平均振幅P% - `id`: `o39` - 邏輯:`今日區間振幅>近${D}日平均振幅${P}%` - 說明:「今日區間振幅大於近D日平均振幅P%」代表今日股價的波動幅度顯著超越了過去D天的平均水準。這種異常擴大的震幅,通常暗示著市場情緒的劇烈變化,可能是多空雙方力量正在激烈交鋒,預示著股價可能即將脫離原有的盤整區間,進入一個新的趨勢階段。 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `period` | `5`、`10`、`20`、`60`、`120`、`240` | `20` | | `percent` | `0.01`、`1`、`3`、`5` | `150` | ```python api.Block.con_tw('今日區間振幅>近D日平均振幅P%') ``` ### 最近第一根日(周月)K棒振幅<>最近第2根至第N根之平均振幅P倍 - `id`: `o50` - 邏輯:`最近第一根${A}K棒振幅${O}最近第2根至第${N}根之平均振幅${P}倍` - 說明:本策略將『最新一根 K 棒(日/週/月)的高低點震幅』,與『過去一段時間(第 2 根至第 N 根)的歷史平均震幅』進行比較。旨在偵測股價波動慣性的改變。若最新震幅顯著大於平均,代表趨勢正在爆發或發生轉折;若小於平均,則代表籌碼正在沉澱、趨勢進入收斂與蓄勢階段。 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `period_type` | `日`、`周`、`月` | `'日'` | | `operator` | `<`、`>` | `'>'` | | `n` | `2`、`3`、`4`、`5`、`6`、`10`、`20`、`60`、`120`、`240` | `5` | | `multiplier` | `1`、`1.2`、`1.5`、`2`、`2.5`、`3` | `1.5` | ```python api.Block.con_tw('最近第一根日(周月)K棒振幅<>最近第2根至第N根之平均振幅P倍') ``` ### 區間振幅P% - `id`: `o7` - 邏輯:`區間振幅${P}%` - 說明:「區間振幅P%」衡量的是在特定時間週期內,股價從最低點到最高點的波動幅度達到P%。這個指標能有效反映市場的活躍程度與多空力量的拉鋸,較大的振幅通常預示著市場情緒較為劇烈,可能蘊含著潛在的交易機會或風險。 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `percent` | `3`、`5`、`7`、`9`、`11`、`13`、`15`、`18`、`20` | `20` | ```python api.Block.con_tw('區間振幅P%') ``` ### 還原價區間振幅P% - `id`: `o7x` - 邏輯:`還原價區間振幅${P}%` - 說明:「還原價區間振幅P%」指的是在排除除權息等因素對股價的影響後,股票在特定時間區間內的價格波動幅度。這個指標能更真實地反映股價的內在動能與市場情緒,當振幅P%較大時,通常意味著該股票在該區間內經歷了劇烈的多空交戰,可能預示著未來趨勢的形成或轉變。 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `percent` | `3`、`5`、`7`、`9`、`11`、`13`、`15`、`18`、`20` | `20` | ```python api.Block.con_tw('還原價區間振幅P%') ``` --- ## 合約負債(4 個) ### 最近一季合約負債佔股本年增率<>P% - `id`: `f81` - 邏輯:`最近一季合約負債佔股本年增率${O}${P}%` - 說明:本策略追蹤個股最新一季財報中的『合約負債』,將其除以『公司實收股本』得出佔比,並與去年同期(YoY)進行比較,篩選出年增率大於或小於P%的標的。年增率>P%(強勢爆發):顯示客戶願意『先付錢排隊等出貨』的意願大幅提升。由於合約負債未來會隨著產品交貨直接轉換為『營業收入』,此數值的大幅跳升,是業績即將進入主升段的最強背書。年增率<-P%(訂單衰退):顯示預接訂單能力大幅衰退,或客戶開始抽單、遞延下單。若股價仍在歷史高檔,為強烈的長線基本面避險/放空訊號。 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `operator` | `<`、`>` | `'>'` | | `threshold` | `15`、`30`、`40` | `0` | ```python api.Block.con_tw('最近一季合約負債佔股本年增率<>P%') ``` ### 合約負債季增率<>P% - `id`: `f82` - 邏輯:`合約負債季增率${O}${P}%` - 說明:當一檔股票的最新一季合約負債季增率遠超預期,通常代表公司在過去這三個月內,突然拿到了指標性客戶的「大筆急單」或是「決定性的巨額合約」 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `operator` | `<`、`>` | `'>'` | | `percent` | `15`、`30`、`50`、`70`、`100` | `30` | ```python api.Block.con_tw('合約負債季增率<>P%') ``` ### 合約負債佔股本比<>P% - `id`: `f83` - 邏輯:`合約負債佔股本比${O}${P}%` - 說明:佔比>P%(高純度訂單滿載):例如佔比高達50%或100%。代表公司手上已經收到的訂金規模,幾乎快等同於整家公司的資本規模。這種『小本經營、大接爆單』的結構,未來全數轉換為營收時,將創造極度驚人的每股盈餘大躍進。佔比` | `'>'` | | `percent` | `30`、`50`、`70`、`100` | `50` | ```python api.Block.con_tw('合約負債佔股本比<>P%') ``` ### 合約負債佔近12個月營收比<>P% - `id`: `f84` - 邏輯:`合約負債佔近12個月營收比${O}${P}%` - 說明:本策略將個股最新一季財報的『合約負債』,除以該公司過去12個月營收總額,計算出比例。佔比>P%(高能見度/業績無虞):代表公司目前手上的『預收訂單』,已經足夠涵蓋未來好幾個月甚至大半年的既有業績。在景氣下行時,這類公司具備極強的抗跌防護罩,因為就算明天開始完全接不到新單,光靠消耗合約負債就足以支撐大半年的營收不墜。佔比` | `'>'` | | `percent` | `10`、`20`、`30`、`40`、`50`、`80`、`100` | `30` | ```python api.Block.con_tw('合約負債佔近12個月營收比<>P%') ``` --- ## 回檔修正(2 個) ### 突破近D日新高後,已回檔修正超過P% - `id`: `o31` - 邏輯:`突破近${D}日新高後,回檔修正已超過${P}%` - 說明:當股價突破近期高點後,隨即出現超過P%的拉回,這通常意味著市場在強勁上漲後進行獲利了結或技術性修正。此時,投資人會密切關注股價是否能在前高附近找到支撐,以確認這是一個健康的「回踩」動作,為下一波漲勢積蓄動能,或是突破動能不足的「假突破」訊號。 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `period` | `1`、`5`、`10`、`20`、`60`、`120`、`240` | `20` | | `percent` | `5`、`10`、`15`、`20`、`30` | `5` | ```python api.Block.con_tw('突破近D日新高後,已回檔修正超過P%') ``` ### 突破近D日新高後,已回檔修正不超過P% - `id`: `o33` - 邏輯:`突破近${D}日新高後,已回檔修正不超過${P}%` - 說明:當股價成功突破近期高點後,通常代表市場買盤強勁,趨勢向上確立。隨後的P%拉回,則可視為市場在消化獲利賣壓,或是對原突破點進行回測,這是一個健康的整理過程,為下一波漲勢積蓄動能,也提供投資人逢低佈局的機會。 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `period` | `1`、`5`、`10`、`20`、`60`、`120`、`240` | `20` | | `percent` | `5`、`10`、`15`、`20`、`30` | `5` | ```python api.Block.con_tw('突破近D日新高後,已回檔修正不超過P%') ``` --- ## 布林通道(13 個) ### 今日K棒(今日收盤價)突破布林上中下軌 - `id`: `t53` - 邏輯:`今日收盤價突破布林${A}軌` - 說明:「今日K棒突破布林上中下軌」意味著股價出現了顯著的波動,並脫離了布林通道的常態區間。當K棒向上突破上軌時,通常預示著強勁的買盤動能,股價可能進入加速上漲階段;而若K棒向下突破下軌,則暗示賣壓沉重,股價可能加速下跌。這兩種情況都代表市場波動性增強,值得投資人密切關注。 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `dataType` | `top`(上)、`middle`(中)、`bottom`(下) | `'top'` | ```python api.Block.con_tw('今日K棒(今日收盤價)突破布林上中下軌') ``` ### 今日K棒(今日收盤價)跌破布林上中下軌 - `id`: `t54` - 邏輯:`今日收盤價跌破布林${A}軌` - 說明:今日K棒跌破布林通道的上、中、下軌,這是一個極為罕見且劇烈的訊號,代表股價在一天之內經歷了從高點到低點的巨大波動,並穿透了整個布林通道的範圍。這通常意味著市場出現了異常強勁的賣壓,預示著趨勢可能發生劇烈反轉或加速下行,同時也可能使股價進入超賣區,值得投資人密切關注。 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `dataType` | `top`(上)、`middle`(中)、`bottom`(下) | `'top'` | ```python api.Block.con_tw('今日K棒(今日收盤價)跌破布林上中下軌') ``` ### 今日K棒<>上中下軌<>P% - `id`: `t55` - 邏輯:`今日K棒${operator}${dataType}軌${percent}%` - 說明:這個技術條件是觀察今日K棒相對於布林通道(上中下軌)的相對位置,並以P%來量化其偏離程度。它主要用於判斷股價在當前波動區間內的相對強弱,例如當K棒靠近或突破上軌,且偏離程度達到P%時,可能暗示股價短期過熱;反之,若靠近或跌破下軌,則可能代表股價短期超跌,有機會出現反彈。 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `operator` | `>`、`<` | `'>'` | | `dataType` | `top`(上)、`middle`(中)、`bottom`(下) | `'top'` | | `percent` | `1`、`2`、`3`、`4`、`5` | `1` | ```python api.Block.con_tw('今日K棒<>上中下軌<>P%') ``` ### 今日布林通道帶寬<>P% - `id`: `t56` - 邏輯:`今日布林通道帶寬${operator}${percent}%` - 說明:「布林通道帶寬」衡量的是布林通道上下軌之間的距離,它反映了股價波動的劇烈程度。當帶寬數值較高時,表示市場波動劇烈,股價可能處於強勢趨勢中或經歷大幅震盪;而當帶寬數值較低時,則代表股價波動趨於平緩,市場可能正在盤整,這通常預示著未來可能會有較大的方向性突破。 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `operator` | `>`、`<` | `'>'` | | `percent` | `10`、`20`、`30`、`40` | `20` | ```python api.Block.con_tw('今日布林通道帶寬<>P%') ``` ### 今日布林軌道發散股 - `id`: `t57` - 邏輯:`今日布林軌道發散股,連續${period}日` - 說明:「布林軌道發散」指的是布林通道(Bollinger Bands)的上下軌道向外擴張,這代表市場的波動性顯著增加。 這種情況通常預示著股價可能正在形成或延續一個強勁的趨勢,無論是上漲或下跌,都暗示著市場動能的增強。 對於交易者而言,這是一個捕捉趨勢啟動或延續的潛在機會。 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `period` | `2`、`3`、`4`、`5` | `3` | ```python api.Block.con_tw('今日布林軌道發散股') ``` ### 今日布林軌道壓縮股 - `id`: `t58` - 邏輯:`今日布林軌道壓縮股,連續${period}日` - 說明:「布林軌道壓縮股」指的是股價經過一段時間的盤整,導致布林通道的上下軌道逐漸收窄,這代表市場波動性降低,多空雙方力量趨於平衡,猶如彈簧被壓縮。 這種現象通常預示著股價即將脫離盤整區,醞釀一波較大的方向性變動,可能是向上突破或向下破底。 雖然壓縮本身不指示方向,但它提醒投資人需密切關注,等待股價帶量突破上下軌道,以確認未來的趨勢方向。 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `period` | `2`、`3`、`4`、`5` | `3` | ```python api.Block.con_tw('今日布林軌道壓縮股') ``` ### 今周(今周收盤價)K棒突破布林上中下軌 - `id`: `t59` - 邏輯:`今周收盤價K棒突破布林${A}軌` - 說明:「今周K棒突破布林上中下軌」這個技術條件,意味著股價在本週出現了極為強勁的單邊走勢,其波動幅度已大到足以穿越布林通道所定義的常態波動區間。這通常代表市場情緒正處於極度亢奮或恐慌的狀態,預示著股價可能即將進入一個新的趨勢階段,投資人應密切觀察後續動能的延續性與方向。 布林通道(Bollinger Bands)是由三條軌道線組成的帶狀通道,中軌為股價的移動平均線,而上軌和下軌則分別是中軌加上或減去一定倍數的標準差,用來衡量股價的波動範圍和趨勢強弱。當股價K棒突破布林通道的上下軌時,通常被視為市場波動性增加,可能預示著新趨勢的開始或原有趨勢的加速。 這種「突破」現象,特別是週K棒的突破,暗示著市場力量(買方或賣方)的極度強勢,使得股價脫離了常態的波動區間。例如,若K棒向上突破上軌,可能代表強勁的買盤推動股價進入超買區域,預示著強勢上漲趨勢的延續;反之,若向下突破下軌,則可能代表強勁的賣壓導致股價進入超賣區域,預示著下跌趨勢的加速。投資者此時應結合其他技術指標(如成交量、MACD等)來確認突破的有效性,並判斷趨勢是否能持續,以避免假突破的風險. | 參數 | 合法值 | 預設值 | |------|--------|--------| | `dataType` | `top`(上)、`middle`(中)、`bottom`(下) | `'top'` | ```python api.Block.con_tw('今周(今周收盤價)K棒突破布林上中下軌') ``` ### 今周K棒(今周收盤價)跌破布林上中下軌 - `id`: `t60` - 邏輯:`今周收盤價跌破布林${A}軌` - 說明:「今周K棒跌破布林上中下軌」這個技術條件,通常意味著股價在本週出現了極為強勁的下跌動能。這不僅代表股價已跌破布林帶的中軌,顯示趨勢可能轉弱,更進一步下穿了下軌,暗示市場已進入極度超賣區間,賣壓沉重。這種走勢預示著一個強勢的空頭趨勢正在形成或加速,投資人應密切關注後續的止跌訊號。 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `dataType` | `top`(上)、`middle`(中)、`bottom`(下) | `'top'` | ```python api.Block.con_tw('今周K棒(今周收盤價)跌破布林上中下軌') ``` ### 今周K棒<>上中下軌<>P% - `id`: `t61` - 邏輯:`今周K棒${operator}${dataType}軌${percent}%` - 說明:「今周K棒<>上中下軌<>P%」這個條件,主要在觀察本週股價的K線與布林通道(Bollinger Bands)上下軌的相對位置及偏離程度。當K線觸及或突破布林通道的上下軌,並伴隨P%的偏離時,這通常被視為股價波動性擴大或趨勢加速的訊號,可能預示著市場進入超買或超賣狀態,值得留意潛在的趨勢轉折或延續。 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `operator` | `>`、`<` | `'>'` | | `dataType` | `top`(上)、`middle`(中)、`bottom`(下) | `'top'` | | `percent` | `1`、`2`、`3`、`4`、`5` | `1` | ```python api.Block.con_tw('今周K棒<>上中下軌<>P%') ``` ### 今周布林通道帶寬<>P% - `id`: `t62` - 邏輯:`今周布林通道帶寬${operator}${percent}%` - 說明:今周4倍標準差<>P% 布林通道帶寬(Bollinger Band Width)是用來衡量股價波動性的一個指標。當今週布林通道帶寬大於P%時,表示市場波動劇烈,股價可能處於強勁的趨勢行情中,無論是上漲或下跌,都值得密切關注其動能延續性。反之,若帶寬小於P%,則代表市場波動性低,股價可能正處於盤整或醞釀突破的階段。 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `operator` | `>`、`<` | `'>'` | | `percent` | `10`、`20`、`30`、`40` | `20` | ```python api.Block.con_tw('今周布林通道帶寬<>P%') ``` ### 今周布林軌道發散股 - `id`: `t63` - 邏輯:`今周布林軌道發散股,連續${period}周` - 說明:「今周布林軌道發散股」指的是該股票的布林通道(Bollinger Bands)在本週出現擴張的現象。布林通道由三條線組成:中軌(通常是20日移動平均線)、上軌和下軌,其中上軌和下軌是根據股價的標準差計算而來,反映了市場的波動性。 當布林通道發散時,表示上軌和下軌之間的距離正在擴大,這通常意味著市場波動性顯著增加,股價可能正在形成一個新的趨勢,無論是上漲或下跌,都預示著股價將有較大的變動空間。 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `period` | `2`、`3`、`4`、`5` | `3` | ```python api.Block.con_tw('今周布林軌道發散股') ``` ### 今周布林軌道壓縮股 - `id`: `t64` - 邏輯:`今周布林軌道壓縮股,連續${D}周` - 說明:「今周布林軌道壓縮股」指的是那些股價波動幅度在近期(本週)顯著收窄,導致布林通道(Bollinger Bands)上下軌道線距離大幅縮小的股票。這種「壓縮」現象通常預示著市場波動性已降至低點,股價正在醞釀一波新的趨勢行情,可能是向上突破或向下破底。 投資人會密切關注這類股票,因為它暗示著在經歷一段盤整後,股價即將迎來一次較大的方向性變動。 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `period` | `2`、`3`、`4`、`5` | `3` | ```python api.Block.con_tw('今周布林軌道壓縮股') ``` ### 布林通道距突(跌)破上中下軌M百萬 - `id`: `v15` - 邏輯:`今日開盤成交金額>${M}百萬` - 說明:今日開盤成交金額大於M百萬,這代表市場在開盤初期就展現出高度的交易熱情與資金動能。通常,這暗示著市場對該標的或整體大盤有著強烈的關注,可能是受到重大消息面影響,或是主力資金積極進場佈局的訊號,預示著當日股價可能會有較大的波動或趨勢發展。 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `threshold` | `1`、`2`、`5`、`10`、`20` | `10` | ```python api.Block.con_tw('今日開盤成交金額>M百萬') ``` ### 今日(周月)成交金額佔今日(周月)大盤總成交金額>P% - `id`: `v24` - 邏輯:`今日(周月)成交金額佔今日(周月)大盤總成交金額>${P}%` - 說明:這個技術條件顯示,在特定時間週期內(日、週或月),該檔個股的成交金額佔大盤總成交金額的比例顯著提升。這意味著市場資金正高度聚焦於此檔股票,通常暗示著有主力或法人機構的積極參與,並可能預示著股價即將迎來較大的波動或趨勢轉折。 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `threshold` | `1`、`3`、`5`、`10` | `1` | ```python api.Block.con_tw('今日(周月)成交金額佔今日(周月)大盤總成交金額>P%') ``` ### 日成交金額<>M億 - `id`: `v3` - 邏輯:`日成交金額${O}${M}億` - 說明:「日成交金額<>M億」這個條件,指的是我們在觀察股票每日的交易總金額是否達到或偏離某個特定的 M 億元門檻。這通常是用來評估市場對該股票的關注度與流動性,例如:成交金額顯著放大(遠超 M 億)可能代表市場熱度高漲或有主力進出,而成交金額萎縮(遠低於 M 億)則可能暗示籌碼沉澱或市場觀望氣氛濃厚。 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `operator` | `>`、`<` | `'>'` | | `threshold` | `1`、`20`、`50`、`100`、`500` | `10` | ```python api.Block.con_tw('日成交金額<>M億') ``` ### 周(月)成交金額<>M億 - `id`: `v3x` - 邏輯:`周(月)成交金額${O}${M}億` - 說明:「成交金額」指的是一檔股票在過去一週內的總交易價值,它是衡量市場對該股票關注度與資金流動性的關鍵指標。當週成交金額達到M億這個特定門檻時,通常代表市場交投熱絡,有大量資金進出,這可能預示著股價即將出現較大的波動或趨勢轉變。 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `operator` | `>`、`<` | `'>'` | | `threshold` | `100`、`500`、`1000`、`2000` | `100` | ```python api.Block.con_tw('周(月)成交金額<>M億') ``` --- ## 振幅(1 個) ### 近D日區間振幅<>P% - `id`: `o21` - 邏輯:`近${D}日區間振幅<>${P}%` - 說明:「近D日區間振幅」指的是在過去D個交易日內,股價最高點與最低點之間的波動幅度,用以衡量股票在特定期間內的活躍程度與波動風險。當振幅較大時,通常代表市場交投熱絡,股價波動劇烈,可能預示著趨勢的形成或反轉;反之,若振幅較小,則可能意味著股價處於盤整階段,市場正在積蓄能量,等待方向的選擇。 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `period` | `5`、`10`、`20`、`60`、`120`、`240` | `20` | | `percent` | `5`、`10`、`15`、`20` | `20` | | `operator` | `<`、`>` | `'>'` | ```python api.Block.con_tw('近D日區間振幅<>P%') ``` --- ## 排行榜(17 個) ### 日漲跌幅排行前N名 - `id`: `r1` - 邏輯:`日漲跌幅排行前${N}名` - 說明:「日漲跌幅排行」是市場上最直接反映當日股價變動強弱的指標,它列出了當天漲幅最大和跌幅最大的股票。透過觀察這個排行,投資人可以迅速掌握市場熱點、資金流向以及哪些個股受到重大消息或事件的影響,進而評估潛在的交易機會或風險。 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `top_n` | `5`、`10`、`100`、`150`、`200`、`500`、`1000` | `50` | | `direction` | `>`(漲)、`<`(跌) | `''` | ```python api.Block.con_tw('日漲跌幅排行前N名') ``` ### 成交量增排行前N名 - `id`: `r10` - 邏輯:`成交量增排行前${N}名` - 說明:「成交量增排行榜」顯示的是市場上交易活動顯著增加的股票。這通常意味著這些股票正受到投資者的高度關注,可能是因為有新的資訊、消息或基本面變化,進而引發了大量的買賣行為。成交量的放大,往往預示著股價可能即將出現較大的波動,是判斷市場熱度與潛在趨勢轉變的重要指標。 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `top_n` | `5`、`10`、`100`、`150`、`200`、`500`、`1000` | `50` | ```python api.Block.con_tw('成交量增排行前N名') ``` ### 股價淨值比排行前N名 - `id`: `r11` - 邏輯:`股價淨值比排行前${N}名` - 說明:「股價淨值比排行榜」是一種將股票依照其股價淨值比(P/B Ratio)由低到高或由高到低排列的工具。股價淨值比是衡量公司股價相對於其每股淨值(即公司總資產減去總負債後,再除以流通股數)的比例,反映了市場願意為公司每單位淨資產支付的價格。 這個排行榜常用於價值投資策略,投資者藉此尋找股價可能被低估的股票,特別是那些股價淨值比低於1的公司,這可能意味著市場低估了其資產價值,或是公司股價低於其帳面價值。然而,單純的低股價淨值比並不保證是好的投資,仍需結合公司前景、行業趨勢及其他財務指標(如本益比、股東權益報酬率)進行全面評估.。 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `top_n` | `5`、`10`、`100`、`150`、`200`、`500`、`1000` | `50` | ```python api.Block.con_tw('股價淨值比排行前N名') ``` ### 股價創N日新高 - `id`: `r12` - 邏輯:`股價創 ${period} 日新高` - 說明:股價創N日內最高價,今日收盤價>=近D日內最高價 當股價創下N日新高時,這代表在過去N個交易日內,該股票的收盤價或盤中價達到了最高點。這通常被視為一個強烈的多頭訊號,顯示市場對該股票的買盤力道強勁,股價具有向上突破的動能,可能預示著一波新的上漲趨勢即將展開。 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `period` | `1`、`5`、`10`、`20`、`60`、`120`、`240` | `20` | ```python api.Block.con_tw('股價創N日新高') ``` ### 借券賣出排行前N名 - `id`: `r13` - 邏輯:`借券賣出排行前${N}名` - 說明:「借券賣出排行」顯示了市場上被大量借出並賣出的股票,這通常反映了投資人對這些股票未來走勢的看空情緒。當借券賣出餘額或交易量持續增加時,可能預示著股價面臨較大的下跌壓力,但也可能在特定情況下,成為未來軋空行情的潛在燃料。 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `top_n` | `5`、`10`、`100`、`150`、`200`、`500`、`1000` | `50` | ```python api.Block.con_tw('借券賣出排行前N名') ``` ### 借券賣出餘額排行前N名 - `id`: `r14` - 邏輯:`借券賣出餘額排行前${N}名` - 說明:「借券賣出餘額排行」揭示了市場上被借出並賣出但尚未回補的股票數量,排名越靠前,代表該股票的空方力量或看跌情緒越重。然而,這項數據也具有雙面性,高額的借券賣出餘額可能預示著一旦股價反轉上漲,便容易引發軋空行情,迫使空方回補,進而推升股價。 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `top_n` | `5`、`10`、`100`、`150`、`200`、`500`、`1000` | `50` | ```python api.Block.con_tw('借券賣出餘額排行前N名') ``` ### 券資比排行前N名 - `id`: `r15` - 邏輯:`券資比排行前${N}名` - 說明:券資比排行指的是將股票的「融券餘額」除以「融資餘額」後進行排序。這個指標可以幫助投資人觀察市場上對特定股票的看空與看多情緒的相對強度。當券資比越高,通常代表市場上看空該股票的投資人越多,但同時也可能預示著未來軋空行情的潛力。 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `top_n` | `5`、`10`、`100`、`150`、`200`、`500`、`1000` | `50` | ```python api.Block.con_tw('券資比排行前N名') ``` ### 近D日漲跌幅排行榜前N名 - `id`: `r16` - 邏輯:`近${D}日${A}幅排行前${N}名` - 說明:「漲跌幅排行榜」顧名思義,是列出在特定時間內股價上漲或下跌幅度最大的股票。漲幅排行榜不僅能快速揭示市場的熱點板塊和強勢個股,更是資金流向的重要指標,有助於投資人掌握當前市場的主流趨勢與潛力標的。跌幅排行榜通常反映了市場的恐慌情緒、突發利空消息,或是公司基本面出現重大惡化。對於投資人而言,它既可能是尋找「超跌反彈」機會的起點,也可能是警示應避開風險的訊號。 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `period` | `1`、`2`、`3`、`4`、`5`、`10`、`20`、`60`、`120`、`240` | `20` | | `direction` | `>`(漲)、`<`(跌) | `''` | | `top_n` | `5`、`10`、`30`、`50`、`100`、`150`、`200`、`500`、`1000` | `50` | ```python api.Block.con_tw('近D日漲跌幅排行榜前N名') ``` ### 月營收月增率排行前N名 - `id`: `r17` - 邏輯:`月營收月增率排行前${N}名` - 說明:月營收月增率排行,指的是比較公司當月營收與上個月營收的成長幅度,並將其進行排序。這項指標能快速篩選出短期營收動能強勁的企業,通常代表公司產品或服務需求旺盛,有助於判斷其近期營運表現是否正在加速。 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `top_n` | `50`、`100`、`150`、`200`、`500`、`1000` | `50` | ```python api.Block.con_tw('月營收月增率排行前N名') ``` ### 月營收年增率排行前N名 - `id`: `r18` - 邏輯:`月營收年增率排行前${N}名` - 說明:月營收年增率排行,指的是將公司每月公布的營收與去年同期營收進行比較,並依其成長幅度進行排序。這項指標能有效反映公司短期的營運成長動能與市場競爭力,是評估企業基本面是否持續改善的重要參考依據。高年增率通常代表公司產品或服務需求旺盛,有助於吸引投資人關注。 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `top_n` | `50`、`100`、`150`、`200`、`500`、`1000` | `50` | ```python api.Block.con_tw('月營收年增率排行前N名') ``` ### 市值排名前N名以上(下)公司 - `id`: `r19` - 邏輯:`市值排名前${N}名${A}公司` - 說明:市值排名「以上」(前段班): 通常是尋求權值股、穩定領息或長期配置。 市值排名「以下」(後段班): 若策略是挑選排名較後的公司,通常是在尋找中小型成長股,雖然風險較高,但潛在翻倍的爆發力也較大。 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `top_n` | `50`、`100`、`150`、`200`、`500`、`1000` | `50` | | `direction` | `以上`、`以下` | `'up'` | ```python api.Block.con_tw('市值排名前N名以上(下)公司') ``` ### 月漲跌幅排行前N名 - `id`: `r2` - 邏輯:`月漲跌幅排行前${N}名` - 說明:「月漲跌幅排行」是一種快速篩選工具,用來識別在過去一個月內股價表現最突出(上漲或下跌)的股票。透過這個排行,投資者可以迅速掌握市場熱點或潛在的超跌股,進而評估其動能是否延續,或是否存在反彈機會。這有助於執行動能追蹤策略,尋找強勢股;或是進行逆勢操作,挖掘被錯殺的價值股。 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `top_n` | `5`、`10`、`100`、`150`、`200`、`500`、`1000` | `50` | | `direction` | `>`(漲)、`<`(跌) | `''` | ```python api.Block.con_tw('月漲跌幅排行前N名') ``` ### 股本排名前N名以上(下)公司 - `id`: `r20` - 邏輯:`股本排名前${N}名以${O}公司` - 說明:本策略根據公司的股本(發行總股數)大小進行排序。選取股本最大(或最小)的前 N 名企業,旨在區分標的的『市場代表性』與『價格波動性』,藉此過濾出大型藍籌股或具備高彈性的中小型成長股。 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `top_n` | `50`、`100`、`150`、`200`、`500`、`1000` | `50` | | `direction` | `up`(上)、`down`(下) | `'up'` | ```python api.Block.con_tw('股本排名前N名以上(下)公司') ``` ### 股價排名前N名以上(下)公司 - `id`: `r21` - 邏輯:`股價排名前${N}名以${O}公司` - 說明:本策略根據市場股價的絕對價值進行排序,僅選取全市場中股價最高(或最低)的前 N 名企業作為交易池。其核心邏輯在於篩選出具備『高價值/高門檻』或『低價/高轉機』特性的標的。 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `top_n` | `50`、`100`、`150`、`200`、`500`、`1000` | `50` | | `direction` | `up`(上)、`down`(下) | `'up'` | ```python api.Block.con_tw('股價排名前N名以上(下)公司') ``` ### 近D日內外資(投信)買超佔股本比排行前N名 - `id`: `r25` - 邏輯:`近${D}日內${A}買超佔股本比排行前N名` - 說明:計算近 D 日內特定法人(外資或投信)的買超張數佔該公司股本的比例,並針對全市場進行排序,取其前 N 名。有別於設定絕對百分比,『排行』能動態適應大盤總體成交量的冷熱,精準鎖定當下市場資金『最優先、最集中』狙擊的核心標的。 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `period` | `1`、`2`、`3`、`4`、`5`、`10`、`20`、`60`、`120`、`240` | `20` | | `inst` | `外資`、`投信` | `'外資'` | | `top_n` | `30`、`50`、`100`、`150`、`200`、`500`、`1000` | `50` | ```python api.Block.con_tw('近D日內外資(投信)買超佔股本比排行前N名') ``` ### 近D日籌碼集中度排行前N名 - `id`: `r26` - 邏輯:`近D日籌碼集中度排行前${N}名` - 說明:本策略計算近 D 日內,個股『前 15 大買超券商的合計買超張數』與『前 15 大賣超券商的合計賣超張數』之差額,並除以該區間的『總成交量』,得出百分比(集中度),最後將全市場進行排序取前 N 名。此指標旨在抓出市場上『少數大戶在默默吃貨,而多數散戶在吐出籌碼』的極端鎖碼標的,排行越前,代表短線爆發動能越強。 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `top_n` | `30`、`50`、`100`、`150`、`200`、`500`、`1000` | `50` | | `period` | `1`、`2`、`3`、`4`、`5`、`10`、`20`、`60`、`120`、`240` | `20` | ```python api.Block.con_tw('近D日籌碼集中度排行前N名') ``` ### 近D日籌碼流出度排行前N名 - `id`: `r27` - 邏輯:`近D日籌碼流出度排行前${N}名` - 說明:本策略計算近 D 日內,個股『前 15 大賣超券商的合計賣超張數』與『前 15 大買超券商的合計買超張數』之差額(即淨流出量),並除以該區間的『總成交量』,得出百分比(流出度),最後將全市場進行排序取前 N 名。此指標旨在精準抓出市場上『極少數大戶在不計代價倒貨,而多數散戶在進場接刀』的籌碼極度渙散標的,常用於多頭避險或空頭選股。 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `top_n` | `30`、`50`、`100`、`150`、`200`、`500`、`1000` | `50` | | `period` | `1`、`2`、`3`、`4`、`5`、`10`、`20`、`60`、`120`、`240` | `20` | ```python api.Block.con_tw('近D日籌碼流出度排行前N名') ``` --- ## 換手量(1 個) ### 近D日成交量周轉率<>P% - `id`: `v2` - 邏輯:`近${D}日成交量周轉率${O}${P}%` - 說明:「近D日成交量周轉率<>P%」這個條件,是用來衡量股票在過去D個交易日內的換手頻率是否偏離了某個基準值P%。當周轉率顯著高於P%時,通常代表市場對該股的關注度與交易熱度急遽升高,資金進出頻繁,這可能預示著股價即將出現較大的波動;反之,若周轉率顯著低於P%,則可能意味著市場交投清淡,缺乏動能,股價多半處於盤整或等待方向的階段。 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `period` | `1`、`5`、`10`、`20`、`60` | `10` | | `operator` | `>`、`<` | `'>'` | | `threshold` | `20`、`30`、`40`、`50` | `50` | ```python api.Block.con_tw('近D日成交量周轉率<>P%') ``` --- ## 日均量(4 個) ### 短均日均量<>長均日均量 - `id`: `v1` - 邏輯:`${MA1}日均量${O}${MA2}日均量` - 說明:短均日均量與長均日均量的比較,反映了市場近期交易熱度與長期平均熱度的差異。當短均量大於長均量時,通常意味著近期市場交投活絡,可能是資金進駐或籌碼換手積極的訊號,預示著股價可能出現較大的波動。反之,若短均量小於長均量,則顯示市場觀望氣氛濃厚,交易清淡,股價可能處於盤整或缺乏動能的狀態。 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `period1` | `5`、`10`、`20` | `5` | | `operator` | `<`、`>` | `'>'` | | `period2` | `10`、`20`、`60`、`120`、`240` | `20` | ```python api.Block.con_tw('短均日均量<>長均日均量') ``` ### 近D日均量>V張 - `id`: `v10` - 邏輯:`近${D}日均量>${V}張` - 說明:這個條件表示在過去D個交易日中,該股票的平均成交量超過了V張。高於特定門檻的平均成交量,通常代表市場對這檔股票的關注度較高,流動性也相對較好。這有助於確保投資者在進出時,不會因為成交量不足而面臨買賣困難或價格大幅波動的風險。 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `period` | `1`、`5`、`10`、`20`、`60` | `20` | | `threshold` | `500`、`1000`、`2000`、`3000`、`5000`、`10000`、`20000` | `1000` | ```python api.Block.con_tw('近D日均量>V張') ``` ### 今日近D日均量<>前一日近D日均量 - `id`: `v11` - 邏輯:`今日近${D}日均量${O}前一日近${D}日均量` - 說明:這個條件是在觀察市場的活躍程度與資金動能的變化。當今日的近D日均量與前一日的近D日均量出現差異時,代表市場在過去D天內的平均交易熱度發生了轉變。 若均量顯著增加,通常暗示著市場參與者對該股票的關注度提升,無論是買盤或賣盤力道都可能增強;反之,若均量減少,則可能表示市場交投趨於清淡,動能有所減弱.。 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `operator` | `>`、`<` | `'>'` | | `period` | `1`、`5`、`10`、`20`、`60` | `5` | ```python api.Block.con_tw('今日近D日均量<>前一日近D日均量') ``` ### 近D日平均成交量<>V張 - `id`: `v37` - 邏輯:`近${D}日平均成交量${O}${V}張` - 說明:均量>V張:證明該標的具備『常態性的高流動性』,絕非大戶單日左手換右手做出來的假量。這是法人資金長期駐守、進出無礙的優質戰場。均量`、`<` | `'>'` | | `threshold` | `20000`、`50000`、`100000`、`200000` | `20000` | ```python api.Block.con_tw('近D日平均成交量<>V張') ``` --- ## 日成交量(5 個) ### 日成交量<>V張 - `id`: `v36` - 邏輯:`日成交量${O}${V}張` - 說明:大於V張:確保該標的具備足夠的『市場流動性』。代表市場參與者眾多,買賣報價連續,是主力法人資金進出的主戰場,能有效避免『買得到卻賣不掉』的流動性陷阱。小於V張:通常用於反向篩選。若用於大盤暴跌後的底部,可尋找『量縮窒息、籌碼沉澱』的潛伏期;若該股長期小於V張,則為缺乏人氣的『冷門股』,會有高滑價風險。 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `operator` | `>`、`<` | `'>'` | | `threshold` | `500`、`1000`、`2000`、`3000`、`5000`、`10000`、`20000` | `1000` | ```python api.Block.con_tw('日成交量<>V張') ``` ### 日成交量>V張 - `id`: `v4` - 邏輯:`日成交量 ${O} ${V} 張` - 說明:「日成交量大於V張」代表市場對該股票的關注度與參與度顯著提升,顯示其流動性充裕。這通常暗示著股價可能正醞釀或已進入較為活躍的階段,無論是趨勢的確認或反轉,都值得投資人密切觀察。 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `operator` | `>`、`<` | `'>'` | | `threshold` | `500`、`1000`、`2000`、`3000`、`5000`、`10000`、`20000` | `1000` | ```python api.Block.con_tw('日成交量>V張') ``` ### 周成交量<>V張 - `id`: `v4x` - 邏輯:`周成交量${O}${V}張` - 說明:「周成交量大於V張」代表該股票在過去一週的交易活動顯著放大,顯示市場對其關注度大幅提升,有大量資金正在進出。這通常預示著股價可能即將出現較大的波動,無論是趨勢的確立或反轉,都值得投資人密切留意。 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `operator` | `>`、`<` | `'>'` | | `threshold` | `20000`、`50000`、`100000`、`200000` | `20000` | ```python api.Block.con_tw('周成交量<>V張') ``` ### 日周月成交量創近D日新高(低) - `id`: `v7` - 邏輯:`${A}成交量創近${D}日新${B}` - 說明:當日成交量創下近D日新高時,這通常意味著市場對該股票的關注度顯著提升,無論是買方或賣方都展現出強烈的交易意願,這可能預示著股價即將出現較大的波動或趨勢的確認。反之,若成交量創下近D日新低,則表示市場交投清淡,投資人觀望氣氛濃厚,股價可能進入盤整階段,或是原有趨勢動能減弱的訊號。 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `table` | `日`、`周` | `'日_K'` | | `period` | `5`、`10`、`20`、`60`、`120`、`240` | `60` | | `metric` | `max`(高)、`min`(低) | `'max'` | ```python api.Block.con_tw('日周月成交量創近D日新高(低)') ``` ### 日(周)成交量漸增(減)連續3次 - `id`: `v8` - 邏輯:`${A}成交量漸${C}連續3次` - 說明:當日(或週)成交量連續三次呈現漸增趨勢時,這通常代表市場對該股票的關注度與參與度正在持續提升,無論股價是上漲或下跌,都顯示出動能的累積。反之,若成交量連續三次漸減,則可能意味著市場熱度正在降溫,多空雙方觀望氣氛濃厚,股價走勢可能進入盤整或趨勢反轉的前兆。 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `table` | `日`、`周` | `'日_K'` | | `operator` | `>`(增)、`<`(減) | `'>'` | ```python api.Block.con_tw('日(周)成交量漸增(減)連續3次') ``` --- ## 最低價(3 個) ### 今日收盤價(開高低)與近D日內最低價<-P% - `id`: `o12` - 邏輯:`今日${A}與近${D}日內最低價<-${P}%` - 說明:這個條件表示今日收盤價已跌破近D日內的最低點,並且跌幅超過P%。這是一個明確的破底訊號,通常意味著市場賣壓沉重,股價可能進入加速下跌的階段,投資人應審慎評估其潛在的下行風險。 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `close_field` | `adj_Open`(開盤價)、`adj_High`(最高價)、`adj_Low`(最低價)、`adj_Close`(收盤價) | `'adj_Close'` | | `period` | `5`、`10`、`20` | `5` | | `percent` | `3`、`5`、`8`、`10`、`15`、`20`(傳入正負皆輸出負值) | `-3` | ```python api.Block.con_tw('今日收盤價(開高低)與近D日內最低價<-P%') ``` ### 今日收盤(開高低)距歷史最低價<-P% - `id`: `o14` - 邏輯:`今日${A}距歷史最低價<-${P}%` - 說明:這項條件表示,該股票目前的價格(無論是收盤、開盤、最高或最低價)正處於極度低迷的狀態,距離其歷史最低價僅有不到 P% 的差距。這通常意味著市場對該股票的信心跌至谷底,股價已接近歷史性的底部區間。對於逆勢投資者而言,這可能是一個尋找「超跌」或「價值窪地」的機會,但同時也需警惕其背後可能存在的營運風險。 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `close_field` | `Open`(開盤價)、`High`(最高價)、`Low`(最低價)、`Close`(收盤價) | `'adj_Close'` | | `percent` | `5`、`10`、`15`、`20`(傳入正負皆輸出負值) | `-5` | ```python api.Block.con_tw('今日收盤(開高低)距歷史最低價<-P%') ``` ### 今日收盤(開高低)價<>昨日最低價 - `id`: `o38` - 邏輯:`今日${A}${O}昨日最低價` - 說明:「今日的股價區間,包括開盤、盤中高點、盤中低點及收盤價,皆高於昨日最低價」這個技術條件,意味著市場在今日展現了強勁的買盤承接力道,成功將股價推離並守穩在昨日的最低點之上。這通常被視為一個明確的止跌或反彈訊號,顯示空方力量已顯著減弱,多方開始掌握主導權,股價有機會進一步向上發展。 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `ohlc_field` | `adj_Open`(開盤價)、`adj_High`(最高價)、`adj_Low`(最低價)、`adj_Close`(收盤價) | `'adj_Close'` | | `operator` | `<`、`>` | `'<'` | ```python api.Block.con_tw('今日收盤(開高低)價<>昨日最低價') ``` --- ## 最高價(3 個) ### 今日收盤價(開低高)與近D日內最高價昨日最高價 - `id`: `o37` - 邏輯:`今日${A}${O}昨日最高價` - 說明:這個條件是在觀察今日股價的表現,特別是開盤、最高、最低或收盤價,與昨日最高價之間的關係。當今日股價能夠有效突破並站穩昨日最高價時,通常代表市場買盤強勁,股價可能正在形成突破走勢,顯示多頭力道增強。反之,若股價未能突破昨日高點,則可能意味著上方壓力沉重,短期內上漲動能受阻。 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `ohlc_field` | `adj_Open`(開盤價)、`adj_High`(最高價)、`adj_Low`(最低價)、`adj_Close`(收盤價) | `'adj_Close'` | | `operator` | `<`、`>` | `'>'` | ```python api.Block.con_tw('今日收盤(開高低)價<>昨日最高價') ``` --- ## 本益比(2 個) ### 近四季本益比<>N倍 - `id`: `f1` - 邏輯:`近四季本益比${O}${N}倍` - 說明:「近四季本益比」是將公司股價除以過去四個季度累計的每股盈餘,用以評估其估值水平,相較於單一季度更能反映公司長期且穩定的獲利能力。當設定「近四季本益比<>N倍」時,這表示投資者正在篩選本益比不等於特定數值N的股票,藉此判斷股價是否被市場低估或高估,以尋找潛在的投資機會。 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `operator` | `<`、`>` | `'<'` | | `multiple` | `10`、`15`、`20`、`25`、`30` | `10` | ```python api.Block.con_tw('近四季本益比<>N倍') ``` ### 本益成長比<>N倍 - `id`: `f2` - 邏輯:`本益成長比${O}${N}倍` - 說明:本益成長比 (PEG ratio) 是一個衡量股票估值的重要指標,它將本益比 (P/E ratio) 與公司的預期盈餘成長率結合起來。當本益成長比低於N倍時,通常暗示著該股票相對於其成長潛力可能被低估,是尋找「成長股中的價值股」的有效工具。反之,若高於N倍,則可能表示市場對其成長預期過於樂觀,股價存在高估的風險。 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `operator` | `>`、`<` | `'<'` | | `multiple` | `1`、`1.25`、`1.5` | `1` | ```python api.Block.con_tw('本益成長比<>N倍') ``` --- ## 每股盈餘EPS(12 個) ### 近一季EPS<>去年同一季EPS - `id`: `f26` - 邏輯:`近一季EPS${O}去年同一季EPS` - 說明:這個條件比較了公司最新一季的每股盈餘(EPS)與去年同期表現,主要目的是為了評估公司獲利能力的年成長或衰退狀況。透過與去年同期數據的比較,可以有效排除季節性因素的干擾,更精準地觀察公司營運體質的變化,判斷其獲利趨勢是持續成長、持平或正在惡化。 這項指標是評估公司基本面健康狀況的重要依據,其變化往往會直接影響市場對公司未來展望的預期與股價表現。 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `operator` | `>`(轉正)、`<`(轉負) | `'>'` | ```python api.Block.con_tw('近一季EPS<>去年同一季EPS') ``` ### 近四季EPS>M元 - `id`: `f29` - 邏輯:`近四季EPS${O}${M}元` - 說明:「近四季EPS > M元」這個條件,代表公司在過去一年的營運中,每股賺取的稅後淨利超過了M元。這是一個衡量公司獲利能力的重要指標,顯示公司具有穩定的盈利基礎和良好的經營績效。 這項條件通常被視為公司基本面穩健的訊號,因為持續且高於一定水準的每股盈餘,反映了公司為股東創造價值的能力,也可能預示著未來股價的成長潛力。 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `operator` | `>`、`<` | `'>'` | | `amount` | `0`、`1`、`2`、`3`、`5`、`10`、`20` | `1` | ```python api.Block.con_tw('近四季EPS>M元') ``` ### 累積每股盈餘(EPS)>M元 - `id`: `f30` - 邏輯:`累積每股盈餘(EPS)${O}${M}元` - 說明:當累積每股盈餘(EPS)超過M元時,這代表公司在特定期間內,為每一股股票所賺取的利潤表現優異,顯示其獲利能力強勁且財務狀況穩健。這通常被視為公司基本面良好的重要指標,有助於評估其內在價值與未來成長潛力。 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `operator` | `>`、`<` | `'>'` | | `amount` | `0`、`1`、`2`、`3`、`5`、`10`、`20` | `1` | ```python api.Block.con_tw('累積每股盈餘(EPS)>M元') ``` ### 單季每股盈餘(EPS)>M元 - `id`: `f31` - 邏輯:`單季每股盈餘(EPS)${O}${M}元` - 說明:單季每股盈餘(EPS)大於M元,代表公司在最近一個季度內,為每一股流通在外的股票賺取了M元以上的利潤。這是一個衡量公司短期獲利能力的重要指標,顯示公司在該季度營運表現強勁,能為股東創造可觀的收益。 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `operator` | `>`、`<` | `'>'` | | `amount` | `0`、`1`、`2`、`3`、`5`、`10` | `1` | ```python api.Block.con_tw('單季每股盈餘(EPS)>M元') ``` ### 全年EPS>M元 - `id`: `f32` - 邏輯:`全年EPS${O}${M}元` - 說明:當我們說「全年EPS > M元」時,這代表著公司在過去一整年的營運中,為每一股股票賺取了超過M元的利潤。這是一個衡量公司獲利能力和財務健康狀況的關鍵指標,通常被視為公司基本面穩健的重要訊號。投資人會關注這個條件,因為持續且高於一定水準的每股盈餘,往往預示著公司具有良好的經營績效,並可能為股東帶來股息或股價成長的潛力。 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `operator` | `>`、`<` | `'>'` | | `amount` | `0`、`1`、`2`、`3`、`5`、`10`、`20` | `1` | ```python api.Block.con_tw('全年EPS>M元') ``` ### 近Y年全年EPS平均>M元 - `id`: `f33` - 邏輯:`近${Y}年全年EPS平均>${M}元` - 說明:這個條件著重於公司過去Y年的獲利能力,要求其每股盈餘(EPS)在長期平均上能維持在M元以上。這代表公司在過去一段時間內,展現出穩定且良好的營運績效,能夠持續為股東創造價值。對於投資人而言,這是一個評估公司基本面健康與否的重要指標,顯示其具備穩定的獲利基礎,有助於降低投資風險,並可能預示著未來股價的支撐或成長潛力。 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `period` | `3`、`5`、`8`、`10` | `3` | | `amount` | `1`、`2`、`3`、`5`、`10`、`20` | `1` | ```python api.Block.con_tw('近Y年全年EPS平均>M元') ``` ### 近四季/單季/全年EPS較前期成長(衰退)<>P% - `id`: `f34` - 邏輯:`${T}EPS較前期${A}${P}%` - 說明:這個條件著重於評估公司在不同時間週期(單季、近四季或全年)的每股盈餘(EPS)變化,以判斷其獲利能力的動態。當EPS較前期成長P%時,通常代表公司營運表現強勁,獲利能力持續提升,是股價上漲的重要基本面驅動力;反之,若EPS衰退P%,則可能預示公司營運面臨挑戰,投資人應審慎評估其對股價的潛在影響。 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `eps_type` | `1`(最近一季)、`2`(近四季)、`3`(全年) | `'1'` | | `operator` | `>`(成長)、`<`(衰退) | `'>'` | | `percent` | `-30`、`-20`、`-10`、`0`、`10`、`20`、`30`、`50` | `0` | ```python api.Block.con_tw('近四季/單季/全年EPS較前期成長(衰退)<>P%') ``` ### 近四季/單季/全年EPS較前期由負翻正 - `id`: `f35` - 邏輯:`${T}EPS較前期由${O}` - 說明:當一家公司的每股盈餘(EPS)從虧損轉為獲利,無論是單季、近四季或全年,都代表其營運體質出現了顯著的改善。這通常意味著公司成功扭轉了虧損局面,進入了獲利階段,顯示其經營策略奏效或市場環境轉好,對投資人而言是一個重要的基本面轉折訊號。 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `eps_type` | `1`(最近一季)、`2`(近四季)、`3`(全年) | `'1'` | | `operator` | `>`(負翻正)、`<`(正翻負) | `'>'` | ```python api.Block.con_tw('近四季/單季/全年EPS較前期由負翻正') ``` ### 近四季/單季/全年EPS較前期由正翻負 - `id`: `f36` - 邏輯:`近${T}EPS較前期由${O}` - 說明:當一家公司的每股盈餘(EPS)從正值轉為負值時,這代表該公司在特定期間(無論是單季、近四季或全年)由獲利轉為虧損,顯示其營運狀況出現顯著惡化。這種情況通常會對市場信心造成打擊,並可能預示著公司基本面面臨嚴峻挑戰,投資人應深入探究虧損原因,評估其是暫時性還是結構性的問題。 每股盈餘(EPS)是衡量公司獲利能力的重要指標,EPS越高代表公司為股東賺錢的能力越強。因此,EPS由正轉負意味著公司從賺錢變成虧損,這通常會對股價產生負面影響。投資人需要進一步分析造成虧損的原因,例如是來自於本業營運不佳、一次性業外損失,或是產業環境的變化等。雖然EPS由負轉正可能帶來超額報酬的機會,但由正轉負則需警惕其潛在風險. | 參數 | 合法值 | 預設值 | |------|--------|--------| | `eps_type` | `1`(最近一季)、`2`(近四季)、`3`(全年) | `'1'` | | `operator` | `>`(翻正)、`<`(轉負) | `'<'` | ```python api.Block.con_tw('近四季/單季/全年EPS較前期由正翻負') ``` ### 最近N季至少有S季EPS<>M元 - `id`: `f68` - 邏輯:`最近${N}季至少有${S}季EPS${O}${M}元` - 說明:此條件是計算本益比與股價合理估值的最直接依據。當設定大於(>M 元),代表公司具備穩定且每季能幫每股股本賺取固定利潤的實力,可協助初學者迅速過濾掉處於虧損或獲利大幅波動的投機標的。 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `n` | `4`、`8`、`12`、`20`、`40` | `4` | | `s` | `2`、`3`、`4`、`6`、`9`、`12`、`16`、`20`、`32` | `2` | | `operator` | `>`、`<` | `'>'` | | `amount` | `0`、`1`、`2`、`3`、`5`、`10`、`15` | `1` | ```python api.Block.con_tw('最近N季至少有S季EPS<>M元') ``` ### 近Y季(年)EPS皆<>M元 - `id`: `f78` - 邏輯:`近${Y}${A}EPS皆${O}${M}元` - 說明:篩選出過去連續Y季或年,其每股盈餘(EPS)皆大於或小於M元的企業。當設定為大於M元時,旨在尋找獲利能力極度穩定、能夠穿越景氣牛熊循環的『長線績優股』與『金雞母』,是價值投資與存股策略最核心的防禦型底盤。 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `y` | `3`、`4`、`5`、`8`、`10` | `4` | | `unit` | `季`、`年` | `'季'` | | `operator` | `<`、`>` | `'>'` | | `amount` | `0`、`1`、`2`、`3`、`5`、`10`、`20` | `1` | ```python api.Block.con_tw('近Y季(年)EPS皆<>M元') ``` ### 預估今年全年EPS<>M元 - `id`: `f79` - 邏輯:`預估今年全年EPS${O}${M}元` - 說明:依據財務年化模型,篩選出『預估今年全年每股盈餘(Forward EPS)』大於或小於 M 元的企業。股市反映的是未來預期,本指標旨在提前鎖定今年度具備獲利爆發力、轉虧為盈,或盈餘成長明確的潛力標的,是計算『預估本益比』以發掘低估黑馬的核心參數。 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `operator` | `<`、`>` | `'>'` | | `amount` | `0`、`1`、`2`、`3`、`5`、`10`、`20` | `1` | ```python api.Block.con_tw('預估今年全年EPS<>M元') ``` --- ## 漲跌停(3 個) ### 連續近D日皆漲停 - `id`: `o24` - 邏輯:`連續近${D}日皆漲停` - 說明:當一檔股票連續多日都達到漲停板,這通常意味著市場對該股票有著極度強烈的買盤追捧,可能是因為重大利好消息、基本面出現顯著改善,或是市場資金高度集中於此。這種現象顯示出股價在短期內呈現爆發性的上漲動能,但同時也伴隨著較高的波動性和潛在風險。 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `period` | `2`、`3`、`5` | `2` | ```python api.Block.con_tw('連續近D日皆漲停') ``` ### 連續近D日皆跌停 - `id`: `o25` - 邏輯:`連續近${D}日皆跌停` - 說明:當一檔股票連續多日觸及跌停板,這代表市場上存在極度恐慌的賣壓,且幾乎沒有買盤願意進場承接,導致股價在每日允許的最低價位被鎖死。這種情況通常暗示公司基本面可能出現重大負面變化,或是市場對其未來展望抱持極度悲觀的態度,投資人正進行恐慌性拋售。 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `period` | `2`、`3`、`5` | `2` | ```python api.Block.con_tw('連續近D日皆跌停') ``` ### 連續漲跌停3天 - `id`: `o4` - 邏輯:`連續${A}停3天` - 說明:「連續漲跌停三天」指的是股價在三個交易日內,每日都觸及了漲幅或跌幅的上限。這種極端的價格行為,無論是連續漲停或跌停,都強烈暗示著市場對該股票存在著高度一致且極端的情緒,通常伴隨著重大的基本面變化或市場消息。它反映了買賣雙方力量的嚴重失衡,預示著短期內股價將維持強勁的單邊趨勢,但同時也需警惕過度反應後可能出現的修正或反轉。 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `operator` | `<`、`>` | `'>'` | ```python api.Block.con_tw('連續漲跌停3天') ``` --- ## 漲跌幅(13 個) ### 今日收盤價<>開高低P% - `id`: `o1` - 邏輯:`今日收盤價${O}今日${A}${P}%` - 說明:這個技術條件表示當日收盤價相對於開盤價或當日交易區間(高點至低點)呈現顯著的強勢。它意味著在交易時段內,買方力量持續主導,將股價推升至相對高位並維持至收盤。這通常被視為一個強烈的看漲訊號,預示著市場對該股票的積極情緒和潛在的進一步上漲動能。 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `operator` | `<`、`>` | `'>'` | | `close_field` | `adj_Open`(開盤價)、`adj_High`(最高價)、`adj_Low`(最低價) | `'Close'` | | `percent` | `1`、`2`、`3`、`5`、`7`、`9` | `15` | ```python api.Block.con_tw('今日收盤價<>開高低P%') ``` ### 今日收盤價距今日最低價 <>-P% - `id`: `o10` - 邏輯:`今日收盤價距今日最低價${O}-${P}%` - 說明:今日收盤價顯著高於盤中最低價,代表股價在盤中觸及低點後,出現了強勁的買盤支撐,將股價推升。這通常被視為多方力道轉強的訊號,顯示市場對該股的信心有所恢復,或是在低檔有承接買盤進場。 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `percent` | `3`、`5`、`7`、`9`(傳入正負皆輸出負值) | `-3` | ```python api.Block.con_tw('今日收盤價距今日最低價 <>-P%') ``` ### 近D日內漲幅>P% - `id`: `o19` - 邏輯:`近${D}日內漲幅>${P}%` - 說明:這個條件表示股價在近期D個交易日內出現了顯著的P%漲幅,這通常意味著市場對該股票的買盤力道強勁,並可能預示著股價進入了加速上漲的階段。它反映了短期的強勢動能,吸引了市場的關注,可能是趨勢啟動的訊號。 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `period` | `5`、`10`、`20`、`60`、`120`、`240` | `5` | | `percent` | `5`、`10`、`15`、`20` | `10` | ```python api.Block.con_tw('近D日內漲幅>P%') ``` ### 今日收盤價(開高低)<>昨天收盤價P% - `id`: `o2` - 邏輯:`今日${A}${O}昨天收盤價${P}%` - 說明:本策略將『今日收盤價』與『昨日收盤價』進行比對,計算出單日漲跌幅,並檢驗其是否大於或小於使用者設定的門檻P%。漲幅>P%:代表今日出現強勢的買盤點火。在台股,漲幅>5%通常會形成一根極具視覺張力的『實體長紅K棒』;若大於9.5%,則是觸發『漲停板』的極端鎖碼訊號。跌幅<-P%(如跌逾5%或跌停):代表市場出現恐慌性拋售或主力惡意砸盤,形成『實體長黑K棒』,為趨勢轉弱的絕對警訊。 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `field` | `收盤價`、`開盤價`、`最高價`、`最低價` | `'收盤價'` | | `operator` | `<`、`>` | `'>'` | | `percent` | `-9`、`-7`、`-5`、`-3`、`-2`、`-1`、`1`、`2`、`3`、`5`、`7`、`9` | `3` | ```python api.Block.con_tw('今日收盤價(開高低)<>昨天收盤價P%') ``` ### 近D日內跌幅>-P% - `id`: `o20` - 邏輯:`近${D}日內跌幅>-${P}%` - 說明:這項技術條件指出,在過去D個交易日內,該檔股票的跌幅並未超過P%。這代表其股價表現相對穩健,市場賣壓有限,可能正處於築底或橫向盤整的階段,顯示出較強的抗跌性。 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `period` | `5`、`10`、`20`、`60`、`120`、`240` | `5` | | `percent` | `5`、`10`、`15`、`20`(傳入正負皆輸出負值) | `-10` | ```python api.Block.con_tw('近D日內跌幅>-P%') ``` ### 連續D日皆漲,且累積幅度>P% - `id`: `o22` - 邏輯:`連續${D}日皆漲,且累積幅度>${P}%` - 說明:「連續D日皆漲,且累積幅度>P%」代表該股票在短時間內展現出強勁的上升動能,市場買盤持續積極。這種現象通常預示著股價可能正處於突破階段,或是新的上升趨勢正在形成,值得投資人密切關注其後續發展。 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `period` | `5`、`10`、`20`、`60`、`120`、`240` | `3` | | `percent` | `10`、`15`、`20`、`30`、`40`、`50`、`100` | `10` | ```python api.Block.con_tw('連續D日皆漲,且累積幅度>P%') ``` ### 連續D日皆跌,且累積幅度>-P% - `id`: `o23` - 邏輯:`連續${D}日皆跌,且累積幅度>-${P}%` - 說明:這個條件描述的是一檔股票在連續數個交易日中呈現下跌走勢,但其累積跌幅並未達到極端程度。這通常意味著市場情緒雖然偏空,但並未出現恐慌性拋售,股價可能正在經歷溫和的修正或築底過程,而非失控的崩跌。 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `period` | `5`、`10`、`20`、`60`、`120`、`240` | `3` | | `percent` | `10`、`15`、`20`、`30`、`40`、`50`、`100`(傳入正負皆輸出負值) | `-10` | ```python api.Block.con_tw('連續D日皆跌,且累積幅度>-P%') ``` ### 近D日個股漲跌幅與大盤漲跌幅<>P% - `id`: `o26` - 邏輯:`近${D}日個股漲跌幅與大盤漲跌幅${O}${P}%` - 說明:這個技術條件著重於評估個股在特定期間(D日)內相對於整體市場(大盤)的表現。當個股漲跌幅與大盤漲跌幅的差異超過P%時,它揭示了該股票的「相對強度」或「相對弱勢」。這種差異是判斷資金流向和市場偏好的重要指標,有助於投資者識別出領漲或領跌的標的,進而調整投資組合。 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `period` | `1`、`5`、`10`、`20`、`60`、`120`、`240` | `20` | | `percent` | `0`、`3`、`5`、`10`、`15`、`20`、`30`、`40`、`50` | `10` | ```python api.Block.con_tw('近D日個股漲跌幅與大盤漲跌幅<>P%') ``` ### 連續漲跌超過P%,且成交量>N張 - `id`: `o5` - 邏輯:`連續${A}${D}超過${P}%,且成交量>${V}張` - 說明:這個條件表示股價在短時間內出現了顯著的方向性變動,無論是上漲或下跌,都伴隨著大量的交易活動。這代表市場對該股票的看法趨於一致,顯示出強勁的買盤推升或恐慌性的賣壓出籠,且這些趨勢都得到了市場資金的強力支持,使其成為一個值得關注的動態。 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `operator` | `>`(漲)、`<`(跌) | `'>'` | | `times` | `2`、`3`、`4`、`5`、`7` | `3` | | `percent` | `10`、`15`、`20`、`30`、`50` | `9.5` | | `n` | `300`、`500`、`1000`、`2000`、`5000`、`10000`、`20000`、`50000` | `300` | ```python api.Block.con_tw('連續漲跌超過P%,且成交量>N張') ``` ### 最近一根分(日/周/月)收盤價<>前一根(開盤價/最高價/最低價/收盤價) - `id`: `o51` - 邏輯:`最近一根${A}收盤價<>前一根${B}` - 說明:透過相鄰週期的價位變動,識別趨勢的慣性改變(如突破前高或跌破前低),作為進場攻擊或出場避險的即時訊號。 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `period_type` | `日`、`周`、`月` | `'日'` | | `field` | `開盤價`、`最高價`、`最低價`、`收盤價` | `'最高價'` | ```python api.Block.con_tw('最近一根分(日/周/月)收盤價<>前一根(開盤價/最高價/最低價/收盤價)') ``` ### 漲跌幅介於P1%到P2%之間 - `id`: `o6` - 邏輯:`漲跌幅介於${P1}%到${P2}%之間` - 說明:這個條件旨在篩選出在特定時間週期內,股價漲跌幅介於P1%到P2%之間的股票。這類型的股票通常代表著市場對其價格的共識正在形成,可能處於相對穩定的盤整階段,或是正醞釀著溫和的趨勢發展。投資者可藉此鎖定符合特定波動度偏好的標的,避免過度追高或追低,以尋求更穩健的投資機會。 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `percent1` | `-7`、`-5`、`-3`、`-1`、`1`、`2`、`3`、`5`、`7`、`9` | `20` | | `percent2` | `-9`、`-7`、`-5`、`-3`、`-1`、`1`、`2`、`3`、`5`、`7`、`9` | `-10` | ```python api.Block.con_tw('漲跌幅介於P1%到P2%之間') ``` ### 最近N日漲跌幅<> 大盤漲跌幅P%的個股 - `id`: `o8` - 邏輯:`最近${D}日漲跌幅${O}大盤漲跌幅${P}%的個股` - 說明:這個條件旨在篩選出在特定期間(N日)內,其股價漲跌幅與大盤指數漲跌幅存在顯著差異的個股。透過這種比較,我們可以快速識別出那些相對大盤表現更為強勁(領先大盤P%以上)或更為疲弱(落後大盤P%以上)的標的。這對於尋找市場中的領漲股或潛在的補漲股,或是避開持續弱勢的個股,都具有重要的參考價值。 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `period` | `5`、`10`、`20`、`60`、`120`、`240` | `20` | | `operator` | `<`、`>` | `'>'` | | `percent` | `5`、`10`、`15`、`20` | `20` | ```python api.Block.con_tw('最近N日漲跌幅<> 大盤漲跌幅P%的個股') ``` ### 最近一日收盤價<>N日前收盤價P% - `id`: `o93` - 邏輯:`最近一日收盤價${O}${N}日前收盤價${P}%` - 說明:動能強勢:忽略中間的盤整與震盪,該標的在N天內創造了實質的P%正報酬。動能衰竭:該標的在N天內發生了嚴重的實質虧損(如跌幅>20%)。在多頭市場中,這可能是極佳的『乖離過大、跌深反彈』左側買點。 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `operator` | `<`、`>` | `'>'` | | `period` | `5`、`10`、`20`、`60`、`120`、`240` | `20` | | `percent` | `5`、`10`、`20`、`30`、`40`、`50` | `10` | ```python api.Block.con_tw('最近一日收盤價<>N日前收盤價P%') ``` --- ## 營收(20 個) ### 最近一月營收年增率<>累積月營收年增率 - `id`: `f100` - 邏輯:`最近一月營收年增率${O}累積月營收年增率` - 說明:單月YoY>累計YoY(動能黃金交叉/加速中):代表公司『最近一個月』的成長力道,已經超越了『今年以來的平均水準』。這意味著短期訂單突然爆發、新產能順利開出,或是產業景氣出現向上的重大轉折,是極強烈的右側起漲訊號。單月YoY<累計YoY(動能死亡交叉/減速中):代表公司短期的成長引擎開始熄火,雖然累計數字可能還是正的,但『最新的單月表現』已經在拖累整體平均。這通常是拉貨潮結束、客戶砍單的領先指標。 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `operator` | `>`、`<` | `'>'` | ```python api.Block.con_tw('最近一月營收年增率<>累積月營收年增率') ``` ### 月營收成長(衰退) - `id`: `f37` - 邏輯:`月營收${O}` - 說明:月營收成長或衰退,是衡量一家公司在特定月份的銷售表現與過去同期相比的變化。營收成長通常代表公司業務擴張、產品受市場歡迎或產業景氣向上,是企業獲利能力的重要領先指標。反之,營收衰退則可能暗示市場需求減弱、競爭加劇或公司營運面臨挑戰。 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `operator` | `>`(成長)、`<`(衰退) | `'>'` | ```python api.Block.con_tw('月營收成長(衰退)') ``` ### 月營收創N月以來新高(低) - `id`: `f38` - 邏輯:`月營收創${N}月以來新${O}` - 說明:「月營收創N月以來新高(低)」這個條件,直接反映了公司在特定期間內的營運表現,是判斷企業經營狀況和市場競爭力的關鍵短期指標。 當月營收創下N月以來新高時,通常代表公司產品或服務需求強勁,業務動能充沛,這往往是未來獲利成長的領先指標,值得投資人關注。反之,若月營收創下N月以來新低,則可能暗示公司營運面臨挑戰,市場需求疲軟或競爭加劇,投資人應審慎評估其對未來獲利及股價的潛在負面影響.。然而,單看月營收的絕對數字或單月變化可能不夠全面,建議結合年增率、累計年增率、毛利率以及產業平均值等因素進行綜合分析,以避免短期波動的誤判。 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `period` | `6`、`12`、`18`、`24`、`30`、`36`、`48`、`60` | `12` | | `operator` | `>`(高)、`<`(低) | `'>'` | ```python api.Block.con_tw('月營收創N月以來新高(低)') ``` ### 累積月營收年增率>P% - `id`: `f39` - 邏輯:`累積月營收年增率${O}${P}%` - 說明:「累積月營收年增率>P%」代表公司從年初至今的總營收,相較於去年同期有顯著的P%以上增長。這顯示公司營運表現強勁,可能受惠於市場需求增加、產品銷售暢旺或市佔率擴大,是評估企業成長動能的重要指標。 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `operator` | `>`、`<` | `'>'` | | `percent` | `20`、`30`、`40`、`50` | `20` | ```python api.Block.con_tw('累積月營收年增率>P%') ``` ### 連續N個月,累積月營收年增率>前一月月營收年增率 - `id`: `f40` - 邏輯:`連續${N}個月,累積月營收年增率${O}前一月月營收年增率` - 說明:這個條件代表公司的營收成長動能正在持續增強。它不僅顯示企業營收相較去年同期保持成長,更關鍵的是,這種成長的「加速度」正在逐月提升,暗示著企業的基本面可能正處於顯著改善的上升週期,這通常是股價表現的強力支撐。 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `period` | `3`、`4`、`5`、`6`、`8`、`10`、`12` | `3` | | `operator` | `>`、`<` | `'>'` | ```python api.Block.con_tw('連續N個月,累積月營收年增率>前一月月營收年增率') ``` ### 月營收月成長率>±P% - `id`: `f41` - 邏輯:`月營收月成長率${O}${P}%` - 說明:「月營收月成長率 > ±P%」這個條件,代表公司在短期內的營運表現出現了顯著的變化。當月營收較上月大幅成長(>+P%)時,通常暗示著公司業務動能強勁,可能受惠於新訂單、產品熱銷或市場需求激增,是股價上漲的潛在催化劑。反之,若月營收較上月大幅衰退(<-P%),則可能預示著營運面臨挑戰,需留意其對未來獲利的影響。 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `operator` | `>`、`<` | `'>'` | | `percent` | `20`、`30`、`40`、`50`、`-20`、`-30`、`-40`、`-50` | `20` | ```python api.Block.con_tw('月營收月成長率>±P%') ``` ### 月營收月成長率連續N個月>P% - `id`: `f42` - 邏輯:`月營收月成長率連續${N}個月${O}${P}%` - 說明:當一家公司的月營收月成長率連續N個月都大於0%時,這代表該公司在營收方面展現出持續且穩定的成長動能。這不僅顯示其產品或服務的需求正在穩步提升,也暗示著公司營運狀況良好,具備一定的成長潛力。 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `period` | `3`、`4`、`5`、`6` | `3` | | `operator` | `>`、`<` | `'>'` | | `percent` | `0`、`15`、`20`、`30` | `20` | ```python api.Block.con_tw('月營收月成長率連續N個月>P%') ``` ### 月營收年增率>±P% - `id`: `f43` - 邏輯:`月營收年增率${O}±${P}%` - 說明:「月營收年增率大於或小於±P%」這個條件,代表著公司當月營收與去年同期相比,出現了顯著的成長或衰退。當成長率超過正P%時,通常意味著公司業務動能強勁,市場需求旺盛,這對股價是正向的訊號;反之,若成長率低於負P%時,則可能預示著營運面臨挑戰,需要留意其對未來獲利能力的影響。 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `operator` | `>`、`<` | `'>'` | | `percent` | `20`、`30`、`40`、`50`、`-20`、`-30`、`-40`、`-50` | `20` | ```python api.Block.con_tw('月營收年增率>±P%') ``` ### 月營收年增率曾連續N個月>P% - `id`: `f44` - 邏輯:`月營收年增率曾連續${N}個月${O}${P}%` - 說明:當一家公司的月營收年增率連續N個月都呈現正成長時,這代表該公司在營運上展現出持續性的擴張動能,其產品或服務在市場上具有穩定的需求或競爭優勢。這種穩健的營收增長趨勢,通常被視為公司基本面轉強的重要訊號,有助於提升市場對其未來獲利能力的預期,進而可能帶動股價表現。 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `period` | `3`、`4`、`5`、`6`、`8`、`10`、`12` | `3` | | `operator` | `<`、`>` | `'>'` | | `percent` | `0`、`15`、`20`、`30` | `20` | ```python api.Block.con_tw('月營收年增率曾連續N個月>P%') ``` ### 月營收年增率 Top30 - `id`: `f45` - 邏輯:`月營收年增率前${N}名` - 說明:「月營收年增率 Top30」這個條件,代表您正在篩選那些在最近一個月營收表現上,相較於去年同期有顯著成長,且成長幅度位居市場前30名的公司。這是一個尋找具備強勁基本面動能的「成長股」策略,因為月營收年增率能有效排除季節性因素,反映公司業務的真實擴張趨勢。 選擇前30名,則是在眾多成長型公司中,進一步聚焦於表現最為突出的領先者,這些公司可能受惠於產品熱銷、市場需求增加或新業務的成功推動,預期其股價也可能隨之反應。 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `top_n` | `10`、`20`、`30`、`40`、`50` | `30` | ```python api.Block.con_tw('月營收年增率 Top30') ``` ### 月營收年增率 Top M~N - `id`: `f46` - 邏輯:`月營收年增率 Top ${M}~${N}` - 說明:這項條件代表我們正在篩選那些「月營收年增率」表現優異,且排名落在市場前 M 到 N 名的公司。這顯示這些公司在營收成長動能上具有領先地位,可能反映其產品或服務需求強勁,或是市場份額正在擴大,是基本面轉強的重要訊號。 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `rank_start` | `40` | `1` | | `rank_end` | `200` | `30` | ```python api.Block.con_tw('月營收年增率 Top M~N') ``` ### 季營收季成長率>±P% - `id`: `f47` - 邏輯:`季營收季成長率${O}±${P}%` - 說明:這項條件著重於公司季度營收在季度基礎上是否出現顯著的變化。當月成長率的絕對值超過P%時,無論是營收加速成長或明顯放緩,都代表公司基本面可能正經歷重要的轉折,是判斷其未來營運趨勢的關鍵指標。 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `operator` | `>`、`<` | `'>'` | | `percent` | `20`、`30`、`40`、`50`、`-20`、`-30`、`-40`、`-50` | `20` | ```python api.Block.con_tw('季營收季成長率>±P%') ``` ### 季營收年增率>±P% - `id`: `f48` - 邏輯:`季營收年增率${O}±${P}%` - 說明:「季營收年增率大於P%」這個條件,代表公司在該季度營收相較去年同期有顯著的增長,顯示其產品或服務需求強勁,市場份額可能正在擴大。這是一個企業營運狀況良好、具備成長動能的積極訊號,通常被視為股價上漲的潛在驅動力。 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `operator` | `>`、`<` | `'>'` | | `percent` | `20`、`30`、`40`、`50`、`-20`、`-30`、`-40`、`-50` | `20` | ```python api.Block.con_tw('季營收年增率>±P%') ``` ### 近3月營收<>近6月營收 - `id`: `f49` - 邏輯:`近3月營收${O}近6月營收` - 說明:這個條件著重於觀察公司營收的短期趨勢變化,特別是近期營收動能與中期營收動能的比較。當近三個月的營收表現與近六個月的營收表現出現差異時,代表公司的營運成長速度正在經歷加速或減速的轉變。 若近三個月營收優於近六個月營收,通常暗示營收成長動能增強,可能預示著基本面好轉;反之,若近三個月營收不如近六個月,則需警惕營收成長放緩或衰退的風險。投資人應進一步分析其原因,並結合其他財務指標來判斷公司的真實營運狀況. | 參數 | 合法值 | 預設值 | |------|--------|--------| | `operator` | `>`、`<` | `'>'` | ```python api.Block.con_tw('近3月營收<>近6月營收') ``` ### 近3月營收<>近12月營收 - `id`: `f50` - 邏輯:`近3月營收${O}近12月營收` - 說明:這項指標主要用於觀察公司營收的短期趨勢與長期趨勢是否存在變化。當近3月營收表現優於近12月營收時,通常代表公司營收成長動能正在加速,顯示短期營運表現強勁。反之,若近3月營收不如近12月營收,則可能暗示營收成長正在放緩,需留意其後續發展。 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `operator` | `>`、`<` | `'>'` | ```python api.Block.con_tw('近3月營收<>近12月營收') ``` ### 近3月營收年增率<>近6月營收年增率 - `id`: `f51` - 邏輯:`近3月營收年增率${O}近6月營收年增率` - 說明:這個條件是在觀察公司營收成長動能的變化。當近三個月的營收年成長率與近六個月的營收年成長率出現差異時,代表公司的營收成長趨勢正在發生轉變。如果近三個月的成長率高於近六個月,則暗示營收動能正在加速;反之,若低於近六個月,則可能意味著成長動能正在放緩,值得進一步探究其原因。 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `operator` | `>`、`<` | `'>'` | ```python api.Block.con_tw('近3月營收年增率<>近6月營收年增率') ``` ### 近3月營收年增率<>近12月營收年增率 - `id`: `f52` - 邏輯:`近3月營收年增率${O}近12月營收年增率` - 說明:這個條件是在比較公司「短期營收動能」與「長期營收趨勢」的差異,用以判斷營收成長的變化方向。當近3月營收年成長率與近12月營收年成長率不一致時,代表公司的營運表現可能正在發生轉變。 若近3月營收年成長率高於近12月,暗示營收動能正在加速,可能預示著公司進入成長爆發期;反之,若近3月營收年成長率低於近12月,則需留意營收成長可能正在放緩,這可能是營運逆風的早期警訊。 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `operator` | `>`、`<` | `'>'` | ```python api.Block.con_tw('近3月營收年增率<>近12月營收年增率') ``` ### 最近N月至少有S月月營收年增率<>P% - `id`: `f70` - 邏輯:`最近${N}月至少有${S}月月營收年增率${O}${P}%` - 說明:此條件是用於偵測公司最新業績動能的短中線指標。當設定大於(>P%),能精準抓出近期產品大賣、產業步入旺季,或營收連續爆發的超級強勢股,適合做為波段進場前的業績濾網。 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `n` | `3`、`6`、`9`、`12`、`24`、`36` | `3` | | `s` | `2`、`4`、`6`、`9`、`18`、`25` | `2` | | `operator` | `>`、`<` | `'>'` | | `percent` | `20`、`30`、`40`、`50`、`-20`、`-30`、`-40`、`-50` | `20` | ```python api.Block.con_tw('最近N月至少有S月月營收年增率<>P%') ``` ### 最近N季至少有S季月營收年增率<>P% - `id`: `f71` - 邏輯:`最近${N}季至少有${S}季月營收年增率${O}${P}%` - 說明:此條件相較於單月指標,能有效平穩過濾掉單月過年連假或工作天數落差的雜訊,用於確認企業營收是否處於「長線且穩定的擴張期」,是兼顧基本面與中長線趨勢的核心積木。 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `n` | `4`、`8`、`12`、`20`、`40` | `4` | | `s` | `2`、`3`、`4`、`6`、`9`、`12`、`16`、`20`、`32` | `2` | | `operator` | `>`、`<` | `'>'` | | `percent` | `20`、`30`、`40`、`50`、`-20`、`-30`、`-40`、`-50` | `20` | ```python api.Block.con_tw('最近N季至少有S季月營收年增率<>P%') ``` ### 月營收年增率近N個月皆<>P% - `id`: `f80` - 邏輯:`月營收年增率近${N}個月皆${O}${P}%` - 說明:本策略檢視企業每月公佈的『營收年增率(YoY)』,篩選出連續 N 個月其增(減)幅皆大於或小於 P% 的標的。此指標旨在排除單月因入帳時間差造成的營收突增假象,精準鎖定產業趨勢正向、產品供不應求,且具備長期實質成長動能的『波段黑馬股』。 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `n` | `3`、`6`、`9`、`12`、`24`、`36` | `3` | | `operator` | `>`、`<` | `'>'` | | `percent` | `0`、`20`、`30`、`-20`、`-30` | `0` | ```python api.Block.con_tw('月營收年增率近N個月皆<>P%') ``` --- ## 爆大量(4 個) ### 今日成交量>前D日內最大量N倍 - `id`: `v12` - 邏輯:`今日成交量>前${D}日內最大量${P}倍` - 說明:當日成交量顯著超越過去D天內的最高量N倍,這代表市場對該股票的關注度急劇升高,資金進出非常活躍。這種爆量通常伴隨著股價的關鍵性變動,可能預示著趨勢的啟動或反轉,是判斷市場力量轉變的重要訊號。 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `period` | `1`、`5`、`10`、`20`、`60` | `5` | | `multiplier` | `1`、`1.5`、`2` | `1` | ```python api.Block.con_tw('今日成交量>前D日內最大量N倍') ``` ### 今日(周)成交量>上一日(周)成交量P倍 - `id`: `v5` - 邏輯:`今${A}成交量>上一${A}成交量${P}倍` - 說明:這個技術條件表示該股票在當日(或當週)的交易活動顯著放大,成交量達到前一日(或前一週)的P倍。這通常意味著市場對該股的關注度急劇升高,無論是買盤積極湧入或是賣壓大量釋出,都可能預示著股價即將出現較大的波動或趨勢轉變。 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `table` | `日`、`周` | `'日_K'` | | `multiplier` | `1`、`1.5`、`2`、`3` | `2` | ```python api.Block.con_tw('今日(周)成交量>上一日(周)成交量P倍') ``` ### 日成交量<>5ma成交量P倍 - `id`: `v5x` - 邏輯:`日成交量${O}5ma成交量${P}倍` - 說明:這個條件「日成交量是5日均量P倍」,代表著當日股票的交易活動量,相較於過去五個交易日的平均成交量,出現了P倍的顯著放大。這種現象通常暗示著市場對該股票的關注度或交易意願出現了顯著變化,無論是買盤或賣盤的力量都明顯增強。它可以是趨勢延續的確認訊號,例如在突破關鍵價位時伴隨巨量,或是潛在趨勢反轉的早期跡象,尤其當極端大量出現在股價高點或低點時。 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `operator` | `>`、`<` | `'>'` | | `multiplier` | `1`、`1.5`、`2`、`3` | `2` | ```python api.Block.con_tw('日成交量<>5ma成交量P倍') ``` ### 最近一日成交量<>前一日P倍,且<>張 - `id`: `v6` - 邏輯:`最近一日成交量${O}前一日${P}倍,且>${V}張` - 說明:「最近一日成交量大於前一日P倍,且大於X張」這個條件,代表市場對該股票的關注度與交易活動顯著放大,顯示有大量資金正在進出。這種量能的急劇放大,通常預示著股價可能即將出現較大的方向性變動,是判斷市場情緒轉變或趨勢確立的重要訊號。 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `operator1` | `>`、`<` | `'>'` | | `percent` | `1`、`1.5`、`2`、`3` | `100` | | `threshold` | `500`、`1000`、`2000`、`3000`、`5000`、`10000`、`20000` | `0` | ```python api.Block.con_tw('最近一日成交量<>前一日P倍,且<>張') ``` --- ## 破底(1 個) ### 今日收盤(開高低)距近D日最低價<-P% - `id`: `o36` - 邏輯:`今日${A}距近${D}日最低價<-${P}%` - 說明:這個技術條件表示,今日收盤價已跌破過去D天內的最低點,並且跌幅超過P%。這通常被視為一個重要的空頭訊號,暗示市場賣壓沉重,股價可能正在加速探底,投資人應留意潛在的風險。 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `ohlc_field` | `adj_Open`(開盤價)、`adj_High`(最高價)、`adj_Low`(最低價)、`adj_Close`(收盤價) | `'adj_Close'` | | `period` | `1`、`5`、`10`、`20`、`60`、`120`、`240` | `5` | | `percent` | `5`、`10`、`15`、`20`(傳入正負皆輸出負值) | `-5` | ```python api.Block.con_tw('今日收盤(開高低)距近D日最低價<-P%') ``` --- ## 籌碼主力(5 個) ### 近D日主力狂買(賣)>V張 - `id`: `c1` - 邏輯:`近${D}日主力狂${A}>${V}張` - 說明:這個條件主要在觀察在特定期間內,市場上具影響力的主力資金,其買賣超張數是否顯著超過V張。當主力呈現「狂買」狀態時,通常意味著大戶或法人看好後市而積極進場佈局,預示股價可能具備上漲動能;反之,若主力「狂賣」,則可能暗示大戶正在出貨,股價面臨較大的下行壓力。 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `period` | `1`、`5`、`10`、`20`、`60`、`120`、`240` | `5` | | `operator` | `B`(買)、`S`(賣) | `'B'` | | `volume` | `500`、`1000`、`2000`、`3000`、`5000`、`10000` | `1000` | ```python api.Block.con_tw('近D日主力狂買(賣)>V張') ``` ### 連續N日買賣家數差<>0 - `id`: `c19` - 邏輯:`連續${N}日買賣家數${O}0` - 說明:連續N日<0(波段鎖碼/雁行吸籌):代表在過去這整整一週或兩週內,『每一天』的籌碼都穩定地從多數散戶手中,流向少數的大戶口袋。這排除了單日鉅額交易的雜訊,證明主力正在進行具備嚴格紀律的『波段建倉計畫』,是長線大牛股發動前的最標準前奏。連續N日>0(溫水煮青蛙/凌遲出貨):代表主力每天都在偷偷倒貨,而每天都有不同批的散戶進來接刀。這類股票的K線圖可能看起來還在高檔盤整,但底子已經被徹底掏空,隨時準備迎接主跌段的崩盤。 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `N` | `1`、`5`、`10`、`20`、`60`、`120`、`240` | `5` | | `operator` | `<`、`>` | `'<'` | ```python api.Block.con_tw('連續N日買賣家數差<>0') ``` ### 近D日主力狂買(賣)>P% - `id`: `c2` - 邏輯:`近${D}日主力狂${A}>${P}%` - 說明:這個條件指的是在最近D個交易日內,主要市場參與者(通常指法人、大戶或特定券商分點)對某檔股票的買賣超量超過了P%的流通籌碼。這代表著有具備影響力的資金正在積極地建立或出脫部位,顯示市場對該股票的看法趨於一致,可能預示著股價即將出現較大的波動。 這個條件指的是在最近D個交易日內,主要市場參與者(通常指法人、大戶或特定券商分點)對某檔股票的淨買入或淨賣出量,佔其流通籌碼的比例超過P%。 這代表著有具備影響力的資金正在積極地建立或出脫部位,顯示市場對該股票的看法趨於一致,可能預示著股價即將出現較大的波動。 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `period` | `1`、`5`、`10`、`20`、`60`、`120`、`240` | `5` | | `operator` | `B`(買)、`S`(賣) | `'B'` | | `percent` | `5`、`10`、`15`、`20`、`30`、`50` | `5` | ```python api.Block.con_tw('近D日主力狂買(賣)>P%') ``` ### 最近D日內有N日買賣家數差<>0 - `id`: `c20` - 邏輯:`最近${D}日內有${N}日買賣家數差${O}0` - 說明:D日內有N日<0(高密度鎖碼):允許主力在吃貨期中,有幾天呈現『買賣家數差>0』的雜訊。這完美過濾了主力故意『壓低洗盤』或是『暫停買進測試賣壓』所造成的連續性中斷。只要區間內的『集中密度』極高,就證明大戶做多的中長線意圖沒有改變。 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `D` | `3`、`5`、`7`、`10`、`20` | `10` | | `N` | `1`、`2`、`3`、`4`、`5`、`6`、`7`、`10` | `3` | | `operator` | `<`、`>` | `'<'` | ```python api.Block.con_tw('最近D日內有N日買賣家數差<>0') ``` --- ## 籌碼集中度(2 個) ### D日籌碼集中度>N日籌碼集中度 - `id`: `c21` - 邏輯:`${D}日籌碼集中度>${N}日籌碼集中度` - 說明:D日集中度>N日集中度(籌碼黃金交叉/加速吸籌):代表短期內大戶吸收籌碼的力道,已經遠遠超越了過去一個月或一季的平均水準。這意味著主力建倉進入『尾聲與衝刺期』,往往是重大基本面利多發布前的極端價格推升前兆。 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `D` | `1`、`3`、`5`、`10` | `5` | | `N` | `2`、`3`、`5`、`10`、`20` | `20` | ```python api.Block.con_tw('D日籌碼集中度>N日籌碼集中度') ``` ### 近D日籌碼集中度<>P% - `id`: `c6` - 邏輯:`近${D}日籌碼集中度${O}${P}%` - 說明:籌碼集中度即為淨買超 / 成交量,集中度越大代表大部位資金吃貨力道越大 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `period` | `1`、`2`、`3`、`4`、`5` | `1` | | `operator` | `S`(<)、`B`(>) | `'>'` | | `percent` | `-50`、`-30`、`-20`、`-15`、`-10`、`-5`、`5`、`10`、`15`、`20`、`30`、`50` | `5` | ```python api.Block.con_tw('近D日籌碼集中度<>P%') ``` --- ## 累積成交量(1 個) ### 近D日累積成交量<>V張 - `id`: `v38` - 邏輯:`近${D}日累積成交量${O}${V}張` - 說明:大於V張:用於『流動性安全過濾』,確保中長線大資金進出時擁有足夠的對手盤,避免嚴重的滑價風險;亦可用於尋找近D日持續放量的催化標的。小於V張:用於『籌碼窒息量篩選』,在股價回測支撐時,尋找過去D日內成交量極度萎縮、代表浮額清洗完畢的潛伏標的。 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `period` | `2`、`3`、`4`、`5`、`10`、`20` | `20` | | `operator` | `>`、`<` | `'>'` | | `threshold` | `20000`、`50000`、`100000`、`200000` | `20000` | ```python api.Block.con_tw('近D日累積成交量<>V張') ``` --- ## 股利(13 個) ### 近一年現金股利<>M元 - `id`: `f53` - 邏輯:`近一年現金股利${O}${M}元` - 說明:這個條件是用來篩選過去一年現金股利發放金額的公司。現金股利是企業獲利能力與回饋股東意願的直接展現,對於追求穩定現金流或評估公司財務體質的投資者而言,是一個重要的參考指標。它能幫助我們快速找出具備特定股利政策或派息能力的標的,例如排除不發放股利的公司,或篩選出股利發放金額高於或低於某個水準的企業。 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `operator` | `<`、`>` | `'>'` | | `amount` | `2`、`3`、`5`、`8`、`10`、`15` | `2` | ```python api.Block.con_tw('近一年現金股利<>M元') ``` ### 近一年股票股利<>M元 - `id`: `f54` - 邏輯:`近一年股票股利${O}${M}元` - 說明:「近一年股票股利<>M元」這個條件,指的是公司在過去一年內以股票形式發放的股利金額。股票股利與現金股利不同,它代表公司將盈餘轉化為股本,發行新股給股東,而非直接發放現金。 這通常暗示公司正處於成長階段,傾向將盈餘保留在公司內部進行再投資或擴張,以支持未來的營運發展,同時也可能反映管理層對公司前景的信心。 投資人可以透過這個條件,篩選出那些將獲利再投入公司成長,而非單純發放現金的公司。 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `operator` | `<`、`>` | `'>'` | | `amount` | `1`、`2`、`5`、`10` | `1` | ```python api.Block.con_tw('近一年股票股利<>M元') ``` ### 近一年現金殖利率<>P% - `id`: `f55` - 邏輯:`近一年現金殖利率${O}${P}%` - 說明:「近一年現金殖利率<>P%」這個條件,代表我們正在篩選那些現金股利殖利率與特定百分比P有所差異的標的。這可能意味著投資者在尋找殖利率偏離市場平均或個人預期水準的機會,例如,高於P%可能代表股價被低估或公司獲利穩定,而低於P%則可能暗示公司將盈餘再投資以追求未來成長。 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `operator` | `>`、`<` | `'>'` | | `percent` | `3`、`4`、`5`、`6`、`7`、`8` | `3` | ```python api.Block.con_tw('近一年現金殖利率<>P%') ``` ### 近N年平均殖利率<>P% - `id`: `f56` - 邏輯:`近${N}年平均殖利率${O}${P}%` - 說明:「近N年平均殖利率<>P%」這個條件,是用來評估一家公司在過去N年期間,其平均股息殖利率是否符合特定的P%標準。這項指標能幫助投資者篩選出符合其收益目標的股票,例如,尋求高於P%的穩定現金流,或是排除過高或過低的殖利率以符合特定的投資策略。 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `period` | `3`、`4`、`5`、`6`、`7`、`8` | `3` | | `operator` | `>`、`<` | `'>'` | | `percent` | `3`、`4`、`5`、`6`、`7`、`10` | `3` | ```python api.Block.con_tw('近N年平均殖利率<>P%') ``` ### 填權息天數<>N天 - `id`: `f57` - 邏輯:`填權息天數${O}${N}天` - 說明:「填權息天數」指的是股票在除息後,股價回升至除息前水準所需的天數。當我們設定「填息天數不等於 N 天」時,這代表我們正在篩選那些填息速度與特定天數N不同的股票。這種條件可能暗示著市場對該股票的評價出現異常,無論是填息速度遠超預期(顯示強勁買盤)或遠低於預期(顯示賣壓沉重或基本面疑慮),進而作為判斷股價未來走勢的參考依據。 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `operator` | `>`、`<` | `'<'` | | `days` | `20`、`60`、`120`、`240` | `60` | ```python api.Block.con_tw('填權息天數<>N天') ``` ### 近一年現金股利發放率<>P% - `id`: `f58` - 邏輯:`近一年現金股利發放率${O}${P}%` - 說明:現金股利發放率(Payout Ratio)反映了企業盈餘分配的取向。較高的發放率適合追求穩定現金流的收息投資者;而較低的發放率則可能暗示公司正處於成長期,傾向於將資金留存用於再投資(如研判 FOPLP 或 CPO 等先進技術的研發)。此指標能協助用戶根據自身投資屬性,精確定位適合的標的。 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `operator` | `>`、`<` | `'>'` | | `percent` | `40`、`50`、`60`、`70`、`80`、`90` | `50` | ```python api.Block.con_tw('近一年現金股利發放率<>P%') ``` ### 近N年現金股利發放率<>P% - `id`: `f59` - 邏輯:`近${N}年現金股利發放率${O}${P}%` - 說明:此指標透過拉長觀察週期($N$ 年),計算現金股利發放率的平均值或穩定性。這有助於排除因處分業外資產或特殊會計調整造成的單一年度高分紅假象。對於建構收息型資產組合的投資者而言,此指標能有效定位具備「穩定股利政策」的成熟企業。 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `period` | `1`、`2`、`3`、`4`、`5`、`10`、`15`、`20` | `3` | | `operator` | `>`、`<` | `'>'` | | `percent` | `40`、`50`、`60`、`70`、`80`、`90` | `50` | ```python api.Block.con_tw('近N年現金股利發放率<>P%') ``` ### 近N年填權息天數皆<>D天 - `id`: `f60` - 邏輯:`近${N}年填權息天數皆${O}${D}天` - 說明:此指標用於量化個股「除權息後回填價格缺口」的效率。透過篩選近 $N$ 年皆能於 $D$ 日內完成填權息的標的,可有效過濾掉長期處於貼息狀態的弱勢股。這對尋求穩定現金流且不願承擔資本虧損風險的投資者而言,是確認標的具備「填息慣性」的關鍵指標。 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `n` | `2`、`3`、`4`、`5`、`10`、`15`、`20` | `2` | | `operator` | `>`、`<` | `'<'` | | `days` | `30`、`60`、`90`、`120`、`240` | `90` | ```python api.Block.con_tw('近N年填權息天數皆<>D天') ``` ### 最近N年至少有S年現金股利<>M元 - `id`: `f72` - 邏輯:`最近${N}年至少有${S}年現金股利${O}${M}元` - 說明:此條件是存股族建構高股息組合時最重視的穩定度指標。當設定大於(>M 元),代表公司有長期穩定的獲利基礎與發紅包能力,不會在景氣差時就突然不發股利,能為長期持股提供強大保護力。 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `n` | `3`、`5`、`10`、`20` | `3` | | `s` | `2`、`4`、`8`、`16` | `2` | | `operator` | `<`、`>` | `'>'` | | `amount` | `2`、`3`、`5`、`8`、`10`、`15` | `2` | ```python api.Block.con_tw('最近N年至少有S年現金股利<>M元') ``` ### 最近N年至少有S年現金殖利率<>P% - `id`: `f73` - 邏輯:`最近${N}年至少有${S}年現金殖利率${O}${P}%` - 說明:此條件用於評估股價與股利之間的相對投報率。當設定大於(>P%),代表歷史上該股在特定價位具備高投報優勢,能吸引長線買盤進駐,在空頭市場時,往往能展現極強的抗跌與防守特性。 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `n` | `3`、`5`、`10`、`20` | `3` | | `s` | `2`、`4`、`8`、`16` | `2` | | `operator` | `>`、`<` | `'>'` | | `percent` | `3`、`4`、`5`、`6`、`7`、`8` | `3` | ```python api.Block.con_tw('最近N年至少有S年現金殖利率<>P%') ``` ### 最近N年至少有S年填權息天數<>D天 - `id`: `f74` - 邏輯:`最近${N}年至少有${S}年填權息天數${O}${D}天` - 說明:此條件是用於防範「賺了利息、賠了價差」的關鍵指標。當設定小於(<D 天),代表公司配息後能迅速被市場買盤拉回原價,確保投資人拿到的是「真正的資產增值」,而非左手換右手。 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `n` | `3`、`5`、`10`、`20` | `3` | | `s` | `2`、`4`、`8`、`16` | `2` | | `operator` | `>`、`<` | `'<'` | | `days` | `20`、`60`、`120`、`240` | `60` | ```python api.Block.con_tw('最近N年至少有S年填權息天數<>D天') ``` ### 最近N年至少有S年現金股利發放率<>P% - `id`: `f75` - 邏輯:`最近${N}年至少有${S}年現金股利發放率${O}${P}%` - 說明:此條件能看出公司的慷慨程度與資金規劃。適中的發放率(如 50%~80%)代表公司大方且仍保留擴產資金;過高可能代表不願再投資,過低則代表對股東較吝嗇,可用於調整存股名單。 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `n` | `3`、`5`、`10`、`20` | `3` | | `s` | `2`、`4`、`8`、`16` | `2` | | `operator` | `>`、`<` | `'>'` | | `percent` | `40`、`50`、`60`、`70`、`80`、`90` | `50` | ```python api.Block.con_tw('最近N年至少有S年現金股利發放率<>P%') ``` ### 連續N年發放現金股利 - `id`: `f76` - 邏輯:`連續${N}年發放現金股利` - 說明:指公司過去 N 年來,每年都有將賺到的利潤(現金或股票)分配給股東,中間從未中斷,連續發放的年數越長,代表公司的獲利能力越穩定、財務體質越健康,是評估「長期存股」與「防禦型投資」的重要指標。建議搭配「殖利率」一起觀察。 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `N` | `3`、`5`、`7`、`10`、`15`、`20` | `5` | ```python api.Block.con_tw('連續N年發放現金股利') ``` --- ## 葛林布雷(3 個) ### 資本報酬率<>P% - `id`: `f93` - 邏輯:`資本報酬率${O}${P}%` - 說明:資本報酬率公式為:近四季稅前淨利/(流動資產-現金-長期投資+固定資產) | 參數 | 合法值 | 預設值 | |------|--------|--------| | `operator` | `<`、`>` | `'>'` | | `percent` | `0`、`10`、`20`、`30`、`40`、`50` | `20` | ```python api.Block.con_tw('資本報酬率<>P%') ``` ### 盈餘報酬率<>P% - `id`: `f94` - 邏輯:`盈餘報酬率${O}${P}%` - 說明:盈餘報酬率公式為:近四季稅前淨利/(昨日收盤價*在外流通股數+長期負債-現金) | 參數 | 合法值 | 預設值 | |------|--------|--------| | `operator` | `<`、`>` | `'>'` | | `percent` | `0`、`10`、`20`、`30`、`40`、`50` | `20` | ```python api.Block.con_tw('盈餘報酬率<>P%') ``` ### 葛林布雷名次<>N名 - `id`: `f95` - 邏輯:`葛林布雷名次${O}${N}名` - 說明:本策略同時參考資本報酬率與盈餘報酬率,根據名次加總後,得出葛林布雷名次 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `operator` | `<`、`>` | `'<'` | | `N` | `10`、`20`、`30`、`40`、`50`、`60`、`70`、`80`、`90`、`100` | `100` | ```python api.Block.con_tw('葛林布雷名次<>N名') ``` --- ## 負債與股東權益(6 個) ### 季負債比率<>P% - `id`: `f20` - 邏輯:`季負債比率${O}${P}%` - 說明:季負債比率是衡量一家公司短期償債能力與財務槓桿程度的重要指標,它反映了公司總資產中有多少比例是透過負債來支應的。當這個比率高於或低於特定百分比(P%)時,可以作為評估公司財務風險與經營穩健性的一個參考點。一般而言,過高的負債比率可能意味著公司財務結構不夠穩健,而過低的負債比率則可能表示公司未充分利用財務槓桿來擴大營運。 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `operator` | `>`、`<` | `'>'` | | `percent` | `50`、`60`、`70`、`80` | `50` | ```python api.Block.con_tw('季負債比率<>P%') ``` ### 股價淨值比<>N倍 - `id`: `f3` - 邏輯:`股價淨值比${O}${N}倍` - 說明:股價淨值比 (P/B ratio) 是衡量公司股價相對於其每股淨資產的指標,反映了市場對公司資產價值的認可程度。當股價淨值比偏離 N 倍時,可能暗示市場對公司資產價值的看法與其帳面價值存在差異,這通常被用來評估股票是被高估還是低估。 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `operator` | `>`、`<` | `'<'` | | `multiple` | `0.8`、`1`、`1.2`、`1.5`、`2` | `1` | ```python api.Block.con_tw('股價淨值比<>N倍') ``` ### 最近N季至少有S季負債比率<>P% - `id`: `f65` - 邏輯:`最近${N}季至少有${S}季負債比率${O}${P}%` - 說明:此條件是用於衡量公司財務健全度與破產風險的關鍵指標。當設定為小於時(<P%),可用於鎖定低負債、財務體質極度安全的防守型標的(如定存股);當設定為大於時(>P%),通常用於警示客戶該股槓桿過高、利息負擔沉重,或用來動態追蹤需要大量資本支出但具備高成長性(如半導體、營建業)的特殊產業結構。 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `n` | `4`、`8`、`12`、`20`、`40` | `4` | | `s` | `2`、`3`、`4`、`6`、`9`、`12`、`16`、`20`、`32` | `2` | | `operator` | `>`、`<` | `'<'` | | `percent` | `50`、`60`、`70`、`80` | `60` | ```python api.Block.con_tw('最近N季至少有S季負債比率<>P%') ``` ### 每股清算價值<>N倍 - `id`: `f96` - 邏輯:`每股清算價值${O}${N}倍` - 說明:每股清算價值=(資產-負債-存貨-應收帳款-長期投資)/在外流通股數。股價<每股清算價值的N倍(極度超跌/清算套利):這種『買資產送公司』的極端低估,通常發生在大熊市的恐慌拋售期,或是被市場徹底遺忘的冷門夕陽產業。此為『深度價值』量化模型的最底層防線。它完全不看未來的成長性,只看當下資產負債表的變現能力。 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `operator` | `<`、`>` | `'<'` | | `N` | `0.5`、`0.8`、`1`、`1.2`、`1.5`、`2` | `1` | ```python api.Block.con_tw('每股清算價值<>N倍') ``` ### 長期負債比率<>P% - `id`: `f97` - 邏輯:`長期負債比率${O}${P}%` - 說明:本策略計算個股財報中的『長期負債』,除以『總資產』或『總股東權益』計算出比例P%。佔比>P%(高槓桿):代表公司大量的營運資金是『借來的』。在降息循環或產業順風期,高槓桿能讓股東的獲利倍數放大;但在升息循環或景氣逆風時,龐大的固定利息支出將成為吞噬企業現金流的無底洞,甚至引發倒閉危機。佔比`、`<` | `'>'` | | `percent` | `20`、`40`、`60` | `40` | ```python api.Block.con_tw('長期負債比率<>P%') ``` ### 長期負債佔股本比率<>P% - `id`: `f98` - 邏輯:`長期負債佔股本比率${O}${P}%` - 說明:本策略抓取個股財報中的『長期負債』,將其除以『實收股本』,計算出比例P%。佔比>P%(高槓桿/攻擊型資本結構):代表公司高度依賴外部借款來營運。當本業的資產報酬率大於借款利息時,這種高槓桿能以幾何倍數放大;但若遇到產業逆風,獲利也會以同樣的倍數雪崩。佔比`、`<` | `'>'` | | `percent` | `10`、`20`、`30`、`40` | `20` | ```python api.Block.con_tw('長期負債佔股本比率<>P%') ``` --- ## 財務比率(26 個) ### 近四季毛利率<>P% - `id`: `f10` - 邏輯:`近四季毛利率${O}${P}%` - 說明:「近四季毛利率」是指公司在過去一年(四個季度)的銷售收入中,扣除產品成本後所剩下的利潤百分比。這個指標是衡量企業核心獲利能力、產品定價權以及成本控制效率的關鍵。當我們設定一個「P%」的條件時,無論是高於或低於此百分比,都是在評估公司在產業中的競爭力與經營效率,例如,高毛利率通常意味著公司擁有較強的產品競爭力或成本優勢。 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `operator` | `>`、`<` | `'>'` | | `percent` | `20`、`30`、`40`、`50` | `20` | ```python api.Block.con_tw('近四季毛利率<>P%') ``` ### 營益率較上一季成長(衰退) - `id`: `f11` - 邏輯:`營益率較上一季${O}` - 說明:當營益率較上一季成長時,這代表公司在核心業務上的獲利能力有所提升,可能是因為成本控制得宜、產品定價能力增強或營運效率改善。反之,若營益率衰退,則可能暗示公司面臨成本上升、競爭加劇導致毛利承壓,或是營運效率下滑等挑戰,值得投資人深入探究其背後的原因。 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `operator` | `>`(成長)、`<`(衰退) | `'>'` | ```python api.Block.con_tw('營益率較上一季成長(衰退)') ``` ### 營益率創歷史新高(新低) - `id`: `f12` - 邏輯:`營益率創歷史${O}` - 說明:「營益率」衡量的是企業本業的獲利能力,也就是每創造一元營收能有多少營業利益。當營益率創歷史新高時,代表公司在核心業務上的營運效率、成本控制或產品定價能力達到前所未有的高峰,顯示其經營體質極為穩健,有助於提升市場對其未來成長與獲利能力的信心。 相反地,若營益率創歷史新低,則警示公司在核心業務獲利能力上出現嚴重衰退,可能反映出營運效率不彰、成本失控或市場競爭加劇導致定價能力受損,這通常會引發市場對公司財務健康狀況的擔憂,並可能影響其未來的投資價值。 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `operator` | `>`(新高)、`<`(新低) | `'>'` | ```python api.Block.con_tw('營益率創歷史新高(新低)') ``` ### 營益率<>P% - `id`: `f13` - 邏輯:`營益率${O}${P}%` - 說明:「營益率」又稱營業利益率,是衡量企業本業獲利能力的重要指標,代表每1元的營業收入中,公司能賺取多少營業利益,反映了企業的經營效率與管理能力。 當您設定「營益率<>P%」這個條件時,表示您正在尋找那些營益率與特定百分比P%不符的公司,這有助於篩選出營運獲利能力顯著偏離市場平均、產業標準或您預設目標值的企業。 這種篩選方式能幫助您識別出具有獨特競爭優勢(營益率遠高於P%)或面臨營運挑戰(營益率遠低於P%)的標的,進而深入分析其背後的原因。 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `operator` | `>`、`<` | `'>'` | | `percent` | `10`、`20`、`30` | `10` | ```python api.Block.con_tw('營益率<>P%') ``` ### 近四季營益率<>P% - `id`: `f14` - 邏輯:`近四季營益率${O}${P}%` - 說明:「近四季營益率」指的是公司在過去連續四個季度(即一整年)的營業利益率,這是一個衡量企業核心業務獲利能力和營運效率的重要指標。當這個數值「不等於 P%」時,代表公司的營運效率或獲利能力與某個特定基準或預期值出現了顯著的差異。這種差異可能暗示著公司在成本控制、產品定價或市場競爭力方面發生了變化,無論是正向的提升或負向的衰退,都值得投資人深入探究其背後的原因。 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `operator` | `>`、`<` | `'>'` | | `percent` | `10`、`20`、`30` | `10` | ```python api.Block.con_tw('近四季營益率<>P%') ``` ### 稅後淨利率較上一季成長(衰退) - `id`: `f15` - 邏輯:`稅後淨利率較上一季${O}` - 說明:「稅後淨利率較上一季成長」代表公司在扣除所有成本與稅金後,每單位營收所能創造的實際利潤有所提升,這通常反映了公司營運效率的改善或產品組合的優化。反之,若「稅後淨利率較上一季衰退」,則可能暗示公司在成本控制、定價策略或市場競爭上遭遇挑戰,進而影響其獲利能力。 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `operator` | `>`(成長)、`<`(衰退) | `'>'` | ```python api.Block.con_tw('稅後淨利率較上一季成長(衰退)') ``` ### 存貨周轉天數>N天 - `id`: `f19` - 邏輯:`存貨周轉天數${O}${N}天` - 說明:「存貨周轉天數大於N天」表示公司需要較長的時間才能將其庫存商品轉換為銷售收入。這通常暗示著產品銷售動能不足、市場需求疲軟,或是存貨管理效率出現問題,可能導致資金積壓並增加存貨跌價的風險。 雖然在某些產業(如鋼鐵業)存貨周轉天數本來就較長,但若與同業或公司歷史數據相比顯著拉長,則需警惕其對營運週轉金的影響及潛在的存貨滯銷風險。 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `operator` | `>`、`<` | `'>'` | | `days` | `50`、`100`、`150`、`200`、`300` | `100` | ```python api.Block.con_tw('存貨周轉天數>N天') ``` ### 季營業利益較去年同期 負轉正 - `id`: `f21` - 邏輯:`季營業利益較去年同期${O}` - 說明:「季營業利益較去年同期負轉正」代表公司在核心業務上實現了顯著的營運轉機,從去年的虧損狀態成功轉為獲利。這不僅顯示公司基本面正在好轉,也暗示其營運效率提升或市場需求回溫,對投資人而言是一個強烈的復甦訊號。 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `operator` | `>`(轉正)、`<`(轉負) | `'>'` | ```python api.Block.con_tw('季營業利益較去年同期 負轉正') ``` ### 近四季股東權益報酬率(ROE)<>P% - `id`: `f22` - 邏輯:`近四季股東權益報酬率(ROE) ${O}${P}%` - 說明:「近四季股東權益報酬率(ROE) < P%」這項條件,代表公司在過去一年中,利用股東投入的資本創造利潤的效率相對較低。這通常暗示著公司的獲利能力不佳,未能有效運用股東資金來產生足夠的回報,對於追求股東價值成長的投資者而言,這可能是一個需要謹慎評估的警訊。 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `operator` | `>`、`<` | `'>'` | | `percent` | `15`、`20`、`25` | `15` | ```python api.Block.con_tw('近四季股東權益報酬率(ROE)<>P%') ``` ### 近Y年平均股東權益報酬率(ROE) > P% - `id`: `f23` - 邏輯:`近${Y}年平均股東權益報酬率(ROE)${O}${P}%` - 說明:這項條件代表您正在尋找那些長期以來,能為股東創造豐厚回報的公司。股東權益報酬率(ROE)衡量的是公司利用股東投入的資金賺取利潤的效率,而近Y年平均ROE高於P%則顯示該公司在過去一段時間內,持續保持著卓越的獲利能力與經營效率。這通常意味著公司擁有穩固的競爭優勢、良好的管理團隊,以及健康的財務狀況,是價值投資者評估企業內在價值的重要指標。 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `period` | `3`、`5`、`8`、`10` | `3` | | `operator` | `>`、`<` | `'>'` | | `percent` | `15`、`20`、`25` | `15` | ```python api.Block.con_tw('近Y年平均股東權益報酬率(ROE) > P%') ``` ### 近四季資產報酬率(ROA) < P% - `id`: `f24` - 邏輯:`近四季資產報酬率(ROA)${O}${P}%` - 說明:資產報酬率(ROA)是衡量公司運用其總資產創造獲利能力的指標。當近四季的資產報酬率低於P%時,這表示公司在運用其所有資產(包括自有資金和借款)來產生利潤的效率相對較低。這可能暗示公司的經營效率不佳,或是其資產配置未能有效轉化為收益,對於投資人而言,這代表該公司的獲利能力可能較弱,需要進一步探究其原因。 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `operator` | `>`、`<` | `'>'` | | `percent` | `8`、`12`、`16`、`20` | `8` | ```python api.Block.con_tw('近四季資產報酬率(ROA) < P%') ``` ### 近Y年資產報酬率(ROA) > P% - `id`: `f25` - 邏輯:`近${Y}年資產報酬率(ROA)${O}${P}%` - 說明:這個條件代表公司在過去Y年內,運用其總資產創造利潤的效率非常高,平均每年資產報酬率都超過P%。這顯示公司管理層在資產運用上表現卓越,能有效將資產轉化為獲利,是評估公司經營效率和獲利能力的重要指標。 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `period` | `3`、`5`、`8`、`10` | `3` | | `operator` | `>`、`<` | `'>'` | | `percent` | `8`、`12`、`16`、`20` | `8` | ```python api.Block.con_tw('近Y年資產報酬率(ROA) > P%') ``` ### 近五年自由現金流量<>0 - `id`: `f27` - 邏輯:`近${Y}年自由現金流量${O}0` - 說明:「近五年自由現金流量不為零」這個條件,代表公司在過去五年中,每年都有產生或消耗自由現金流,而非處於收支平衡的狀態。自由現金流量是衡量公司在支付營運成本和資本支出後,所能自由運用的現金,是評估企業財務健康與成長潛力的關鍵指標。持續為正顯示公司有能力自我造血並回饋股東,而持續為負則可能暗示其正處於擴張期或面臨資金壓力。 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `period` | `5` | `5` | | `operator` | `>`、`<` | `'>'` | ```python api.Block.con_tw('近五年自由現金流量<>0') ``` ### 近四季自由現金流量<>0 - `id`: `f28` - 邏輯:`近四季自由現金流量${O}0` - 說明:「近四季自由現金流量不為零」代表公司在過去一年中,扣除維持營運與擴張所需的資本支出後,仍有實際的現金流入或流出。若自由現金流量為正數,顯示公司具備強勁的現金生成能力,能自主運用資金進行再投資、償債或發放股利,是財務穩健的重要指標。反之,若為負數,則可能表示公司正在消耗現金,這需要進一步分析其原因,例如是否為高成長期的策略性投資,或是營運出現問題。 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `operator` | `>`、`<` | `'>'` | ```python api.Block.con_tw('近四季自由現金流量<>0') ``` ### 最近N季至少有S季毛利率<>P% - `id`: `f61` - 邏輯:`最近${N}季至少有${S}季毛利率${O}${P}%` - 說明:此條件用於評估企業的產品競爭力、成本控制穩定度或產業結構的根本性轉變。當設定為大於時(>P%),可用於篩選出獲利高且結構穩健的绩優股,或找出毛利率剛成功轉型、脫離毛三到四的轉機股;當設定為小於時(<P%),則可用於剔除成本受通膨侵蝕、或產業爆發價格戰的潛在地雷股。此積木是中長線選股策略中,用於動態調整基本面防禦力與獲利續航力的核心財務指標。 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `n` | `4`、`8`、`12`、`20`、`40` | `4` | | `s` | `2`、`3`、`4`、`6`、`9`、`12`、`16`、`20`、`32` | `2` | | `operator` | `>`、`<` | `'>'` | | `percent` | `20`、`30`、`40`、`50` | `20` | ```python api.Block.con_tw('最近N季至少有S季毛利率<>P%') ``` ### 最近N季至少有S季營益率<>P% - `id`: `f62` - 邏輯:`最近${N}季至少有${S}季營益率${O}${P}%` - 說明:此條件用於評估公司本業賺錢能力的穩定度。當設定為大於(>P%),能精選出本業獲利穩健、管銷費用控制得當的績優股,或正值營運規模化、展現「轉機性」的企業;當設定為小於(<P%),則可用於剔除本業不賺錢、費用率過高的虛胖公司。是中長線策略中確保「本業高度防禦力」的核心指標。 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `n` | `4`、`8`、`12`、`20`、`40` | `4` | | `s` | `2`、`3`、`4`、`6`、`9`、`12`、`16`、`20`、`32` | `2` | | `operator` | `>`、`<` | `'>'` | | `percent` | `10`、`20`、`30`、`40` | `10` | ```python api.Block.con_tw('最近N季至少有S季營益率<>P%') ``` ### 最近N季至少有S季稅前淨利率<>P% - `id`: `f63` - 邏輯:`最近${N}季至少有${S}季稅前淨利率${O}${P}%` - 說明:此條件結合了本業獲利與業外損益(如投資收益、匯兌損益、處分資產等),用於評估企業在排除稅負干擾前的綜合獲利水準。當設定為大於(>P%),常被用來發掘具備強大業外收益(如控股型公司、集團股)或本業加業外雙強的標的;若低於標準,則代表公司整體總體獲利能力面臨挑戰。 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `n` | `4`、`8`、`12`、`20`、`40` | `4` | | `s` | `2`、`3`、`4`、`6`、`9`、`12`、`16`、`20`、`32` | `2` | | `operator` | `>`、`<` | `'>'` | | `percent` | `5`、`10`、`20`、`30` | `5` | ```python api.Block.con_tw('最近N季至少有S季稅前淨利率<>P%') ``` ### 最近N季至少有S季稅後淨利率<>P% - `id`: `f64` - 邏輯:`最近${N}季至少有${S}季稅後淨利率${O}${P}%` - 說明:此條件代表公司最終留給股東的真實利潤比例。當設定為大於(>P%),代表公司具備長期且穩定的最終賺錢能力,是計算 EPS 與發放股利的最關鍵基石。此積木常與毛利率、營益率連動,用於確認公司是否具備實質的高獲利結構,能有效幫助初學者篩選出真正能幫股東賺錢的「長線護城河股」。 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `n` | `4`、`8`、`12`、`20`、`40` | `4` | | `s` | `2`、`3`、`4`、`6`、`9`、`12`、`16`、`20`、`32` | `2` | | `operator` | `>`、`<` | `'>'` | | `percent` | `0`、`5`、`10`、`20`、`30` | `0` | ```python api.Block.con_tw('最近N季至少有S季稅後淨利率<>P%') ``` ### 最近N季至少有S季股東權益報酬率(ROE)<>P% - `id`: `f66` - 邏輯:`最近${N}季至少有${S}季股東權益報酬率(ROE)${O}${P}%` - 說明:此條件用於評估公司運用股東資金的賺錢效率。當設定大於(>P%),能篩選出高度幫股東賺錢的優質企業,也是價值投資的核心指標;設定小於則能剔除資金運用效率低下的公司。 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `n` | `4`、`8`、`12`、`20`、`40` | `4` | | `s` | `2`、`3`、`4`、`6`、`9`、`12`、`16`、`20`、`32` | `2` | | `operator` | `>`、`<` | `'>'` | | `percent` | `15`、`20`、`25` | `15` | ```python api.Block.con_tw('最近N季至少有S季股東權益報酬率(ROE)<>P%') ``` ### 最近N季至少有S季資產報酬率(ROA)<>P% - `id`: `f67` - 邏輯:`最近${N}季至少有${S}季資產報酬率(ROA)${O}${P}%` - 說明:檢驗企業在 N 季中有 S 季的 ROA(每 100 元總資產能賺回幾元)大於或小於 P%。與 ROE 不同,ROA 將負債納入分母計算,能同時評估公司運用自有資金與借貸資金的總體效率。此積木常運用於金融業或高負債、高資產(如營建、面板)的產業篩選。 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `n` | `4`、`8`、`12`、`20`、`40` | `4` | | `s` | `2`、`3`、`4`、`6`、`9`、`12`、`16`、`20`、`32` | `2` | | `operator` | `>`、`<` | `'>'` | | `percent` | `8`、`12`、`16`、`20` | `8` | ```python api.Block.con_tw('最近N季至少有S季資產報酬率(ROA)<>P%') ``` ### 最近N季至少有S季自由現金流量<0 - `id`: `f69` - 邏輯:`最近${N}季至少有${S}季自由現金流量<0` - 說明:此條件是用於防範「黑字倒閉」的防守型積木。當觸發次數過高時,代表公司賺的都是應收帳款或死存貨,手上沒有真現金,常用於波段或存股策略中,一鍵剔除虛胖、有財務危機風險的地雷股。 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `n` | `4`、`8`、`12`、`20`、`40` | `4` | | `s` | `2`、`3`、`4`、`6`、`9`、`12`、`16`、`20`、`32` | `2` | ```python api.Block.con_tw('最近N季至少有S季自由現金流量<0') ``` ### 毛利率較上一季成長(衰退) - `id`: `f7` - 邏輯:`毛利率較上一季${O}` - 說明:毛利率較上一季成長,代表公司在產品或服務的銷售上,其核心獲利能力有所提升,這通常意味著成本控制得宜或產品議價能力增強。相反地,若毛利率衰退,則可能暗示公司面臨成本上升、市場競爭加劇或產品組合不佳等營運壓力。對於投資人而言,毛利率的季度變化是評估企業體質與未來獲利潛力的關鍵指標。 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `operator` | `>`(成長)、`<`(衰退) | `'>'` | ```python api.Block.con_tw('毛利率較上一季成長(衰退)') ``` ### 近四季稅前淨利率<>P% - `id`: `f77` - 邏輯:`近四季稅前淨利率${O}${P}%` - 說明:篩選出過去連續四個季度累計的『稅前淨利率』大於(或小於)特定門檻 P% 的企業。旨在過濾出具備強大定價能力、成本控管優異或具備高附加價值的『高獲利含金量』公司,並避開陷入價格戰或『做白工』的低毛利泥沼。 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `operator` | `<`、`>` | `'>'` | | `percent` | `0`、`5`、`10`、`20` | `10` | ```python api.Block.con_tw('近四季稅前淨利率<>P%') ``` ### 毛利率創歷史新高(新低) - `id`: `f8` - 邏輯:`毛利率創歷史${O}` - 說明:毛利率創歷史新高,代表公司在銷售產品或服務後,扣除直接生產成本所剩下的利潤比例達到前所未有的高峰,這通常意味著公司擁有強大的定價能力、有效的成本控制或產品組合優化,顯示其核心業務獲利能力顯著提升。反之,若毛利率創歷史新低,則可能暗示公司面臨激烈的市場競爭、成本大幅上升或產品缺乏競爭力,導致其主要業務的獲利空間受到嚴重擠壓。 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `operator` | `>`(新高)、`<`(新低) | `'>'` | ```python api.Block.con_tw('毛利率創歷史新高(新低)') ``` ### 毛利率<>P% - `id`: `f9` - 邏輯:`毛利率${O}${P}%` - 說明:「毛利率不等於P%」這個條件,意味著我們正在檢視公司的核心獲利能力,並觀察其毛利率是否偏離了某個預設的基準點或市場預期。這種偏離可能反映了公司在產品組合、成本結構或市場競爭態勢上的變化,是評估其經營效率與未來獲利潛力的重要指標。 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `operator` | `>`、`<` | `'>'` | | `percent` | `20`、`30`、`40`、`50` | `20` | ```python api.Block.con_tw('毛利率<>P%') ``` ### 現金報酬率<>P% - `id`: `f99` - 邏輯:`現金報酬率${O}${P}%` - 說明:現金報酬率=(自由現金流量+淨利息)/完整持有企業的財務成本,自由現金流量=近四季營運活動現金流量-資本支出,淨利息=利息收入-利息成本,完整持有企業的財務成本=公司市值+長期負債-現金。現金報酬率>P%(超級現金牛):這家公司不僅本業極度賺錢,而且收帳能力超強、擴廠開銷控制得宜。現金報酬率`、`<` | `'>'` | | `percent` | `0`、`10`、`20` | `0` | ```python api.Block.con_tw('現金報酬率<>P%') ``` --- ## 買賣家數差(1 個) ### 近N日買賣家數差<>0 - `id`: `c18` - 邏輯:`近${N}日買賣家數${O}0` - 說明:買賣家數差<0(負數=籌碼集中/大戶吃貨):代表『少數幾家券商(大戶)』買走了『多數券商(散戶)』倒出來的籌碼。籌碼從散戶流向大戶,籌碼穩定度極高,為後續拉升的強烈做多訊號。買賣家數差>0(正數=籌碼渙散/散戶接刀):代表『少數幾家券商(大戶)』把手上的滿坑滿谷的股票,倒給了『全台灣四面八方的散戶』。籌碼流向散戶,為極度危險的主力出貨訊號。 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `N` | `1`、`5`、`10`、`20`、`60`、`120`、`240` | `5` | | `operator` | `<`、`>` | `'>'` | ```python api.Block.con_tw('近N日買賣家數差<>0') ``` --- ## 資本支出(8 個) ### N年前資本支出佔股本率<>P% - `id`: `f85` - 邏輯:`${N}年前資本支出佔股本率${O}${P}%` - 說明:本策略往前回溯N年,抓取當時財報上的『資本支出』,將其除以『實收股本』計算出比例進行篩選。佔比>P%(大幅擴產):資本支出代表企業投資於購買土地、建廠、升級設備的真金白銀。當N年前的佔比極高,代表當年進行了極具攻擊性的擴產。如今N年過去,新廠房剛好落成投產,隨之而來的就是『營收天花板被打開』的業績大爆發。佔比持續` | `'>'` | | `percent` | `30`、`50`、`80`、`100`、`120` | `50` | ```python api.Block.con_tw('N年前資本支出佔股本率<>P%') ``` ### 季(年)資本支出佔股本率<>P% - `id`: `f86` - 邏輯:`今年累季資本支出佔股本率${O}${P}%` - 說明:本策略抓取個股最新財報中的『今年度累計資本支出』,除以『實收股本』計算出比例。佔比>P%(年度擴張達標/超標):消除單一季度的入帳時間差,證明公司在今年度確實維持著極高強度的資本投入。若此數值在Q2或Q3就已經超越去年全年,代表擴產進度大幅超前,是極強烈的長線利多。佔比持續低迷(擴張停滯):即使老闆在法說會上喊出百億擴廠計畫,但累計到Q3財報時,資本支出佔比依然極低,代表計畫可能延宕、遭遇瓶頸,或是客戶臨時抽單導致公司緊急煞車。 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `operator` | `<`、`>` | `'>'` | | `percent` | `30`、`50`、`80`、`100`、`120` | `50` | ```python api.Block.con_tw('季(年)資本支出佔股本率<>P%') ``` ### 今年累季資本支出佔股本率<>P% - `id`: `f87` - 邏輯:`今年累季資本支出佔股本率${O}${P}%` - 說明:本策略抓取個股最新財報中的『今年度累計資本支出』,除以『實收股本』計算出比例。佔比>P%(年度擴張達標/超標):消除單一季度的入帳時間差,證明公司在今年度確實維持著極高強度的資本投入。若此數值在Q2或Q3就已經超越去年全年,代表擴產進度大幅超前,是極強烈的長線利多。佔比持續低迷(擴張停滯):即使老闆在法說會上喊出百億擴廠計畫,但累計到Q3財報時,資本支出佔比依然極低,代表計畫可能延宕、遭遇瓶頸,或是客戶臨時抽單導致公司緊急煞車。 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `operator` | `<`、`>` | `'>'` | | `percent` | `30`、`50`、`80`、`100`、`120` | `50` | ```python api.Block.con_tw('今年累季資本支出佔股本率<>P%') ``` ### 最近一年資本支出年增率<>P% - `id`: `f88` - 邏輯:`最近一年資本支出年增率${O}${P}%` - 說明:本策略計算個股『最近一年的資本支出』,與『去年同期』進行對比,得出年增率百分比。年增率>P%(攻擊態勢確立):這代表公司打破了過去的常態,突然看見了極度明確且龐大的未來商機,因而大幅調高今年的資本支出預算。這是超級成長股『初升段』的強力背書。年增率<-P%(進入收割期或衰退期):代表擴廠階段結束,資本支出大幅踩煞車。若此時營收下滑,為產業步入寒冬;但若此時『營收維持高檔』,則代表公司進入了甜蜜的『現金流收割期』,具備發放高額股息的潛力。 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `operator` | `<`、`>` | `'>'` | | `percent` | `30`、`50`、`80`、`100`、`120` | `50` | ```python api.Block.con_tw('最近一年資本支出年增率<>P%') ``` ### 今年累季資本支出創近N年來新高 - `id`: `f89` - 邏輯:`今年累季資本支出創近${N}年來新高` - 說明:本策略抓取個股最新財報中的『今年度累計資本支出』,並將其與過去N年的『全年度總數值』進行陣列比對。創N年新高(破歷史天際線):企業的資本支出通常具備極強的週期性。當累計資本支出突破了過去5年甚至10年的天花板,這絕非單純的設備汰舊換新,而是代表該產業發生了『典範轉移』或迎來了具備霸權級地位的大客戶。這是長線超級成長股最具統治力的基本面訊號 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `N` | `1`、`2`、`3`、`4`、`5` | `3` | ```python api.Block.con_tw('今年累季資本支出創近N年來新高') ``` ### 近Y年內資本支出曾創下N年內新高 - `id`: `f90` - 邏輯:`近${Y}年內資本支出曾創下${N}年內新高` - 說明:本策略在時間軸上設定一個觀察區間,尋找在近Y年內是否曾出現『單年資本支出創下過去N年新高的歷史級擴產事件。意味著我們故意『跳過』了公司瘋狂砸錢的陣痛期。當初破紀錄的新廠房現在剛好落成投產,只要營收跟上,EPS 將會迎來毫無阻力的幾何級數爆發。 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `Y` | `1`、`2`、`3` | `2` | | `N` | `1`、`2`、`3`、`4`、`5` | `3` | ```python api.Block.con_tw('近Y年內資本支出曾創下N年內新高') ``` ### 今年累季資本支出佔現金比<>P% - `id`: `f91` - 邏輯:`今年累季資本支出佔現金比${O}${P}%` - 說明:今年累季資本支出佔現金比<>P%,本策略抓取個股最新財報中的『今年度累計資本支出』,將其除以『資產負債表上的現金及約當現金總額』,計算出比例。佔比>P%(高流動性風險/豪賭型擴張):例如佔比高達80%甚至超過100%。代表公司為了擴充產能,幾乎快把手上的流動現金給燒光了。如果此時本業沒賺錢,公司極度容易面臨資金鏈斷裂的破產危機,或必須被迫大量發行可轉債、辦理現金增資。 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `operator` | `<`、`>` | `'>'` | | `percent` | `30`、`50`、`80`、`100`、`120` | `50` | ```python api.Block.con_tw('今年累季資本支出佔現金比<>P%') ``` ### 再投資比率<>P% - `id`: `f92` - 邏輯:`再投資比率${O}${P}%` - 說明:本策略衡量公司將『賺來的淨利』再次投入於本業資產(或保留於公司內部)的比例。保留盈餘率=1-現金配息率。比率>P%(高再投資/攻擊型成長):例如比率高達70%甚至100%。代表公司正處於高速擴張期,認為『把錢留在公司投資新項目的報酬率,遠大於發還給股東』。這是孕育十年十倍股的搖籃,但股息殖利率通常極低。比率` | `'>'` | | `percent` | `30`、`50`、`80`、`100` | `50` | ```python api.Block.con_tw('再投資比率<>P%') ``` --- ## 跌深反彈(2 個) ### 跌破近D日低點後,已反彈超過P% - `id`: `o32` - 邏輯:`跌破近${D}日低點後,反彈不超過${P}%` - 說明:當股價跌破近期D日的低點時,通常會引發市場的恐慌性賣壓或停損賣盤,顯示短期趨勢轉弱。然而,若隨後股價能從低點迅速反彈超過P%,這代表在跌破低點後,市場出現了強勁的承接買盤,或是空頭力量已耗盡,形成一個潛在的「破底翻」格局。這種情況暗示股價可能已經完成築底,並準備展開一波反彈行情,是尋找轉折點的投資策略之一。 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `period` | `1`、`5`、`10`、`20`、`60`、`120`、`240` | `20` | | `percent` | `5`、`10`、`15`、`20`、`30` | `5` | ```python api.Block.con_tw('跌破近D日低點後,已反彈超過P%') ``` ### 跌破近D日低點後,已反彈不超過P% - `id`: `o34` - 邏輯:`跌破近${D}日低點後,已反彈不超過${P}%` - 說明:鎖定股價在跌破近 D 日(如一個月或一季)的新低點後,目前雖然有所回升,但回升幅度仍限制在 P% 以內。旨在篩選出處於『低檔震盪』或『築底階段』的標的,避開已經大幅飆漲的強勢股,尋求股價位階相對安全且具備補漲空間的進場機會。也可能股價反彈無力,可能只是「跌深反彈的休息站」,之後還有可能續跌(破底翻失敗) | 參數 | 合法值 | 預設值 | |------|--------|--------| | `period` | `1`、`5`、`10`、`20`、`60`、`120`、`240` | `20` | | `percent` | `5`、`10`、`15`、`20`、`30` | `5` | ```python api.Block.con_tw('跌破近D日低點後,已反彈不超過P%') ``` --- ## 近創新高(3 個) ### 今日收盤(開高低)距近D日最高價=歷史最高價(創歷史新高):代表這檔股票打破了自上市以來的價格天花板。此時此刻,歷史上『任何時間點』買進這檔股票的所有投資人,全部都處於獲利狀態。市場完全不存在『等回本就賣』的解套賣壓,股價進入動能最純粹的軋空或飆升期 - 無參數 ```python api.Block.con_tw('最近一日收盤價創歷史新高') ``` ### 最近一日收盤價創近N日新高(低) - `id`: `o95` - 邏輯:`最近一日收盤價創近${N}日新${A}` - 說明:本策略檢驗個股『最近一個交易日的收盤價』,是否大於『過去N個交易日內的最高收盤價』。代表股票結束了數週的沉悶盤整,短線動能瞬間爆發。N=60(季線):中期波段的黃金起漲點。通常伴隨著基本面營收的轉機,法人資金開始進駐。N=240(年線):長期趨勢大翻轉。能創一年新高的股票,其背後往往有著極為強大的產業結構性利多支撐,為長線超級大牛股的搖籃。 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `direction` | `high`(新高)、`low`(新低) | `'high'` | | `period` | `5`、`10`、`20`、`60`、`120`、`240` | `20` | ```python api.Block.con_tw('最近一日收盤價創近N日新高(低)') ``` --- ## 開盤強勢(4 個) ### 今日跳空漲>P% - `id`: `o17` - 邏輯:`今日收盤價跳空漲>${P}%` - 說明:當股價今日開盤價顯著高於昨日收盤價,形成一個未被交易填補的價格區間時,我們稱之為「跳空上漲」。這種現象通常代表市場在盤後或盤前接收到重大利多消息,導致買盤強勁湧入,使得股價直接跳過一段價格區間開出。若跳空漲幅超過P%,則顯示市場對該股票的預期極為樂觀,買方力道異常強勁,可能預示著股價將進入一段快速上漲的趨勢,但也需留意後續是否會出現獲利了結賣壓。 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `percent` | `3`、`5`、`7`、`9` | `3` | ```python api.Block.con_tw('今日跳空漲>P%') ``` ### 今日跳空跌>-P% - `id`: `o18` - 邏輯:`今日收盤價跳空跌>-${P}%` - 說明:「今日跳空跌>-P%」表示該股票今日開盤價較昨日收盤價大幅下跌,且跌幅超過P%。這通常反映市場對該股票或整體市場出現了重大的負面消息或恐慌情緒,導致開盤即出現賣壓宣洩。這種情況下,股價可能面臨進一步的下行壓力,但若跌幅過大,也可能吸引逢低買盤,形成短線反彈或回補跳空缺口。 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `percent` | `3`、`5`、`7`、`9`(傳入正負皆輸出負值) | `-3` | ```python api.Block.con_tw('今日跳空跌>-P%') ``` ### 開盤漲幅>P%,張數>n張 - `id`: `o3` - 邏輯:`開盤漲幅>${P}%,成交量>${V}張` - 說明:當一檔股票在開盤時即展現出超過P%的漲幅,並伴隨著高於n張的成交量,這通常意味著市場對該股有高度的關注與強勁的買盤。這種「價漲量增」的現象,可能預示著股價將延續強勢表現,或是突破關鍵壓力位,展現出強勁的攻擊力道。 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `percent` | `1`、`2`、`3`、`5`、`7`、`9` | `-3.5` | | `volume_threshold` | `100`、`300`、`500`、`1000` | `300` | | `times` | `1`、`2`、`3`、`4`、`5` | `1` | ```python api.Block.con_tw('開盤漲幅>P%,張數>n張') ``` ### 開盤漲跌幅>±P% - `id`: `o43` - 邏輯:`開盤漲跌幅>±${P}%` - 說明:「開盤漲跌幅大於±P%」代表該股票在開盤時出現了顯著的跳空上漲或下跌,形成所謂的「跳空缺口」現象。這通常暗示著市場對該標的在盤前累積了強烈的多空共識,可能是受到重大消息面影響,進而導致股價在開盤瞬間產生劇烈波動。這種情況值得密切關注,因為它可能預示著當日股價的趨勢方向,但也可能因過度反應而出現回補或反轉。 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `percent` | `3`、`5`、`7`、`9` | `3` | ```python api.Block.con_tw('開盤漲跌幅>±P%') ``` --- ## (未分類)(101 個) ### 董監持股比例<>P% - `id`: `dfunc1` - 邏輯:`董監持股比例${O}${P}%` - 說明:董監持股比例是指公司董事、監察人及其關係人所持有的股份佔公司總股數的百分比。當這個比例「高於P%」時,通常代表公司經營階層與股東的利益高度一致,他們對公司的未來發展深具信心,這有助於公司的長期穩定經營與股東權益的維護。反之,若比例「低於P%」,則可能暗示經營階層對公司前景的信心不足,或是其利益與一般股東存在潛在分歧,這在投資決策上可能需要更審慎的評估。 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `operator` | `<`、`>` | `'>'` | | `percent` | `30`、`40`、`50` | `40` | ```python api.Block.con_tw('董監持股比例<>P%') ``` ### 內部人持股創近N個月新低(高) - `id`: `dfunc10` - 邏輯:`內部人持股創近${D}個月新${A}` - 說明:「內部人持股創近N個月新低」代表公司內部關鍵人士,如董監事、經理人或大股東,在過去六個月內大幅減少了他們對公司股票的持有比例。這可能暗示他們對公司未來展望的信心減弱,或認為股價已達高點,但有時也可能僅是基於個人財務規劃的考量。 反之,「內部人持股創6個月新高」則表示這些內部人士在過去半年內顯著增加了對自家股票的持有。這通常被視為一個積極訊號,反映出最了解公司營運狀況的人對其未來發展抱持高度信心,認為目前股價被低估且具備上漲潛力。 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `period` | `1`、`2`、`3`、`4`、`5`、`6`、`9`、`12` | `6` | | `operator` | `>`(高)、`<`(低) | `'>'` | ```python api.Block.con_tw('內部人持股創近N個月新低(高)') ``` ### 內部人持股最近D個月內增加(減少) >2% - `id`: `dfunc11` - 邏輯:`內部人持股最近${D}個月內變動>±${P}%` - 說明:當內部人持股在最近D個月內顯著增加超過2%時,這通常被視為一個正向訊號,因為這些最了解公司營運狀況的人,正以實際行動表達對公司未來發展的信心。反之,若內部人持股大幅減少,則可能暗示他們認為股價已達高點,或對公司前景有所疑慮,這值得投資人密切關注。 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `period` | `1`、`2`、`3`、`4`、`5`、`6`、`9`、`12` | `3` | | `percent` | `3`、`5`、`10` | `2` | ```python api.Block.con_tw('內部人持股最近D個月內增加(減少) >2%') ``` ### 散戶(大戶)持股<>N張者之總持股,且周月增減<>P% - `id`: `dfunc12` - 邏輯:`持股${O}${N}張者之總持股,且${A}增減${O}${P}%` - 說明:當一檔股票的散戶持股比率在最近一週或一個月內下降至P%以下,這通常被視為市場籌碼趨於集中的訊號。它暗示著市場上的浮動籌碼減少,散戶的賣壓已逐漸釋放,或主力資金正在悄悄吸納籌碼,為未來的股價上漲奠定基礎。 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `n` | `5`、`10`、`20`、`30`、`50`、`100`、`200`、`400`、`600`、`800`、`1000` | `700` | | `period_type` | `week`(週)、`month`(月) | `'week'` | | `operator` | `<`、`>` | `'>'` | | `up_down` | `<`、`>` | `'up'` | | `percent` | `3`、`5`、`10` | `5` | ```python api.Block.con_tw('散戶(大戶)持股<>N張者之總持股,且周月增減<>P%') ``` ### 散戶(大戶)持股<>N張者之總持股,創周月新高,且持股超過一定比例 - `id`: `dfunc13` - 邏輯:`持股${O}${N}張者之總持股,創${A}新高,且持股比例>${P}%` - 說明:「持股大戶連3周(月)異動率<>P%」這個條件,主要在追蹤市場上具影響力的「大戶」或「主力」資金,在連續三週或三個月的時間內,其持股比例變動的幅度是否超過P%。當異動率顯著時,代表大戶資金正在積極調整部位,預示著股價可能醞釀著較大的波動或趨勢轉變;反之,若異動率偏低,則顯示大戶持股相對穩定,市場可能處於盤整或觀望階段。 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `up_down` | `<`、`>` | `'up'` | | `n` | `5`、`10`、`20`、`30`、`50`、`100`、`200`、`400`、`600`、`800`、`1000` | `700` | | `period_type` | `week`(周)、`month`(月) | `'month'` | | `percent` | `30`、`40`、`50` | `30` | ```python api.Block.con_tw('散戶(大戶)持股<>N張者之總持股,創周月新高,且持股超過一定比例') ``` ### 散戶(大戶)持股<>N張者之總持股,N周/月前<>P% - `id`: `dfunc14` - 邏輯:`持股${O}${N}張者之總持股,${T}${A}月前${O}${P}%` - 說明:這個條件主要在觀察市場上「聰明錢」與「散戶」資金流向的變化。當大戶持股比率連續三週成長,通常暗示主力資金對後市抱持樂觀態度,正在悄悄吸籌;反之,若散戶持股比率持續增加,則可能需警惕市場籌碼趨於凌亂,或主力有出貨的疑慮。 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `n` | `5`、`10`、`20`、`30`、`50`、`100`、`200`、`400`、`600`、`800`、`1000` | `700` | | `period` | `1`、`2`、`3`、`4`、`5`、`6`、`9`、`12` | `3` | | `period_type` | `周`、`月` | `'week'` | | `operator` | `<`、`>` | `'>'` | | `up_down` | `<`、`>` | `'up'` | | `percent` | `30`、`40`、`50` | `30` | ```python api.Block.con_tw('散戶(大戶)持股<>N張者之總持股,N周/月前<>P%') ``` ### 散戶(大戶)持股<>N張者之總持股,連N周/月增加/衰退,且持股超過一定比例 - `id`: `dfunc15` - 邏輯:`持股${O}${N}張者之總持股,連${T}${A}${B},且持股超過>${P}%` - 說明:這個指標追蹤的是市場上主要投資者(大戶)與散戶投資者持股比例的變化。當大戶持股比率創下新低(或散戶持股比率創下新高)時,通常暗示籌碼正從專業投資者手中流向一般散戶,這可能預示著股價上漲動能減弱或潛在的賣壓。反之,若大戶持股比率創下新高(或散戶持股比率創下新低),則可能代表籌碼正集中於專業投資者手中,這通常被視為股價未來有較大上漲潛力的積極訊號。 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `up_down` | `<`、`>` | `'up'` | | `n` | `5`、`10`、`20`、`30`、`50`、`100`、`200`、`400`、`600`、`800`、`1000` | `700` | | `times` | `1`、`2`、`3`、`4`、`5`、`6`、`9`、`12` | `3` | | `period_type` | `周`、`月` | `'week'` | | `operator` | `>`(增)、`<`(減) | `'>'` | | `percent` | `30`、`40`、`50` | `30` | ```python api.Block.con_tw('散戶(大戶)持股<>N張者之總持股,連N周/月增加/衰退,且持股超過一定比例') ``` ### 散戶(大戶)持股<>N張者之總持股,連N周/月變動超過P% - `id`: `dfunc16` - 邏輯:`持股${O}${N}張者之總持股,連${T}${A}變動超過${P}%` - 說明:觀察一檔股票在一段連續的時間內,是不是被資金雄厚的人(大戶)大量買走,還是被倒貨給了一般投資人(散戶),若找出「大戶連續幾週大買,散戶連續幾週大賣」的股票,就是跟著有錢人上車,勝率自然會大幅提高 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `up_down` | `<`、`>` | `'up'` | | `n` | `5`、`10`、`20`、`30`、`50`、`100`、`200`、`400`、`600`、`800`、`1000` | `700` | | `times` | `1`、`2`、`3`、`4`、`5`、`6`、`9`、`12` | `3` | | `period_type` | `周`、`月` | `'week'` | | `percent` | `0`、`3`、`5`、`10` | `3` | ```python api.Block.con_tw('散戶(大戶)持股<>N張者之總持股,連N周/月變動超過P%') ``` ### 董監持股比例創近N個月內新高(低) - `id`: `dfunc2` - 邏輯:`董監持股比例創近${D}月內新${A}` - 說明:當董監事持股比例創下近N個月內新高時,這通常代表公司內部人對未來營運前景深具信心,願意增加持股與公司共存共榮,這也可能意味著公司治理結構趨於穩定。反之,若董監事持股比例創下新低,則可能暗示內部人對公司未來發展抱持較為保守的態度,甚至可能存在潛在的經營風險或對股價表現缺乏信心。 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `period` | `3`、`6`、`9`、`12`、`24`、`36` | `5` | | `operator` | `>`(高)、`<`(低) | `'>'` | ```python api.Block.con_tw('董監持股比例創近N個月內新高(低)') ``` ### 近N個月內董監持股比例 >增加/減少P% - `id`: `dfunc3` - 邏輯:`近${N}個月內董監持股比例>${H}${P}%` - 說明:這個條件是在觀察公司內部人(董監事)在近N個月內對自家股票的態度變化。當董監事持股比例增加P%以上時,通常被視為內部人看好公司未來發展,願意加碼投資的訊號;反之,若持股比例減少P%以上,則可能暗示內部人對公司前景有所疑慮,或是出於個人財務規劃而減持。 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `period` | `3`、`6`、`9`、`12`、`24`、`36` | `3` | | `operator` | `>`(增)、`<`(減) | `'>'` | | `percent` | `2`、`5`、`10` | `5` | ```python api.Block.con_tw('近N個月內董監持股比例 >增加/減少P%') ``` ### 持股N張以上大戶,周月增減<>P% - `id`: `dfunc4` - 邏輯:`持股${N}張以上大戶,${A}增減${O}${P}%` - 說明:這個條件著重分析持有N張以上股票的大戶,其在週或月度時間內持股比例的變化。這項數據是觀察市場主力資金動向的重要指標,當大戶持股顯著增加時,通常代表他們看好後市,可能預示股價有上漲潛力;反之,若持股減少,則可能暗示股價面臨壓力。 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `n` | `100`、`200`、`400`、`600`、`800`、`1000` | `700` | | `period_type` | `周`、`月` | `'week'` | | `operator` | `<`、`>` | `'>'` | | `percent` | `3`、`5`、`10` | `5` | ```python api.Block.con_tw('持股N張以上大戶,周月增減<>P%') ``` ### 持股N張以上大戶,周月創新高%,且持股超過一定比例 - `id`: `dfunc5` - 邏輯:`持股${N}張以上大戶,${A}創新高%,且持股比例超過>${P}%` - 說明:這個條件顯示,市場上持有大量股份的「大戶」或機構投資者,其持股比例在近期(週、月)持續創下新高,並且這些大戶的總持股已達到相當高的比例。這通常被視為一個強烈的看漲訊號,暗示著這些具影響力的資金對公司前景高度看好,並正在積極地進行籌碼集中,未來股價上漲的潛力值得關注。 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `n` | `100`、`200`、`400`、`600`、`800`、`1000` | `700` | | `period_type` | `周`、`月` | `'week'` | | `percent` | `30`、`40`、`50` | `70` | | `operator` | `<`、`>` | `'>'` | | `period` | `10`、`20`、`30` | `6` | ```python api.Block.con_tw('持股N張以上大戶,周月創新高%,且持股超過一定比例') ``` ### 持股N張以上大戶,N周/月前<>P% - `id`: `dfunc6` - 邏輯:`持股${N}張以上大戶,${T}${A}前${O}${P}%` - 說明:這個條件旨在分析市場上「大戶」的資金流向,特別是那些持股N張以上的主要投資者,在N週/月前其持股比例相較於現在的變化。當大戶持股增加P%時,這通常被視為「聰明錢」正在積極進場佈局,暗示他們對該股後市抱持樂觀態度;反之,若持股減少P%,則可能意味著大戶正在獲利了結或對未來走勢轉趨保守,投資人應密切關注其潛在影響。 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `n` | `100`、`200`、`400`、`600`、`800`、`1000` | `700` | | `period` | `1`、`2`、`3`、`4`、`5`、`6`、`9`、`12` | `6` | | `period_type` | `周`、`月` | `'week'` | | `operator` | `<`、`>` | `'>'` | | `percent` | `30`、`40`、`50` | `5` | ```python api.Block.con_tw('持股N張以上大戶,N周/月前<>P%') ``` ### 持股N張以上大戶,連N周/月增加/衰退,且持股超過一定比例 - `id`: `dfunc7` - 邏輯:`持股${N}張以上大戶,連${T}${A}${H},且持股比例>${P}%` - 說明:這個條件主要觀察市場上「大戶」的資金流向,當持有大量股票的投資者,其持股比例連續數週或數月呈現增加(或衰退)趨勢,且總持股已達一定比例時,這代表著市場上具影響力的資金正在持續地買入(或賣出)該檔股票。這種現象通常被視為股價未來走勢的重要領先指標,反映了專業投資者對公司基本面或未來展望的看法。 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `n` | `100`、`200`、`400`、`600`、`800`、`1000` | `700` | | `times` | `1`、`2`、`3`、`4`、`5`、`6`、`9`、`12` | `3` | | `period_type` | `周`、`月` | `'week'` | | `operator` | `>`(增)、`<`(減) | `'>'` | | `percent` | `30`、`40`、`50` | `70` | ```python api.Block.con_tw('持股N張以上大戶,連N周/月增加/衰退,且持股超過一定比例') ``` ### 持股N張以上大戶,連N周/月變動超過P% - `id`: `dfunc8` - 邏輯:`持股${N}張以上大戶,連${D}${A}變動>±${P}%` - 說明:這個條件著重於追蹤市場上持有大量股票的「大戶」們,在連續N週或N個月內,其持股比例出現超過P%的顯著變化。這種持續性的增持或減持,通常被視為市場主力資金對該股票未來走勢的明確表態,預示著股價可能即將迎來一波較大的趨勢性變動。 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `n` | `100`、`200`、`400`、`600`、`800`、`1000` | `700` | | `times` | `1`、`2`、`3`、`4`、`5`、`6`、`9`、`12` | `3` | | `period_type` | `周`、`月` | `'week'` | | `percent` | `1`、`2`、`3`、`4`、`5` | `1` | ```python api.Block.con_tw('持股N張以上大戶,連N周/月變動超過P%') ``` ### 內部人持股<40% - `id`: `dfunc9` - 邏輯:`內部人持股${O}${P}%` - 說明:內部人持股低於40%,這表示公司經營團隊或大股東並未持有絕對多數的股權,其利益與外部股東的連結程度可能不如持股比例更高時緊密。這可能暗示著股權結構相對分散,或是內部人對公司未來發展的信心程度並非極高,因此在評估公司前景時,這是一個需要綜合考量的因素。 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `operator` | `<`、`>` | `'<'` | | `percent` | `30`、`40`、`50`、`60` | `40` | ```python api.Block.con_tw('內部人持股<40%') ``` ### 近D日個股Beta<>N倍 - `id`: `i14` - 邏輯:`近${period}日個股Beta${operator}${multiple}倍` - 說明:這個條件是在觀察個股在近D個交易日中,其股價波動相對於整體市場波動的敏感程度。當個股的Beta值偏離N倍時,代表該股票在近期市場漲跌時,其股價波動幅度會比市場平均波動幅度更劇烈(Beta > N倍)或更平穩(Beta < N倍)。這有助於評估個股的風險特性與潛在報酬率,是衡量其系統性風險的重要指標。 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `period` | `0`、`5`、`10`、`20`、`60`、`120`、`240` | `0` | | `operator` | `>`、`<` | `'>'` | | `multiple` | `0.5`、`0.8`、`1`、`1.2`、`1.5`、`2` | `1.0` | ```python api.Block.con_tw('近D日個股Beta<>N倍') ``` ### 未來D日內將除權息的股票 - `id`: `i25` - 邏輯:`未來${D}日內將除權息的股票` - 說明:幫助投資者提前掌握日曆行情,無論是想提前買進參與『配息與填息行情』,或是為了稅務考量而選擇『提前賣出避開除權息』,都能提供精準的時間預警 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `D` | `3`、`5`、`7`、`10`、`20` | `5` | ```python api.Block.con_tw('未來D日內將除權息的股票') ``` ### 今日個股Beta<>N倍 - `id`: `i26` - 邏輯:`今日個股Beta${O}${N}倍` - 說明:當我們說「今日個股Beta<>N倍」時,這表示我們正在觀察該個股相對於整體市場的波動程度。Beta值是用來衡量單一股票與市場整體走勢的相關性及波動性,如果Beta值大於1,代表這檔股票的波動性比市場平均更高,可能在市場上漲時漲更多,下跌時也跌更多;反之,如果Beta值小於1,則表示其波動性較低,相對穩定。 因此,「今日個股Beta<>N倍」這個條件,是在尋找那些波動性與市場平均值有顯著差異的股票,例如Beta值遠高於1(N>1)的股票可能適合追求高風險高報酬的投資者,而Beta值遠低於1(N<1)的股票則可能吸引尋求穩定性的投資者。 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `operator` | `<`、`>` | `'>'` | | `multiple` | `0.5`、`0.8`、`1`、`1.2`、`1.5`、`2` | `1.0` | ```python api.Block.con_tw('今日個股Beta<>N倍') ``` ### 今日個股Beta<>近D日平均Beta - `id`: `i27` - 邏輯:`今日個股Beta${O}近${D}日平均Beta` - 說明:今日Beta>平均Beta(向上突破):代表股性突然變得極度活潑,通常預示著熱錢湧入、題材發酵。今日Beta<平均Beta(向下跌破):代表股性轉趨冷卻,或開始與大盤走勢脫鉤。在大盤大跌時,這類標的往往成為資金避險的『防禦堡壘』。 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `operator` | `<`、`>` | `'>'` | | `D` | `5`、`10`、`20`、`60`、`120`、`240` | `20` | ```python api.Block.con_tw('今日個股Beta<>近D日平均Beta') ``` ### 市值>M億 - `id`: `i28` - 邏輯:`市值>${M}億` - 說明:這代表您正在尋找市值高於 M 億元的股票。旨在排除極易受人為操縱、流動性極差的微型股(水餃股/雞蛋水餃股),確保選股池中的標的具備基本的市場規模、法人認可度與抗風險能力。 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `value` | `10`、`20`、`30`、`50`、`100` | `50` | ```python api.Block.con_tw('市值>M億') ``` ### 大型股,100億<市值M億 - `id`: `i7` - 邏輯:`股本${operator}${value}億` - 說明:「股本」指的是一家公司發行的股票總額,是衡量公司規模的重要指標。當您設定「股本<>M億」這個條件時,是在篩選特定規模的企業,因為股本大小直接影響著股票的流動性、市場穩定性以及潛在的成長空間。 投資人會根據自身的風險偏好和投資策略,選擇不同股本規模的公司:例如,股本較大的公司通常流動性較好,股價波動相對穩定,但成長爆發力可能較小;而股本較小的公司則可能具備較高的成長潛力,但同時也伴隨著較高的波動性和流動性風險。 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `operator` | `>`、`<` | `'>'` | | `value` | `10`、`20`、`30`、`50`、`100` | `50` | ```python api.Block.con_tw('股本<>M億') ``` ### D日均線糾結`(上)、`<`(下) | `'>'` | ```python api.Block.con_tw('均線連三日持續向上(下)') ``` ### 今日收盤價突(跌)破近D日關鍵價格區間 - `id`: `m11` - 邏輯:`今日收盤價${A}破近${D}日關鍵價格區間` - 說明:「今日收盤價突破近D日關鍵價格區間」代表股價成功站穩在過去D天以來的重要壓力位之上,顯示市場買盤力道強勁,並可能預示著股價將擺脫先前的盤整或下跌格局。這是一個典型的「突破策略」訊號,意味著股價有機會開啟一波新的上漲趨勢,投資人會密切關注其後續動能。 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `operator` | `>`(突)、`<`(跌) | `'>'` | | `period` | `5`、`10`、`20`、`60`、`120`、`240` | `20` | ```python api.Block.con_tw('今日收盤價突(跌)破近D日關鍵價格區間') ``` ### 今日收盤價<>近D日關鍵價格P% - `id`: `m12` - 邏輯:`今日收盤價${O}近${D}日關鍵價格${P}%` - 說明:這個條件表示今日收盤價與過去D天內的某個「關鍵價格」產生了P%的顯著偏離。這種偏離可能代表市場情緒出現了重大轉變,或是股價正在形成新的趨勢,值得投資人密切關注。 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `operator` | `<`、`>` | `'>'` | | `period` | `5`、`10`、`20`、`60`、`120`、`240` | `20` | | `percent` | `5`、`10`、`15`、`20`、`30`、`40` | `5` | ```python api.Block.con_tw('今日收盤價<>近D日關鍵價格P%') ``` ### 今日收盤價在近D日關鍵價格附近P% - `id`: `m13` - 邏輯:`今日收盤價${O}近${D}日關鍵價格${P}%` - 說明:當今日收盤價落在近D日關鍵價格的P%範圍內時,這通常意味著股價正在一個重要的技術關卡附近進行盤整或測試。這種情況可能預示著市場正在重新評估該價格區間的支撐或壓力強度,並可能在短期內醞釀出方向性的突破或反轉。 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `period` | `5`、`10`、`20`、`60`、`120`、`240` | `20` | | `percent` | `1`、`2`、`3`、`4`、`5`、`10` | `3` | ```python api.Block.con_tw('今日收盤價在近D日關鍵價格附近P%') ``` ### 今日收盤價在近D日關鍵價格區間±P%內,再度爆量 - `id`: `m14` - 邏輯:`今日收盤價在近${D}日關鍵價格${P}%,且日成交量${O}5ma成交量${N}倍` - 說明:今日收盤價在近期關鍵價格區間內,並伴隨再次爆量,這是一個強烈的市場訊號,表明多空雙方正在此重要價位進行激烈的籌碼交換。這種情況通常預示著股價即將結束盤整,並可能在短期內選擇一個明確的方向,值得密切關注其後續走勢。 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `period` | `5`、`10`、`20`、`60`、`120`、`240` | `20` | | `percent` | `1`、`2`、`3`、`4`、`5`、`10` | `3` | | `n` | `1`、`1.5`、`2`、`3` | `2` | ```python api.Block.con_tw('今日收盤價在近D日關鍵價格區間±P%內,再度爆量') ``` ### D日均線<>T日均線 - `id`: `m16` - 邏輯:`${D}日均線${O}${T}日均線` - 說明:本策略比較『短週期(D日)』與『長週期(T日)』兩條移動平均線的相對位置。當短均線大於長均線(或向上穿越),稱為『黃金交叉』,代表近期市場動能強勁、趨勢轉多;反之,當短均線小於長均線(或向下跌破),稱為『死亡交叉』,代表近期動能衰退、趨勢轉空。旨在捕捉波段行情的起漲與起跌點。 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `period1` | `10`、`5`、`20`、`60`、`120`、`240` | `5` | | `operator` | `<`、`>` | `'>'` | | `period2` | `5`、`10`、`20`、`60`、`120`、`240` | `20` | ```python api.Block.con_tw('D日均線<>T日均線') ``` ### D日均線<>T日均線<>H日均線 - `id`: `m17` - 邏輯:`${D}日均線${O}${T}日均線${O}${H}日均線` - 說明:本策略同時檢視三條不同週期(短D、中T、長H)的移動平均線相對位置。當均線呈現『短D > 中T > 長H』時為多頭排列,代表短中長期的趨勢皆一致向上;反之若為『短D < 中T < 長H』則為空頭排列。旨在過濾單一均線的假突破雜訊,確認標的已進入穩定且明確的主升段或主跌段行情。 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `period1` | `5`、`10`、`20`、`60`、`120`、`240` | `5` | | `period2` | `5`、`10`、`20`、`60`、`120`、`240` | `20` | | `operator` | `<`、`>` | `'>'` | | `period3` | `5`、`10`、`20`、`60`、`120`、`240` | `60` | ```python api.Block.con_tw('D日均線<>T日均線<>H日均線') ``` ### 今日收盤價<>D日(周月)均線 - `id`: `m18` - 邏輯:`今日收盤價${O}${D}${A}均線` - 說明:向上突破均線(站上均線):代表今日的收盤價,正式超越了過去D個交易日所有買進者的『平均成本』。市場由虧損轉為獲利,多方氣氛點火,為波段起漲的基本條件。向下跌破均線(跌破均線):代表今日收盤價跌穿了過去D日的平均成本。市場陷入套牢恐慌,空方奪回主導權,為波段起跌或停損的防守底線。 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `operator` | `<`、`>` | `'crossup'` | | `period` | `5`、`10`、`20`、`60`、`120`、`240` | `20` | | `table` | `日_K`(日)、`週_K`(周)、`月_K`(月) | `'日_K'` | ```python api.Block.con_tw('今日收盤價<>D日(周月)均線') ``` ### 今日收盤價<>月(季年)線 - `id`: `m19` - 邏輯:`今日收盤價${O}${A}線` - 說明:站上季線(60日/13周):季線又稱『生命線』,因企業財報以季為單位。站上季線代表基本面轉機與中長線多頭的甦醒。站上年線(240日/52周):年線又稱『牛熊分界線』。突破年線代表該企業經歷了完整的產業谷底,正式開啟一到兩年的長線大牛市;反之跌破,則為長期熊市的開端 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `operator` | `crossdown`(<)、`crossup`(>) | `'crossup'` | | `period` | `20`(月)、`60`(季)、`240`(年) | `60` | ```python api.Block.con_tw('今日收盤價<>月(季年)線') ``` ### D日均線趨勢向上(下) - `id`: `m2` - 邏輯:`${D}日均線趨勢向${C}` - 說明:均線趨勢向上,代表均線之最新一日收盤價>最舊一日收盤價,代表股價保持持續上漲趨勢,反之均線趨勢向下,代表股價保持持續下跌趨勢,當趨勢形成時,除非有產生收盤價突破/跌破均線,否則方向不容易改變。 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `period` | `5`、`10`、`20`、`60`、`120`、`240` | `20` | | `operator` | `>`(上)、`<`(下) | `'>'` | ```python api.Block.con_tw('D日均線趨勢向上(下)') ``` ### 短期三均線糾結 - `id`: `m20` - 說明:這代表著過去一週、兩週與一個月進場的投資人,其平均持有成本幾乎完全重疊。市場失去了明確的趨勢,進入極度低波動的『窒息盤整區』。均線糾結本身不是買點,而是『觀測訊號』。糾結過後必然伴隨變盤(向上噴發或向下破底)。一旦出現『帶量長紅K突破糾結區』,即為勝率極高的主升段右側買點。 - 無參數 ```python api.Block.con_tw('短期三均線糾結') ``` ### 長期四均線糾結(5MA/10MA/20MA) - `id`: `m21` - 說明:這代表著過去一個月、一季、半年甚至一年內進場的所有投資人與外資法人,其『長短期持有成本已經完全歸零一致』。籌碼經歷了最徹底的換手與清洗。此為技術分析中威力最強的『長線築底訊號』。一旦伴隨基本面轉機(營收由虧轉盈),並以帶量長紅突破糾結區,往往會走出以『倍數』計算的超級大多頭行情。 - 無參數 ```python api.Block.con_tw('長期四均線糾結(5MA/10MA/20MA)') ``` ### 長期四均線糾結(5MA/10MA/20MA)(old) - `id`: `m21` - 邏輯:`長期四均線糾結(5MA/10MA/20MA)` - 說明:這代表著過去一個月、一季、半年甚至一年內進場的所有投資人與外資法人,其『長短期持有成本已經完全歸零一致』。籌碼經歷了最徹底的換手與清洗。此為技術分析中威力最強的『長線築底訊號』。一旦伴隨基本面轉機(營收由虧轉盈),並以帶量長紅突破糾結區,往往會走出以『倍數』計算的超級大多頭行情。 - 無參數 ```python api.Block.con_tw('長期四均線糾結(5MA/10MA/20MA)(old)') ``` ### 長期三均線糾結(60MA/120MA/240MA) - `id`: `m22` - 說明:季線代表『企業單季財報轉機』,半年線代表『產業庫存去化週期』,年線代表『總體經濟與大牛熊市分界』。當這三條線黏合,代表該公司的基本面利空已經出盡,市場中長期的籌碼歷經極度血腥的清洗與換手,法人的持倉成本完全一致。此時只要出現帶量突破,往往預示著『以年為單位』的超級主升段正式啟動。 - 無參數 ```python api.Block.con_tw('長期三均線糾結(60MA/120MA/240MA)') ``` ### 短期三均線多(空)頭排列 - `id`: `m23` - 邏輯:`短期三均線${A}頭排列` - 說明:多頭排列:收盤價>5MA>10MA>20MA,且三條均線的斜率皆為『向上』。代表『過去一週、過去兩週、過去一個月』進場的投資人全部處於獲利狀態,短線籌碼達到絕對的做多共識,為強勢飆股的主升段特徵。空頭排列:收盤價<5MA<10MA<20MA,且三條均線的斜率皆為『向下』。代表短、中、長線的買盤全部慘遭套牢,市場充滿恐慌性的停損賣壓,為『摸底必死』的絕對空方禁區。 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `operator` | `>`(多)、`<`(空) | `'>'` | ```python api.Block.con_tw('短期三均線多(空)頭排列') ``` ### 長期四均線多(空)頭排列 - `id`: `m24` - 邏輯:`長期四均線${A}頭排列` - 說明:多頭排列:收盤價>20MA>60MA>120MA>240MA,且三條均線的斜率皆為『向上』。代表『過去一週、過去兩週、過去一個月』進場的投資人全部處於獲利狀態,短線籌碼達到絕對的做多共識,為強勢飆股的主升段特徵。空頭排列:收盤價<20MA<60MA<120MA<240MA,且三條均線的斜率皆為『向下』。代表短、中、長線的買盤全部慘遭套牢,市場充滿恐慌性的停損賣壓,為『摸底必死』的絕對空方禁區。 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `operator` | `>`(多)、`<`(空) | `'>'` | ```python api.Block.con_tw('長期四均線多(空)頭排列') ``` ### 最近一日收盤價<>D日均線扣抵值 - `id`: `m25` - 邏輯:`最近一日收盤價${O}${D}日均線扣抵值` - 說明:今日股價>扣抵值表示均線準備向上翻揚(產生支撐力道)。如果今日股價<扣抵值表示均線準備向下彎折(產生蓋頭反壓) | 參數 | 合法值 | 預設值 | |------|--------|--------| | `operator` | `<`、`>` | `'>'` | | `period` | `5`、`10`、`20`、`60`、`120`、`240` | `20` | ```python api.Block.con_tw('最近一日收盤價<>D日均線扣抵值') ``` ### D日周月呈現多(空)頭排列 - `id`: `m3` - 邏輯:`${D}${A}呈現${E}頭排列` - 說明:「D日呈現多(空)頭排列」指的是不同天期移動平均線(例如5日、10日、20日等)的排列順序,用來判斷股價的趨勢強弱。當短期均線在上方,依序為中期、長期均線,且均線皆向上發散時,稱為「多頭排列」,代表股價處於強勁的上升趨勢,買盤力道強勁。 反之,若短期均線在下方,依序為中期、長期均線,且均線皆向下發散時,則為「空頭排列」,顯示股價正處於明顯的下跌趨勢,賣壓沉重。 這種排列型態是判斷市場整體趨勢的重要指標,有助於投資人確認目前是多方主導還是空方主導的格局。 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `operator` | `>`(多)、`<`(空) | `'>'` | ```python api.Block.con_tw('D日周月呈現多(空)頭排列') ``` ### D日短均線與長均線,黃金交叉(死亡交叉) - `id`: `m4` - 邏輯:`${D}日短均線與${W}日長均線,呈現${G}交叉` - 說明:當短期移動平均線向上穿越長期移動平均線時,形成「黃金交叉」,這通常被視為股價可能上漲的買入訊號,代表市場動能轉強。反之,若短期移動平均線向下穿越長期移動平均線,則形成「死亡交叉」,這通常被解讀為股價可能下跌的賣出訊號,暗示市場趨勢轉弱。 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `period1` | `5`、`10`、`20` | `5` | | `period2` | `20`、`60`、`120`、`240` | `20` | | `operator` | `>`(黃金)、`<`(死亡) | `'>'` | ```python api.Block.con_tw('D日短均線與長均線,黃金交叉(死亡交叉)') ``` ### 今日收盤價突(跌)破D日均線 - `id`: `m5` - 邏輯:`今日收盤價${A}破${D}${T}均線` - 說明:今日收盤價跌破D日均線,通常被視為短期或中期趨勢轉弱的訊號。這代表股價失去了該均線所提供的支撐力道,市場賣壓可能正在增強。投資人應留意後續股價可能面臨進一步下行的風險,並重新評估其持股策略。 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `operator` | `>`(突)、`<`(跌) | `'>'` | | `period` | `5`、`10`、`20` | `20` | | `table` | `日`、`周`、`月` | `'日_K'` | ```python api.Block.con_tw('今日收盤價突(跌)破D日均線') ``` ### 近N日内曾發生還原價向上突破/向下跌破 - `id`: `m6` - 邏輯:`近${D}日内曾發生${A}破還原價` - 說明:「還原價」是將除權息、增減資等因素納入考量後的股價,能更真實地反映股票的長期走勢。當還原價在近N日內向上突破,代表股價克服了重要的壓力位,顯示多方力量轉強,可能預示著一波上漲行情。反之,若還原價向下跌破,則表示股價跌破了關鍵支撐,空方力量佔優,可能面臨進一步下跌的風險。 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `n` | `5`、`10`、`20` | `3` | | `operator1` | `>`(突)、`<`(跌) | `'>'` | | `operator2` | `>`(突)、`<`(跌) | `'>'` | ```python api.Block.con_tw('近N日内曾發生還原價向上突破/向下跌破') ``` ### 今日收盤價(乖離率)<>D日均線P% - `id`: `m7` - 邏輯:`今日收盤價${O}${D}${T}均線價格${P}%` - 說明:「今日收盤價<>D日均線P%」這個條件,代表著當前股價相較於過去D日的平均成本線,產生了P%的乖離。這種乖離程度是判斷股價短期動能與市場情緒的重要指標:若乖離過大,可能暗示股價已出現超漲或超跌現象,值得關注其後續的修正或趨勢延續力道。 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `operator` | `<`、`>` | `'>'` | | `period` | `5`、`10`、`20`、`60`、`120`、`240` | `20` | | `table` | `日`、`周`、`月` | `'日_K'` | | `percent` | `5`、`10`、`20`、`30` | `5` | ```python api.Block.con_tw('今日收盤價(乖離率)<>D日均線P%') ``` ### 今日收盤價乖離<>P% - `id`: `m8` - 邏輯:`今日收盤價乖離${O}${P}%` - 說明:「今日收盤價乖離P%」指的是今日收盤價與某特定期間移動平均線的偏離程度達到P%。當乖離率為正P%時,表示股價已顯著高於其平均成本,可能暗示短期內股價過熱或上漲動能強勁;反之,若乖離率為負P%,則表示股價已顯著低於其平均成本,可能暗示短期內股價超跌或下跌動能強勁。 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `percent` | `5`、`10`、`20`、`50` | `5` | ```python api.Block.con_tw('今日收盤價乖離<>P%') ``` ### D日均線斜率<>0.4 - `id`: `m9` - 邏輯:`${D}日均線斜率${O}0.4` - 說明:「D日均線斜率」是衡量股價在D個交易日內趨勢方向與強度的重要指標。當其斜率不等於0.4時,這意味著市場的D日均線並未呈現一個特定且溫和的上升趨勢。這種情況可能暗示著股價正處於更為強勁的多頭或空頭格局,或是進入了盤整區間,而非穩步上揚的狀態。 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `period` | `5`、`10`、`20`、`60`、`120`、`240` | `20` | | `operator` | `<`、`>` | `'>'` | ```python api.Block.con_tw('D日均線斜率<>0.4') ``` ### D日均線斜率<>-0.4 - `id`: `m9` - 邏輯:`${D}日均線斜率${O}-0.4` - 說明:「D日均線斜率」代表著過去D天股價趨勢的方向與強度,它就像市場的「速度計」,顯示股價平均變化的快慢與方向。 當D日均線斜率不等於-0.4時,這表示股價的趨勢並非處於一個特定程度的溫和下跌狀態。這可能意味著股價的下跌趨勢較為緩和、呈現盤整,甚至已經轉為上升趨勢,或者反之,下跌趨勢更為劇烈,需要進一步觀察其具體數值來判斷。 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `period` | `5`、`10`、`20`、`60`、`120`、`240` | `20` | | `operator` | `<`、`>` | `'>'` | ```python api.Block.con_tw('D日均線斜率<>-0.4') ``` ### 股價在主力(融資)成本線±P%內 - `id`: `mfunc1` - 邏輯:`股價在主力(融資)成本線±${P}%內` - 說明:當股價落在主力或融資成本線的P%範圍內時,這表示目前股價與這些主要市場參與者的平均持股成本非常接近。這可能意味著主力資金尚未獲利或虧損不大,因此他們可能沒有強烈的賣出意願,甚至可能在成本線附近進行加碼或護盤操作,為股價提供一定的支撐。 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `percent1` | `3`、`5`、`10`、`15`、`20` | `20` | | `percent2` | `3`、`5`、`10`、`15`、`20`(傳入正負皆輸出負值) | `-10` | | `data` | `F`(融資成本線)、`Z`(主力成本線) | `'F'` | ```python api.Block.con_tw('股價在主力(融資)成本線±P%內') ``` ### 當沖比例<>P%,且今日股價振幅>K% - `id`: `mfunc10` - 邏輯:`當沖比例${O}${P}%,且今日股價振幅>${K}%` | 參數 | 合法值 | 預設值 | |------|--------|--------| | `operator` | `<`、`>` | `'>'` | | `percent` | `20`、`30`、`40` | `20` | | `k` | `5`、`10`、`15` | `5` | ```python api.Block.con_tw('當沖比例<>P%,且今日股價振幅>K%') ``` ### 主力成本線與融資成本線黃金交叉 - `id`: `mfunc11` - 邏輯:`前一日主力成本線<融資成本線,今日主力成本線>融資成本線` - 說明:「主力成本線與融資成本線黃金交叉」代表著市場上具影響力的主力資金,其平均持股成本已超越了融資交易者的平均成本。這通常被視為一個看漲訊號,暗示主力正在積極佈局,並可能預示著股價即將進入上升趨勢,因為主力資金的動向往往是股價變化的重要領先指標。 - 無參數 ```python api.Block.con_tw('主力成本線與融資成本線黃金交叉') ``` ### 主力成本線與融資成本線死亡交叉 - `id`: `mfunc12` - 邏輯:`前一日主力成本線>融資成本線,今日主力成本線<融資成本線` - 說明:當主力成本線跌破融資成本線,形成「死亡交叉」時,這通常意味著市場上主要大戶的持股成本已低於散戶融資買進的成本。這可能預示著主力資金正在獲利了結或逢低佈局,而融資部位則面臨較大的套牢壓力,進而對股價構成潛在的賣壓,顯示短期內股價上漲動能減弱。 - 無參數 ```python api.Block.con_tw('主力成本線與融資成本線死亡交叉') ``` ### 近D日融資/融券/借券賣出餘額(張)<>N日均量 - `id`: `mfunc14` - 邏輯:`近${D}日${A}餘額(張)${O}${N}日均量` - 說明:本策略將信用交易(融資、融券、借券賣出)的『未平倉總張數(餘額)』,與個股近 D 日的『日平均成交量』進行大小關係(大於或小於)的比較。旨在評估特定信用籌碼相較於市場日常流動性的『集中度』,用以預測未來可能發生的強烈軋空、殺融資(斷頭)或籌碼鎖死行情。 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `period` | `1`、`2`、`3`、`4`、`5`、`10`、`20` | `5` | | `data` | `F_balance`(融資)、`S_balance`(融券)、`B_balance`(借券賣出) | `'F_balance'` | | `operator` | `<`、`>` | `'>'` | | `n` | `10`、`20`、`30`、`40`、`50` | `20` | ```python api.Block.con_tw('近D日融資/融券/借券賣出餘額(張)<>N日均量') ``` ### 最近一日收盤價<>融資(主力)成本線 - `id`: `mfunc17` - 邏輯:`最近一日收盤價${O}${A}成本線` - 說明:與市場上『融資買進』,並將『今日收盤價』與這條成本線進行比對。收盤價>成本線(控盤者獲利中 / 支撐強勁):代表砸重金的主力或開槓桿的散戶目前都是賺錢的。主力有底氣繼續拉抬,而融資戶沒有還款壓力,這條線會成為極強的『鐵板支撐』。收盤價<成本線(控盤者套牢中/斷頭危機):代表大戶操盤失敗,或融資散戶全面虧損。一旦跌破這條線,會引發極度可怕的『解套賣壓』與『融資斷頭(多殺多)』,股價將進入易跌難漲的冰河期。 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `operator` | `<`、`>` | `'>'` | | `data` | `F`(融資成本線)、`Z`(主力成本線) | `'F'` | ```python api.Block.con_tw('最近一日收盤價<>融資(主力)成本線') ``` ### 收盤價突(跌)破主力(融資)成本線 - `id`: `mfunc2` - 邏輯:`股價${O}主力(融資)成本線` - 說明:當收盤價突然跌破主力或融資的成本線時,這通常意味著市場上的主要資金或融資部位已陷入虧損狀態。這種情況可能引發連鎖性的停損賣壓,進而加速股價的下跌,顯示市場對該股票的信心正快速流失。 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `operator` | `<`、`>` | `'>'` | | `data2` | `F`(融資成本線)、`Z`(主力成本線) | `'F'` | ```python api.Block.con_tw('收盤價突(跌)破主力(融資)成本線') ``` ### 近D日內融資使用率(融券使用率/融資維持率)增加P% - `id`: `mfunc3` - 邏輯:`近${D}日內融資使用率(融券使用率/融資維持率)增加${P}%` - 說明:融資使用率為融資餘額÷融資限額的比率,當近N日內融資使用率或融券使用率增加P%時,這分別反映出市場多空雙方的投機或避險活動正在升溫:融資使用率增加可能預示著股價動能增強,但同時也需警惕市場過熱風險;而融券使用率增加則暗示潛在賣壓或未來可能出現軋空行情。若為融資維持率增加P%,這通常是股價上漲的正面訊號,代表融資部位的安全性提高,投資人持股信心增強且追繳風險降低。 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `period` | `1`、`5`、`10`、`20` | `20` | | `value` | `10`、`20`、`30`、`40` | `10` | | `data` | `F_rate1`(融資使用率)、`S_rate`(融券使用率)、`F_rate2`(融資維持率) | `'S_rate'` | ```python api.Block.con_tw('近D日內融資使用率(融券使用率/融資維持率)增加P%') ``` ### 近D日內融資/融券/借券賣出餘額增加(減少)V張 - `id`: `mfunc3x` - 邏輯:`近${D}日內${A}餘額${O}${V}張` - 說明:「近N日內融資/融券/借券賣出餘額增加P張」這個技術條件,代表在短期內,市場上透過槓桿操作(融資)買入股票的部位,以及看空後市(融券、借券賣出)的部位都有顯著增加。這反映了市場上多空雙方的力量正在積聚,可能預示著股價波動性將會加劇,因為融資餘額的增加可能帶來潛在的賣壓,而融券/借券賣出的增加則顯示空方力量的增強,但也可能在股價上漲時引發軋空行情。 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `period` | `1`、`2`、`3`、`4`、`5`、`10`、`20` | `5` | | `data` | `F_balance`(融資)、`S_balance`(融券)、`B_balance`(借券賣出) | `'B_balance'` | | `operator` | `>`(增加)、`<`(減少) | `'<'` | | `value` | `500`、`1000`、`1500`、`2000` | `-2000` | ```python api.Block.con_tw('近D日內融資/融券/借券賣出餘額增加(減少)V張') ``` ### 近D日融資/融券/借券賣出餘額比例增(減)>±P% - `id`: `mfunc3y` - 邏輯:`近${D}日${A}餘額比例增(減)>±${P}%` - 說明:「近D日融券增(減)>±P%」這個條件,主要觀察在過去D個交易日內,市場上融券餘額的顯著變化。當融券餘額大幅增加時,通常反映市場看空情緒濃厚,但也可能為未來的軋空行情埋下伏筆;反之,若融券餘額顯著減少,則可能暗示空方回補或看空力道減弱,有利於股價止跌或反彈。 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `period` | `1`、`2`、`3`、`4`、`5`、`10`、`20` | `5` | | `data` | `F_balance`(融資)、`S_balance`(融券)、`B_balance`(借券賣出) | `'B_balance'` | | `value` | `20`、`30`、`40` | `20` | | `operator` | `<`、`>` | `'<'` | ```python api.Block.con_tw('近D日融資/融券/借券賣出餘額比例增(減)>±P%') ``` ### 近N日借券賣出張數/成交量 <> P% - `id`: `mfunc4` - 邏輯:`近${D}日借券賣出張數/成交量 ${O}${P}%` - 說明:這個條件是在檢視近N日以來,借券賣出張數佔總成交量的比例是否顯著偏離P%這個基準值。當此比例與P%出現較大差異時,無論是異常高或異常低,都代表市場對該股票的空方情緒出現不尋常的變化。這項指標能幫助我們判斷空方力量的活躍程度,進而評估股價未來可能的波動方向。 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `period` | `5`、`10`、`20` | `5` | | `operator` | `<`、`>` | `'>'` | | `percent` | `10`、`20`、`30`、`40` | `10` | ```python api.Block.con_tw('近N日借券賣出張數/成交量 <> P%') ``` ### 融資使用率/融券使用率<>P% - `id`: `mfunc5` - 邏輯:`融資使用率/融券使用率${O}${P}%` - 說明:這些是衡量市場槓桿操作與投資人情緒的重要指標。當「融資使用率」或「融券使用率」達到或超過某個百分比 (P%) 時,可能代表市場上的多空力量正在積聚,預示著潛在的行情轉折或波動加劇。而「融資維持率」若低於P%,則可能觸發追繳保證金,進而引發賣壓,是觀察市場風險的重要訊號。 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `operator` | `<`、`>` | `'>'` | | `percent` | `40`、`50`、`60`、`70`、`80` | `10` | | `data` | `S_rate`(融券使用率)、`F_rate1`(融資使用率)、`F_rate2`(融資維持率) | `'F_rate1'` | ```python api.Block.con_tw('融資使用率/融券使用率<>P%') ``` ### 融資維持率<>P% - `id`: `mfunc5x` - 邏輯:`融資維持率${O}${P}%` | 參數 | 合法值 | 預設值 | |------|--------|--------| | `operator` | `<`、`>` | `'>'` | | `percent` | `130`、`160` | `130` | ```python api.Block.con_tw('融資維持率<>P%') ``` ### 近D日融資(融券)使用率<> P%,但最近一次為反向,且現在融資維持率>130% - `id`: `mfunc6` - 邏輯:`近${D}日融資(融券)使用率${O}${P}%,但最近一次為反向,且現在融資維持率>130%` - 說明:「近N日融資(融券)使用率<> P%,但最近一次為反向,且現在融資維持率>130%」這個條件,揭示了市場上融資或融券交易活動的動態轉變,即在一段時間的特定趨勢後,近期出現了方向性的反轉,這可能預示著市場情緒或資金流向的潛在轉折。同時,融資維持率仍高於130%,表明市場的槓桿風險相對可控,降低了因追繳而引發賣壓的可能性。 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `period` | `5`、`10`、`20` | `5` | | `operator` | `<`、`>` | `'>'` | | `percent` | `40`、`50`、`60`、`70`、`80` | `130` | | `data` | `S_rate`(融券使用率)、`F_rate1`(融資使用率)、`F_rate2`(融資維持率) | `'F_rate2'` | ```python api.Block.con_tw('近D日融資(融券)使用率<> P%,但最近一次為反向,且現在融資維持率>130%') ``` ### 近D日融資維持率>130% - `id`: `mfunc6x` - 邏輯:`近${D}日融資維持率>130%` | 參數 | 合法值 | 預設值 | |------|--------|--------| | `period` | `2`、`3`、`4`、`5`、`6` | `5` | ```python api.Block.con_tw('近D日融資維持率>130%') ``` ### 券資比<>P%, 成交金額` | `'>'` | | `percent` | `10`、`20`、`30`、`40`、`50`、`60`、`70`、`80` | `30` | | `value` | `1`、`2`、`5`、`10` | `100` | ```python api.Block.con_tw('券資比<>P%, 成交金額 p%, 且成交張數>N張 - `id`: `mfunc8` - 邏輯:`當沖比例${O}${P}%, 且成交張數>${N}張` - 說明:當沖比例偏離常態水平(無論是顯著偏高或偏低),同時伴隨著龐大的成交張數,這通常意味著市場對該股的關注度極高,且有大量資金在其中進行短線操作或換手。這種現象預示著股價可能處於關鍵轉折點,或是市場情緒正在劇烈變化,值得密切觀察其後續走勢。 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `operator` | `<`、`>` | `'>'` | | `percent` | `20`、`30`、`40` | `10` | | `n` | `500`、`1000`、`2000`、`3000`、`5000`、`10000`、`20000` | `3000` | ```python api.Block.con_tw('當沖比例 <> p%, 且成交張數>N張') ``` ### 當沖比例<>P% - `id`: `mfunc9` - 邏輯:`當沖比例${O}${P}%` - 說明:當沖比率是指當日交易量中,當沖交易(即當天買賣並沖銷)所佔的比例。當當沖比率高於或低於某個特定百分比(P%)時,可能反映市場情緒的變化:高當沖比率通常意味著市場短期投機氣氛濃厚,股價波動可能加劇;而低當沖比率則可能表示市場參與者傾向於長期持有,或是觀望氣氛較濃。 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `operator` | `<`、`>` | `'>'` | | `percent` | `20`、`30`、`40` | `10` | ```python api.Block.con_tw('當沖比例<>P%') ``` ### 近D日區間振幅排行前N名 - `id`: `r28` - 邏輯:`近D日區間振幅排行前${N}名` - 說明:本策略計算個股在近 D 日內,『區間最高價』與『區間最低價』的差額,並除以『區間期初收盤價』(或前一日收盤價),得出該期間的總震盪幅度(%),最後將全市場個股進行由大到小的排序,取出前 N 名。此指標旨在篩選出市場上目前股價『波動最劇烈、洗盤最兇狠、極具短線爆發力』的焦點股。 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `top_n` | `30`、`50`、`100`、`150`、`200`、`500`、`1000` | `50` | | `period` | `1`、`2`、`3`、`4`、`5`、`10`、`20`、`60`、`120`、`240` | `20` | ```python api.Block.con_tw('近D日區間振幅排行前N名') ``` ### 夏普指數排行前N名 - `id`: `r29` - 邏輯:`夏普指數排行前${N}名` - 說明:夏普指數指標是金融界最常用來衡量投資組合性價比的指標。公式是(預期年化報酬率-無風險利率)/年化標準差,以此排名 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `top_n` | `30`、`50`、`100`、`150`、`200`、`500`、`1000` | `50` | ```python api.Block.con_tw('夏普指數排行前N名') ``` ### 主力買賣超排行榜前N名 - `id`: `r3` - 邏輯:`主力${B}排行榜前${N}名` - 說明:主力買賣超排行榜,顧名思義,是追蹤市場上「主力」資金進出狀況的指標。它揭示了特定股票或整體市場中,大額交易者(通常指法人、大戶或內部人)的買賣動向,藉此判斷這些具影響力的資金對股價的態度。透過觀察主力買賣超的變化,投資人可以洞察市場的潛在趨勢,並作為評估個股未來走勢的重要參考依據。 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `direction` | `up`(買超)、`down`(賣超) | `'up'` | | `top_n` | `1`、`5`、`10`、`20`、`60`、`120`、`240` | `50` | ```python api.Block.con_tw('主力買賣超排行榜前N名') ``` ### 資本報酬率排行前N名 - `id`: `r30` - 邏輯:`資本報酬率排行前${N}名` - 說明:本策略計算全市場所有上市櫃公司的『資本報酬率,將其由高至低進行排序。進入前N 名(品質因子封頂):代表這家公司利用股東的錢(或包含借來的錢)去賺取利潤的效率,傲視全市場。這類公司通常擁有極強的『定價權』、極高的『無形資產(如專利、品牌)』或無可取代的『規模優勢(如先進製程代工)』。此為『品質因子』量化模型的核心樞紐。 長期持有資本報酬率霸榜的公司,其資產的複利成長速度將遠超大盤均值。 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `top_n` | `30`、`50`、`100`、`150`、`200`、`500`、`1000` | `50` | ```python api.Block.con_tw('資本報酬率排行前N名') ``` ### 盈餘報酬率排行前N名 - `id`: `r31` - 邏輯:`盈餘報酬率排行前${N}名` - 說明:本策略計算全市場上市櫃公司的『盈餘報酬率』,將其由高至低進行排序。盈餘報酬率:其為本益比的倒數。公式為每股盈餘÷每股股價。它代表著:『如果我今天用這個股價把這家公司買下來,它每年能幫我賺回百分之幾的收益?』進入前N名(超值煙蒂股或遭錯殺的好公司):代表這家公司的股價被市場極度低估,或是其獲利能力遠超其目前的市值表現,這類公司具備極高的安全邊際 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `top_n` | `30`、`50`、`100`、`150`、`200`、`500`、`1000` | `50` | ```python api.Block.con_tw('盈餘報酬率排行前N名') ``` ### 葛林布雷排行前N名 - `id`: `r32` - 邏輯:`葛林布雷排行前${N}名` - 說明:本策略同時參考資本報酬率與盈餘報酬率,根據名次加總後,找出排名數字較低,代表靠前排名的公司 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `top_n` | `30`、`50`、`100`、`150`、`200`、`500`、`1000` | `50` | ```python api.Block.con_tw('葛林布雷排行前N名') ``` ### 近D日,官股買(賣)超張數前N名 - `id`: `r4` - 邏輯:`近${D}日,官股${A}超張數前${N}名` - 說明:「近D日,官股買(賣)超張數前N名」這個條件,主要用於追蹤政府相關基金或八大行庫在近期特定天數內,對哪些個股進行了最大量的淨買入或淨賣出。這項數據常被視為判斷政府對市場態度、潛在護盤意圖或特定產業政策支持方向的重要參考指標。 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `period` | `1`、`5`、`10`、`20`、`60`、`120`、`240` | `20` | | `direction` | `買`、`賣` | `'up'` | | `top_n` | `10`、`20`、`30`、`40`、`50` | `50` | ```python api.Block.con_tw('近D日,官股買(賣)超張數前N名') ``` ### 法人買賣超排行前N名 - `id`: `r4` - 邏輯:`法人${B}排行前${N}名` - 說明:「法人買賣超排行」是觀察市場主力資金動向的重要指標,它揭示了三大法人(外資、投信、自營商)在特定時間內對個別股票的淨買入或淨賣出情況。 透過分析這些機構投資者的買賣超數據,我們可以洞察其對特定股票的態度,進而評估該股票未來的潛在走勢,因為法人資金龐大,其交易行為足以影響股價。 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `direction` | `買超`、`賣超` | `'up'` | | `top_n` | `1`、`5`、`10`、`20`、`60`、`120`、`240` | `50` | ```python api.Block.con_tw('法人買賣超排行前N名') ``` ### 近四季本益比排行前N名 - `id`: `r5` - 邏輯:`近四季本益比排行前${N}名` - 說明:這個條件指的是根據公司過去四個季度的累計盈餘計算出的本益比,並將其與其他公司進行比較排名。透過觀察「近四季本益比排行榜」,投資者可以快速篩選出相對被低估或高估的股票,作為價值投資或成長投資的初步參考依據。 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `top_n` | `5`、`10`、`100`、`150`、`200`、`500`、`1000` | `50` | ```python api.Block.con_tw('近四季本益比排行前N名') ``` ### 本益比排行前N名 - `id`: `r6` - 邏輯:`本益比排行前${N}名` - 說明:「本益比排行榜」是將股票依照其本益比(Price-to-Earnings Ratio, P/E)高低進行排序的列表,本益比是衡量股價相對於公司每股盈餘的指標。投資者通常利用此排行榜來快速篩選出相對便宜或昂貴的股票,作為評估投資價值和潛在風險的初步參考。然而,單純的本益比高低並非絕對的投資判斷依據,還需結合產業特性、公司成長性及整體市場狀況進行綜合分析,才能更全面地評估其合理性.「本益比排行榜」是將股票依照其本益比(Price-to-Earnings Ratio, P/E)高低進行排序的列表,本益比是衡量股價相對於公司每股盈餘的指標。投資者通常利用此排行榜來快速篩選出相對便宜或昂貴的股票,作為評估投資價值和潛在風險的初步參考。然而,單純的本益比高低並非絕對的投資判斷依據,還需結合產業特性、公司成長性及整體市場狀況進行綜合分析,才能更全面地評估其合理性。 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `top_n` | `5`、`10`、`100`、`150`、`200`、`500`、`1000` | `50` | ```python api.Block.con_tw('本益比排行前N名') ``` ### 近四季EPS排行前N名 - `id`: `r7` - 邏輯:`近四季EPS排行前${N}名` - 說明:「近四季EPS排行榜」是衡量一家公司在過去一年(四個季度)獲利能力的關鍵指標,透過將稅後淨利除以流通在外普通股股數,得出每股股票所賺取的盈餘。這個排行榜能幫助投資人快速篩選出獲利能力強勁且相對穩定的公司,因為它能有效平滑單一季度可能存在的季節性或一次性損益波動,提供更具參考價值的長期盈利趨勢。 投資者可藉此評估公司的基本面是否穩健,並作為進一步研究其成長性與投資價值的起點。 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `top_n` | `5`、`10`、`100`、`150`、`200`、`500`、`1000` | `50` | ```python api.Block.con_tw('近四季EPS排行前N名') ``` ### 成交金額排行前N名 - `id`: `r8` - 邏輯:`成交金額排行前${N}名` - 說明:「成交金額排行」是衡量市場資金流向與個股熱門程度的重要指標。它代表了在特定時間內,股票交易的總金額,而非單純的交易股數,因為不同股價的股票,即使交易股數相同,其成交金額也會有巨大差異。透過觀察成交金額排行,我們可以判斷哪些股票或產業板塊正受到市場的高度關注與資金追捧,進而掌握潛在的投資機會或市場趨勢. | 參數 | 合法值 | 預設值 | |------|--------|--------| | `top_n` | `5`、`10`、`100`、`150`、`200`、`500`、`1000` | `30` | | `value` | `50` | `50` | ```python api.Block.con_tw('成交金額排行前N名') ``` ### 成交量排名前30(股本小於50億) - `id`: `r9` - 邏輯:`成交量排名前${N}(股本小於${V}億)` - 說明:這個篩選條件著重於市場上「高流動性」與「高彈性」的標的。成交量排名前30確保了這些股票具有足夠的市場關注度與交易活絡度,便於資金進出;而股本小於50億則意味著這些公司在獲得資金青睞時,股價更容易產生顯著的波動與爆發力,是尋找潛在成長股或短期交易機會的有效策略。 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `top_n` | `30` | `30` | | `value` | `50` | `50` | ```python api.Block.con_tw('成交量排名前30(股本小於50億)') ``` ### 近N日期間外資/投信/自營/官股/三大買賣超 <> V張 - `id`: `s1` - 邏輯:`近${D}日期間${A}買賣超${O}${V}張` - 說明:這個條件主要在觀察特定期間內,市場上具影響力的法人機構(如外資、投信、自營商,甚至官股)對某檔股票的籌碼動向。當這些法人在近N日內出現顯著的買超或賣超N張時,通常代表他們對該股票的未來走勢有明確的看法。這類型的籌碼集中或分散,往往預示著股價可能即將出現較大的波動或趨勢轉變。 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `period` | `5`、`10`、`20`、`60`、`120`、`240` | `5` | | `field` | `W`(外資)、`T`(投信)、`Z`(自營)、`S`(三大法人) | `'W'` | | `operator` | `<`、`>` | `'>'` | | `n` | `0`、`500`、`1000`、`2000`、`3000`、`5000`、`10000`、`20000`、`50000` | `500` | ```python api.Block.con_tw('近N日期間外資/投信/自營/官股/三大買賣超 <> V張') ``` ### 官股買(賣)超>N張 - `id`: `s1` - 說明:「官股買超(或賣超)超過N張」指的是政府背景的金融機構在特定交易日中,對某檔股票的淨買進(或淨賣出)張數超過N張。這通常被視為市場上相對穩定的資金動向,因為官股券商的操作往往帶有政策性考量或穩定市場的意圖,其大額進出可能暗示著對特定股票的價值判斷或市場趨勢的預期。 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `n` | `500`、`1000`、`2000`、`3000`、`5000`、`10000` | `500` | | `operator` | `>`(買超)、`<`(賣超) | `'>'` | ```python api.Block.con_tw('官股買(賣)超>N張') ``` ### 近D日內,外資/投信/自營/三大持股買(賣)超前N名股票 - `id`: `s10` - 邏輯:`近${D}日內,${A}${B}超前${N}名股票` - 說明:這項條件著重於追蹤「三大法人」(外資、投信、自營商)在近N個交易日內,買賣超金額或張數排名前30名的個股。由於三大法人擁有龐大的資金與專業研究團隊,其集中買賣的標的,往往被視為市場資金流向與潛在趨勢變化的重要領先指標。觀察這些名單,有助於投資人掌握法人動向,判斷特定股票是否受到機構青睞或正在被調節。 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `period` | `1`、`5`、`10`、`20`、`60`、`120`、`240` | `5` | | `field` | `W`(外資)、`T`(投信)、`Z`(自營)、`S`(三大法人) | `'W'` | | `operator` | `>`(買)、`<`(賣) | `'>'` | | `top` | `10`、`20`、`30`、`40`、`50` | `30` | ```python api.Block.con_tw('近D日內,外資/投信/自營/三大持股買(賣)超前N名股票') ``` ### 股價<>外資/投信/自營成本線±% - `id`: `s11` - 邏輯:`股價${O}${A}成本線±${P}%` - 說明:這個條件是在觀察三大法人(外資、投信、自營商)目前持股的平均成本與市價之間的關係。當他們的持股成本線與市價有正負一定百分比的偏離時,這可以反映出這些主力資金的獲利或虧損狀況,進而推斷其未來的操作意圖,例如是持續加碼、獲利了結,還是停損出場的壓力。 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `operator` | `<`、`>` | `'>'` | | `field` | `W`(外資)、`T`(投信)、`Z`(自營)、`S`(三大法人) | `'W'` | | `percent` | `3`、`5`、`10`、`20` | `5` | ```python api.Block.con_tw('股價<>外資/投信/自營成本線±%') ``` ### 今日收盤價突(跌)破外資/投信/自營成本線 - `id`: `s12` - 邏輯:`今日收盤價${B}破${A}成本線` - 說明:當股價收盤跌破外資、投信或自營商的成本線時,這通常意味著這些主要法人機構的持股已陷入虧損狀態,可能引發停損賣壓。這不僅代表市場的支撐力道減弱,也暗示著該股票的短期趨勢可能轉為疲弱,投資人應留意後續的賣壓是否會持續擴大。 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `direction` | `突`、`跌` | `'突'` | | `field` | `W`(外資)、`T`(投信)、`Z`(自營)、`S`(三大法人) | `'W'` | ```python api.Block.con_tw('今日收盤價突(跌)破外資/投信/自營成本線') ``` ### 近D日內外資/投信/自營/三大法人買(賣)超超過N日 - `id`: `s13` - 邏輯:`近${D}日內${A}${B}超超過${N}日` - 說明:過濾掉短期刻意壓盤或調節的雜訊,精準識別法人在一段期間內的『整體籌碼偏好與囤貨(出貨)趨勢』。當高頻率買進時,代表法人對該標的具備強烈的波段企圖心。 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `period` | `5`、`10`、`20`、`60`、`120`、`240` | `10` | | `field` | `W`(外資)、`T`(投信)、`Z`(自營)、`S`(三大法人) | `'W'` | | `direction` | `買`、`賣` | `'買'` | | `threshold` | `3`、`4`、`6`、`8`、`12`、`15`、`36`、`48`、`72`、`84`、`144`、`192` | `3` | ```python api.Block.con_tw('近D日內外資/投信/自營/三大法人買(賣)超超過N日') ``` ### 近D日內外資/投信/自營其中有N個法人皆為買(賣)超>V張 - `id`: `s14` - 邏輯:`近${D}日內${A}其中有${N}個法人皆為${B}超>${V}張` - 說明:偵測在近日內,外資、投信、自營商三大法人中,是否有至少超過一個法人同時站在買方(或賣方)。這旨在捕捉市場中專業機構投資者的『共識強度』,代表資金匯集的力道越整齊,趨勢通常也更具延續性。 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `period` | `1`、`2`、`3`、`4`、`5`、`10`、`20`、`60`、`120`、`240` | `5` | | `n` | `1`、`2`、`3` | `1` | | `direction` | `買`、`賣` | `'買'` | | `v` | `0`、`10`、`20`、`30`、`40`、`50`、`60`、`70`、`80`、`90`、`100` | `0` | ```python api.Block.con_tw('近D日內外資/投信/自營其中有N個法人皆為買(賣)超>V張') ``` ### 近D日內外資(投信)買超佔股本比>P% - `id`: `s15` - 邏輯:`近${D}日內${A}買超佔股本比>${P}%` - 說明:當買超佔股本比例大於 P% 時,代表該法人正在針對這家公司進行高強度的『籌碼鎖定』。此指標能消弭大/小股本造成的絕對張數迷思,精準找出被法人重金壓注、籌碼高度集中的潛力飆股。 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `period` | `1`、`2`、`3`、`4`、`5`、`10`、`20`、`60`、`120`、`240` | `5` | | `field` | `W`(外資)、`T`(投信) | `'W'` | | `percent` | `1`、`3`、`5`、`10`、`15`、`20` | `1.0` | ```python api.Block.con_tw('近D日內外資(投信)買超佔股本比>P%') ``` ### 近D日外資/投信/自營/官股/三大買賣超 <> V張,且買賣超佔成交量比<>P% - `id`: `s1x` - 邏輯:`近${D}日${A}買賣超${O}${V}張,且買賣超佔成交量比${O}${P}%` - 說明:這個條件主要在分析特定法人(如外資、投信、自營商或官股)在近N個交易日內的資金動向。當這些主力買賣超的張數與佔總成交量的比例都達到顯著水準時,這代表該股票正受到特定法人的高度關注與操作,其資金流向往往是股價未來走勢的重要領先指標。 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `period` | `5`、`10`、`20`、`60`、`120`、`240` | `5` | | `field` | `W`(外資)、`T`(投信)、`Z`(自營)、`S`(三大法人) | `'W'` | | `n` | `500`、`1000`、`2000`、`3000`、`5000`、`10000`、`20000`、`50000` | `500` | | `operator` | `<`、`>` | `'>'` | | `percent` | `5`、`10`、`15`、`20`、`30`、`50` | `20` | ```python api.Block.con_tw('近D日外資/投信/自營/官股/三大買賣超 <> V張,且買賣超佔成交量比<>P%') ``` ### 近N日外資/投信/自營/官股/三大買賣超金額 <> 百萬 - `id`: `s2` - 邏輯:`近${D}日${A}買賣超金額${O}${M}百萬` - 說明:「近N日外資/投信/自營/官股/三大買賣超金額」這個條件,主要用來追蹤在特定N日內,市場上主要法人(外資、投信、自營商,甚至官股)對某檔股票的資金淨流入或淨流出狀況。當這些機構在短時間內累積了顯著的買超或賣超金額(例如達到百萬級別),這通常暗示著他們對該股票未來走勢有較為一致的看法或操作方向,是判斷市場主力動向的重要指標。 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `period` | `5`、`10`、`20`、`60`、`120`、`240` | `5` | | `field` | `W`(外資)、`T`(投信)、`Z`(自營)、`S`(三大法人) | `'W'` | | `operator` | `<`、`>` | `'>'` | | `n` | `10`、`20`、`30`、`50`、`100`、`200`、`500`、`1000`、`1500`、`2000` | `500` | ```python api.Block.con_tw('近N日外資/投信/自營/官股/三大買賣超金額 <> 百萬') ``` ### 外資/投信/自營/官股/三大買賣超張佔發行股本比<>P% - `id`: `s3` - 邏輯:`${A}買賣超張佔發行股本比${O}${P}%` - 說明:這個條件旨在深入分析主要機構投資者,包括外資、投信、自營商,以及官股等,在特定期間內對單一股票的淨買賣超行為。透過將這些買賣超張數換算為佔總發行股本的百分比(P%),我們能更精準地衡量這些具備資金與資訊優勢的法人,其資金流向對該股票籌碼集中度與未來股價潛在影響的程度。這項指標能有效揭示市場大戶的真實意圖,是判斷股價未來走勢的重要參考依據。 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `field` | `W`(外資)、`T`(投信)、`Z`(自營)、`S`(三大法人) | `'W'` | | `operator` | `<`、`>` | `'>'` | | `percent` | `5`、`10`、`15`、`20`、`30`、`50` | `2.0` | ```python api.Block.con_tw('外資/投信/自營/官股/三大買賣超張佔發行股本比<>P%') ``` ### 外資/投信/自營/三大持股張數<>V張,持股比率<>P% - `id`: `s4` - 邏輯:`${A}持股張數${O}${V}張, 持股比率${O}${P}%` - 說明:這個條件指的是三大法人(外資、投信、自營商)對特定股票的總持股張數與持股比率。當三大法人的持股張數或比率達到一定水準時,通常代表這些專業機構對該檔股票的未來表現抱持較為一致的看法,可能是看好其基本面或預期有特定利多事件發生。這種籌碼集中度高的情況,有助於股價在未來形成較強的支撐或推升動能。 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `field` | `W`(外資)、`T`(投信)、`Z`(自營)、`S`(三大法人) | `'W'` | | `n` | `500`、`1000`、`2000`、`3000`、`5000`、`10000`、`20000`、`50000` | `5000` | | `operator` | `<`、`>` | `'>'` | | `percent` | `5`、`10`、`15`、`20`、`30`、`50` | `20` | ```python api.Block.con_tw('外資/投信/自營/三大持股張數<>V張,持股比率<>P%') ``` ### 外資/投信/自營/三大持股市值<>N億元 - `id`: `s5` - 邏輯:`${A}持股市值${O}${N}億元` - 說明:當外資、投信、自營商這三大法人對某檔股票的持股金額超過N億元時,這代表這些市場上的主要資金力量對該公司展現了高度的信心與認同。這不僅顯示他們對公司基本面或未來展望的看好,也因為其龐大的資金量,可能對股價形成支撐或推升的動能,是市場上重要的參考指標。 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `field` | `W`(外資)、`T`(投信)、`Z`(自營)、`S`(三大法人) | `'W'` | | `operator` | `<`、`>` | `'>'` | | `n` | `0.5`、`1`、`2`、`5`、`10`、`20`、`50` | `20` | ```python api.Block.con_tw('外資/投信/自營/三大持股市值<>N億元') ``` ### 連續D日外資/投信/自營買賣超 , 累計<>V張數 - `id`: `s6` - 邏輯:`連續${D}日${A}皆${B}超 , 累計${O}${V}張` - 說明:這個條件追蹤的是三大法人(外資、投信、自營商)在連續N個交易日內,對特定股票進行的持續性買超或賣超行為。當這些市場主力在一段時間內累積了大量的買超或賣超張數,這通常代表他們對該股票的未來走勢有著明確且一致的看法。這種持續性的資金流向,往往是股價未來動能的重要領先指標。 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `period` | `2`、`3`、`4`、`5`、`6`、`8`、`10`、`20`、`60`、`120`、`240` | `3` | | `field` | `W`(外資)、`T`(投信)、`Z`(自營)、`S`(三大法人) | `'W'` | | `direction` | `buy`(買)、`sell`(賣) | `'buy'` | | `operator` | `<`、`>` | `'>='` | | `n` | `500`、`1000`、`2000`、`3000`、`5000`、`10000`、`20000` | `1000` | ```python api.Block.con_tw('連續D日外資/投信/自營買賣超 , 累計<>V張數') ``` ### 連續D日外資/投信/自營買賣超皆為0張 - `id`: `s6x` - 邏輯:`連續${D}日${A}買賣超 , 皆為0張` - 說明:鎖定特定期間(D日)內,外資、投信、自營商三大法人完全沒有任何買賣成交紀錄的標的。旨在識別出籌碼結構單純、僅由散戶或特定大戶(如公司派、主力)主導的『極靜態』標的,通常用於避開法人影響力,或尋找尚未被發掘的冷門轉機股。 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `days` | `2`、`3`、`4`、`5`、`6`、`8`、`10`、`20`、`60`、`120`、`240` | `3` | | `field` | `W`(外資)、`T`(投信)、`Z`(自營)、`S`(三大法人) | `'W'` | ```python api.Block.con_tw('連續D日外資/投信/自營買賣超皆為0張') ``` ### 外資/投信/自營/三大持股買賣超創近D日內新高(低) - `id`: `s7` - 邏輯:`${A}買賣超創近${D}日內${B}` - 說明:「外資/投信/自營/三大持股買賣超創新高(低)」代表著市場上最具影響力的三大法人(外資、投信、自營商)在特定時間內,對某檔股票或整體市場的買賣力道達到了前所未有的極端水平。 這種情況通常暗示著這些資金雄厚的機構投資者對該標的未來走勢形成了高度一致的看法,無論是極度看好而大舉買進,或是極度看壞而大量出脫。 由於三大法人的交易量佔台股總成交量比重高,其買賣超創新高(低)往往預示著股價可能出現加速上漲或下跌的趨勢,是判斷市場籌碼面強弱的重要指標。 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `field` | `W`(外資)、`T`(投信)、`Z`(自營)、`S`(三大法人) | `'W'` | | `period` | `2`、`3`、`4`、`5`、`6`、`8`、`10` | `5` | | `operator` | `>`(新高)、`<`(新低) | `'>'` | ```python api.Block.con_tw('外資/投信/自營/三大持股買賣超創近D日內新高(低)') ``` ### 外資/投信/自營/三大持股,前N日連續買(賣)超,今日轉賣(買) - `id`: `s8` - 邏輯:`${A}連續${D}日${B},今日轉${C}` - 說明:當外資、投信、自營商這三大法人在過去一段時間內對某檔股票呈現連續性的買超或賣超,通常代表著市場主力資金對該股的明確態度與趨勢推動。然而,若今日其操作方向突然反轉,從連續買超轉為賣超,或從連續賣超轉為買超,這可能預示著市場情緒或基本面出現變化,值得投資人警惕或關注潛在的轉折點。 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `field` | `W`(外資)、`T`(投信)、`Z`(自營)、`S`(三大法人) | `'W'` | | `period` | `2`、`3`、`4`、`5`、`6`、`8`、`10` | `5` | | `operator` | `>`(買超)、`<`(賣超) | `'>'` | ```python api.Block.con_tw('外資/投信/自營/三大持股,前N日連續買(賣)超,今日轉賣(買)') ``` ### 外資/投信/自營/三大法人 連續買(賣)超D日 - `id`: `s8x` - 邏輯:`${A}連續${B}超${D}日` | 參數 | 合法值 | 預設值 | |------|--------|--------| | `field` | `W`(外資)、`T`(投信)、`Z`(自營)、`S`(三大法人) | `'W'` | | `direction` | `買`、`賣` | `'買'` | | `days` | `2`、`3`、`4`、`5`、`6`、`8`、`10` | `3` | ```python api.Block.con_tw('外資/投信/自營/三大法人 連續買(賣)超D日') ``` ### 外資/投信/自營/三大法人買(賣)超,且股價在乖離線內±P% - `id`: `s9` - 邏輯:`${A}${B}超,且股價在乖離線內±P%` - 說明:這個條件指出,外資、投信、自營商等三大法人的持股成本或其主要交易區間,與當前股價的乖離程度不大。這意味著股價正處於這些主要機構投資者成本區間的附近,且波動幅度僅在P%以內,顯示籌碼相對穩定,可能正在進行整理或醞釀下一波行情。 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `field` | `W`(外資)、`T`(投信)、`Z`(自營)、`S`(三大法人) | `'W'` | | `percent` | `3`、`5`、`8`、`10` | `5` | ```python api.Block.con_tw('外資/投信/自營/三大法人買(賣)超,且股價在乖離線內±P%') ``` --- ==================================================================================================== # 美股積木完整參考 > 所屬章節:積木 Block(美股) > 以 SnowyOwl 實際載入的 `block_spec.json` 與 condition registry 產生,共 260 個積木 ## Overview 美股共 260 個積木。美股 Excel 規格未填次類別,因此全部歸在「(未分類)」;分類請改用 `list_conditions(category=..., market='us')` 的英文模組名。 積木名稱就是 `con` 的第一個參數。`合法值` 欄是 `get_table` 回報的可選值;`預設值` 是不指定該參數時 `con` 會填入的值。 ```python api.Block.con_us('<積木名稱>', <參數>=<值>) ``` --- ## (未分類)(260 個) ### 近四季本益比<>N倍 - `id`: `f1` - 邏輯:`近四季本益比${O}${N}倍` - 說明:「近四季本益比」是將公司股價除以過去四個季度累計的每股盈餘,用以評估其估值水平,相較於單一季度更能反映公司長期且穩定的獲利能力。當設定「近四季本益比<>N倍」時,這表示投資者正在篩選本益比不等於特定數值N的股票,藉此判斷股價是否被市場低估或高估,以尋找潛在的投資機會。 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `operator` | `>`、`<` | `'<'` | | `multiple` | `10`、`15`、`20`、`25`、`30` | `10` | ```python api.Block.con_us('近四季本益比<>N倍') ``` ### 近四季毛利率<>P% - `id`: `f10` - 邏輯:`近四季毛利率${O}${P}%` - 說明:「近四季毛利率」是指公司在過去一年(四個季度)的銷售收入中,扣除產品成本後所剩下的利潤百分比。這個指標是衡量企業核心獲利能力、產品定價權以及成本控制效率的關鍵。當我們設定一個「P%」的條件時,無論是高於或低於此百分比,都是在評估公司在產業中的競爭力與經營效率,例如,高毛利率通常意味著公司擁有較強的產品競爭力或成本優勢。 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `operator` | `>`、`<` | `'>'` | | `percent` | `20`、`30`、`40`、`50` | `20` | ```python api.Block.con_us('近四季毛利率<>P%') ``` ### 最近一月營收年增率<>累積月營收年增率 - `id`: `f100` - 邏輯:`最近一月營收年增率${O}累積月營收年增率` - 說明:單月YoY>累計YoY(動能黃金交叉/加速中):代表公司『最近一個月』的成長力道,已經超越了『今年以來的平均水準』。這意味著短期訂單突然爆發、新產能順利開出,或是產業景氣出現向上的重大轉折,是極強烈的右側起漲訊號。單月YoY<累計YoY(動能死亡交叉/減速中):代表公司短期的成長引擎開始熄火,雖然累計數字可能還是正的,但『最新的單月表現』已經在拖累整體平均。這通常是拉貨潮結束、客戶砍單的領先指標。 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `operator` | `>`、`<` | `'>'` | ```python api.Block.con_us('最近一月營收年增率<>累積月營收年增率') ``` ### 營益率較上一季成長(衰退) - `id`: `f11` - 邏輯:`營益率較上一季${O}` - 說明:當營益率較上一季成長時,這代表公司在核心業務上的獲利能力有所提升,可能是因為成本控制得宜、產品定價能力增強或營運效率改善。反之,若營益率衰退,則可能暗示公司面臨成本上升、競爭加劇導致毛利承壓,或是營運效率下滑等挑戰,值得投資人深入探究其背後的原因。 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `operator` | `>`(成長)、`<`(衰退) | `'>'` | ```python api.Block.con_us('營益率較上一季成長(衰退)') ``` ### 營益率創歷史新高(新低) - `id`: `f12` - 邏輯:`營益率創歷史${O}` - 說明:「營益率」衡量的是企業本業的獲利能力,也就是每創造一元營收能有多少營業利益。當營益率創歷史新高時,代表公司在核心業務上的營運效率、成本控制或產品定價能力達到前所未有的高峰,顯示其經營體質極為穩健,有助於提升市場對其未來成長與獲利能力的信心。 相反地,若營益率創歷史新低,則警示公司在核心業務獲利能力上出現嚴重衰退,可能反映出營運效率不彰、成本失控或市場競爭加劇導致定價能力受損,這通常會引發市場對公司財務健康狀況的擔憂,並可能影響其未來的投資價值。 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `operator` | `>`(新高)、`<`(新低) | `'>'` | ```python api.Block.con_us('營益率創歷史新高(新低)') ``` ### 營益率<>P% - `id`: `f13` - 邏輯:`營益率${O}${P}%` - 說明:「營益率」又稱營業利益率,是衡量企業本業獲利能力的重要指標,代表每1元的營業收入中,公司能賺取多少營業利益,反映了企業的經營效率與管理能力。 當您設定「營益率<>P%」這個條件時,表示您正在尋找那些營益率與特定百分比P%不符的公司,這有助於篩選出營運獲利能力顯著偏離市場平均、產業標準或您預設目標值的企業。 這種篩選方式能幫助您識別出具有獨特競爭優勢(營益率遠高於P%)或面臨營運挑戰(營益率遠低於P%)的標的,進而深入分析其背後的原因。 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `operator` | `>`、`<` | `'>'` | | `percent` | `10`、`20`、`30` | `10` | ```python api.Block.con_us('營益率<>P%') ``` ### 近四季營益率<>P% - `id`: `f14` - 邏輯:`近四季營益率${O}${P}%` - 說明:「近四季營益率」指的是公司在過去連續四個季度(即一整年)的營業利益率,這是一個衡量企業核心業務獲利能力和營運效率的重要指標。當這個數值「不等於 P%」時,代表公司的營運效率或獲利能力與某個特定基準或預期值出現了顯著的差異。這種差異可能暗示著公司在成本控制、產品定價或市場競爭力方面發生了變化,無論是正向的提升或負向的衰退,都值得投資人深入探究其背後的原因。 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `operator` | `>`、`<` | `'>'` | | `percent` | `10`、`20`、`30` | `10` | ```python api.Block.con_us('近四季營益率<>P%') ``` ### 稅後淨利率較上一季成長(衰退) - `id`: `f15` - 邏輯:`稅後淨利率較上一季${O}` - 說明:「稅後淨利率較上一季成長」代表公司在扣除所有成本與稅金後,每單位營收所能創造的實際利潤有所提升,這通常反映了公司營運效率的改善或產品組合的優化。反之,若「稅後淨利率較上一季衰退」,則可能暗示公司在成本控制、定價策略或市場競爭上遭遇挑戰,進而影響其獲利能力。 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `operator` | `>`(成長)、`<`(衰退) | `'>'` | ```python api.Block.con_us('稅後淨利率較上一季成長(衰退)') ``` ### 存貨周轉天數>N天 - `id`: `f19` - 邏輯:`存貨周轉天數${O}${N}天` - 說明:「存貨周轉天數大於N天」表示公司需要較長的時間才能將其庫存商品轉換為銷售收入。這通常暗示著產品銷售動能不足、市場需求疲軟,或是存貨管理效率出現問題,可能導致資金積壓並增加存貨跌價的風險。 雖然在某些產業(如鋼鐵業)存貨周轉天數本來就較長,但若與同業或公司歷史數據相比顯著拉長,則需警惕其對營運週轉金的影響及潛在的存貨滯銷風險。 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `operator` | `>`、`<` | `'>'` | | `days` | `50`、`100`、`150`、`200`、`300` | `100` | ```python api.Block.con_us('存貨周轉天數>N天') ``` ### 本益成長比<>N倍 - `id`: `f2` - 邏輯:`本益成長比${O}${N}倍` - 說明:本益成長比 (PEG ratio) 是一個衡量股票估值的重要指標,它將本益比 (P/E ratio) 與公司的預期盈餘成長率結合起來。當本益成長比低於N倍時,通常暗示著該股票相對於其成長潛力可能被低估,是尋找「成長股中的價值股」的有效工具。反之,若高於N倍,則可能表示市場對其成長預期過於樂觀,股價存在高估的風險。 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `operator` | `>`、`<` | `'<'` | | `multiple` | `1`、`1.25`、`1.5` | `1` | ```python api.Block.con_us('本益成長比<>N倍') ``` ### 季負債比率<>P% - `id`: `f20` - 邏輯:`季負債比率${O}${P}%` - 說明:季負債比率是衡量一家公司短期償債能力與財務槓桿程度的重要指標,它反映了公司總資產中有多少比例是透過負債來支應的。當這個比率高於或低於特定百分比(P%)時,可以作為評估公司財務風險與經營穩健性的一個參考點。一般而言,過高的負債比率可能意味著公司財務結構不夠穩健,而過低的負債比率則可能表示公司未充分利用財務槓桿來擴大營運。 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `operator` | `>`、`<` | `'>'` | | `percent` | `50`、`60`、`70`、`80` | `50` | ```python api.Block.con_us('季負債比率<>P%') ``` ### 季營業利益較去年同期 負轉正 - `id`: `f21` - 邏輯:`季營業利益較去年同期${O}` - 說明:「季營業利益較去年同期負轉正」代表公司在核心業務上實現了顯著的營運轉機,從去年的虧損狀態成功轉為獲利。這不僅顯示公司基本面正在好轉,也暗示其營運效率提升或市場需求回溫,對投資人而言是一個強烈的復甦訊號。 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `operator` | `>`(轉正)、`<`(轉負) | `'>'` | ```python api.Block.con_us('季營業利益較去年同期 負轉正') ``` ### 近四季股東權益報酬率(ROE) < P% - `id`: `f22` - 邏輯:`近四季股東權益報酬率(ROE) ${O}${P}%` - 說明:「近四季股東權益報酬率(ROE) < P%」這項條件,代表公司在過去一年中,利用股東投入的資本創造利潤的效率相對較低。這通常暗示著公司的獲利能力不佳,未能有效運用股東資金來產生足夠的回報,對於追求股東價值成長的投資者而言,這可能是一個需要謹慎評估的警訊。 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `operator` | `>`、`<` | `'>'` | | `percent` | `15`、`20`、`25` | `15` | ```python api.Block.con_us('近四季股東權益報酬率(ROE) < P%') ``` ### 近Y年平均股東權益報酬率(ROE) > P% - `id`: `f23` - 邏輯:`近${Y}年平均股東權益報酬率(ROE)${O}${P}%` - 說明:這項條件代表您正在尋找那些長期以來,能為股東創造豐厚回報的公司。股東權益報酬率(ROE)衡量的是公司利用股東投入的資金賺取利潤的效率,而近Y年平均ROE高於P%則顯示該公司在過去一段時間內,持續保持著卓越的獲利能力與經營效率。這通常意味著公司擁有穩固的競爭優勢、良好的管理團隊,以及健康的財務狀況,是價值投資者評估企業內在價值的重要指標。 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `period` | `3`、`5`、`8`、`10` | `3` | | `operator` | `>`、`<` | `'>'` | | `percent` | `15`、`20`、`25` | `15` | ```python api.Block.con_us('近Y年平均股東權益報酬率(ROE) > P%') ``` ### 近四季資產報酬率(ROA) < P% - `id`: `f24` - 邏輯:`近四季資產報酬率(ROA)${O}${P}%` - 說明:資產報酬率(ROA)是衡量公司運用其總資產創造獲利能力的指標。當近四季的資產報酬率低於P%時,這表示公司在運用其所有資產(包括自有資金和借款)來產生利潤的效率相對較低。這可能暗示公司的經營效率不佳,或是其資產配置未能有效轉化為收益,對於投資人而言,這代表該公司的獲利能力可能較弱,需要進一步探究其原因。 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `operator` | `>`、`<` | `'>'` | | `percent` | `8`、`12`、`16`、`20` | `8` | ```python api.Block.con_us('近四季資產報酬率(ROA) < P%') ``` ### 近Y年資產報酬率(ROA) > P% - `id`: `f25` - 邏輯:`近${Y}年資產報酬率(ROA)${O}${P}%` - 說明:這個條件代表公司在過去Y年內,運用其總資產創造利潤的效率非常高,平均每年資產報酬率都超過P%。這顯示公司管理層在資產運用上表現卓越,能有效將資產轉化為獲利,是評估公司經營效率和獲利能力的重要指標。 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `period` | `3`、`5`、`8`、`10` | `3` | | `operator` | `>`、`<` | `'>'` | | `percent` | `8`、`12`、`16`、`20` | `8` | ```python api.Block.con_us('近Y年資產報酬率(ROA) > P%') ``` ### 近一季EPS<>去年同一季EPS - `id`: `f26` - 邏輯:`近一季EPS${O}去年同一季EPS` - 說明:這個條件比較了公司最新一季的每股盈餘(EPS)與去年同期表現,主要目的是為了評估公司獲利能力的年成長或衰退狀況。透過與去年同期數據的比較,可以有效排除季節性因素的干擾,更精準地觀察公司營運體質的變化,判斷其獲利趨勢是持續成長、持平或正在惡化。 這項指標是評估公司基本面健康狀況的重要依據,其變化往往會直接影響市場對公司未來展望的預期與股價表現。 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `operator` | `>`(轉正)、`<`(轉負) | `'>'` | ```python api.Block.con_us('近一季EPS<>去年同一季EPS') ``` ### 近五年自由現金流量<>0 - `id`: `f27` - 邏輯:`近${Y}年自由現金流量${O}${P}` - 說明:「近五年自由現金流量不為零」這個條件,代表公司在過去五年中,每年都有產生或消耗自由現金流,而非處於收支平衡的狀態。自由現金流量是衡量公司在支付營運成本和資本支出後,所能自由運用的現金,是評估企業財務健康與成長潛力的關鍵指標。持續為正顯示公司有能力自我造血並回饋股東,而持續為負則可能暗示其正處於擴張期或面臨資金壓力。 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `period` | `5` | `5` | | `operator` | `>`、`<` | `'>'` | | `value` | `0` | `0` | ```python api.Block.con_us('近五年自由現金流量<>0') ``` ### 近四季自由現金流量<>0 - `id`: `f28` - 邏輯:`近四季自由現金流量${O}${P}` - 說明:「近四季自由現金流量不為零」代表公司在過去一年中,扣除維持營運與擴張所需的資本支出後,仍有實際的現金流入或流出。若自由現金流量為正數,顯示公司具備強勁的現金生成能力,能自主運用資金進行再投資、償債或發放股利,是財務穩健的重要指標。反之,若為負數,則可能表示公司正在消耗現金,這需要進一步分析其原因,例如是否為高成長期的策略性投資,或是營運出現問題。 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `operator` | `>`、`<` | `'>'` | | `value` | `0` | `0` | ```python api.Block.con_us('近四季自由現金流量<>0') ``` ### 近四季EPS>M元 - `id`: `f29` - 邏輯:`近四季EPS${O}${M}元` - 說明:「近四季EPS > M元」這個條件,代表公司在過去一年的營運中,每股賺取的稅後淨利超過了M元。這是一個衡量公司獲利能力的重要指標,顯示公司具有穩定的盈利基礎和良好的經營績效。 這項條件通常被視為公司基本面穩健的訊號,因為持續且高於一定水準的每股盈餘,反映了公司為股東創造價值的能力,也可能預示著未來股價的成長潛力。 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `operator` | `>`、`<` | `'>'` | | `amount` | `0`、`1`、`2`、`3`、`5`、`10`、`20` | `1` | ```python api.Block.con_us('近四季EPS>M元') ``` ### 股價淨值比<>N倍 - `id`: `f3` - 邏輯:`股價淨值比${O}${N}倍` - 說明:股價淨值比 (P/B ratio) 是衡量公司股價相對於其每股淨資產的指標,反映了市場對公司資產價值的認可程度。當股價淨值比偏離 N 倍時,可能暗示市場對公司資產價值的看法與其帳面價值存在差異,這通常被用來評估股票是被高估還是低估。 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `operator` | `>`、`<` | `'<'` | | `multiple` | `0.8`、`1`、`1.2`、`1.5`、`2` | `1` | ```python api.Block.con_us('股價淨值比<>N倍') ``` ### 累積每股盈餘(EPS)>M元 - `id`: `f30` - 邏輯:`累積每股盈餘(EPS)${O}${M}元` - 說明:當累積每股盈餘(EPS)超過M元時,這代表公司在特定期間內,為每一股股票所賺取的利潤表現優異,顯示其獲利能力強勁且財務狀況穩健。這通常被視為公司基本面良好的重要指標,有助於評估其內在價值與未來成長潛力。 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `operator` | `>`、`<` | `'>'` | | `amount` | `0`、`1`、`2`、`3`、`5`、`10`、`20` | `1` | ```python api.Block.con_us('累積每股盈餘(EPS)>M元') ``` ### 單季每股盈餘(EPS)>M元 - `id`: `f31` - 邏輯:`單季每股盈餘(EPS)${O}${M}元` - 說明:單季每股盈餘(EPS)大於M元,代表公司在最近一個季度內,為每一股流通在外的股票賺取了M元以上的利潤。這是一個衡量公司短期獲利能力的重要指標,顯示公司在該季度營運表現強勁,能為股東創造可觀的收益。 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `operator` | `>`、`<` | `'>'` | | `amount` | `0`、`1`、`2`、`3`、`5`、`10` | `1` | ```python api.Block.con_us('單季每股盈餘(EPS)>M元') ``` ### 全年EPS>M元 - `id`: `f32` - 邏輯:`全年EPS${O}${M}元` - 說明:當我們說「全年EPS > M元」時,這代表著公司在過去一整年的營運中,為每一股股票賺取了超過M元的利潤。這是一個衡量公司獲利能力和財務健康狀況的關鍵指標,通常被視為公司基本面穩健的重要訊號。投資人會關注這個條件,因為持續且高於一定水準的每股盈餘,往往預示著公司具有良好的經營績效,並可能為股東帶來股息或股價成長的潛力。 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `operator` | `>`、`<` | `'>'` | | `amount` | `0`、`1`、`2`、`3`、`5`、`10`、`20` | `1` | ```python api.Block.con_us('全年EPS>M元') ``` ### 近Y年全年EPS平均>M元 - `id`: `f33` - 邏輯:`近${Y}年全年EPS平均>${M}元` - 說明:這個條件著重於公司過去Y年的獲利能力,要求其每股盈餘(EPS)在長期平均上能維持在M元以上。這代表公司在過去一段時間內,展現出穩定且良好的營運績效,能夠持續為股東創造價值。對於投資人而言,這是一個評估公司基本面健康與否的重要指標,顯示其具備穩定的獲利基礎,有助於降低投資風險,並可能預示著未來股價的支撐或成長潛力。 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `period` | `3`、`5`、`8`、`10` | `3` | | `amount` | `0`、`1`、`2`、`3`、`5`、`10`、`20` | `1` | | `operator` | `>`、`<` | `'>'` | ```python api.Block.con_us('近Y年全年EPS平均>M元') ``` ### 近四季/單季/全年EPS較前期成長(衰退)<>P% - `id`: `f34` - 邏輯:`近${T}EPS較前期${O}${P}%` - 說明:這個條件著重於評估公司在不同時間週期(單季、近四季或全年)的每股盈餘(EPS)變化,以判斷其獲利能力的動態。當EPS較前期成長P%時,通常代表公司營運表現強勁,獲利能力持續提升,是股價上漲的重要基本面驅動力;反之,若EPS衰退P%,則可能預示公司營運面臨挑戰,投資人應審慎評估其對股價的潛在影響。 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `eps_type` | `1`(最近一季)、`2`(近四季)、`3`(全年) | `'1'` | | `operator` | `>`(成長)、`<`(衰退) | `'>'` | | `percent` | `-20`、`-10`、`0`、`10`、`20`、`30`、`50` | `0` | ```python api.Block.con_us('近四季/單季/全年EPS較前期成長(衰退)<>P%') ``` ### 近四季/單季/全年EPS較前期由負翻正 - `id`: `f35` - 邏輯:`近${T}EPS較前期由${O}` - 說明:當一家公司的每股盈餘(EPS)從虧損轉為獲利,無論是單季、近四季或全年,都代表其營運體質出現了顯著的改善。這通常意味著公司成功扭轉了虧損局面,進入了獲利階段,顯示其經營策略奏效或市場環境轉好,對投資人而言是一個重要的基本面轉折訊號。 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `eps_type` | `1`(最近一季)、`2`(近四季)、`3`(全年) | `'1'` | | `operator` | `>`(翻正)、`<`(轉負) | `'>'` | ```python api.Block.con_us('近四季/單季/全年EPS較前期由負翻正') ``` ### 近四季/單季/全年EPS較前期由正翻負 - `id`: `f36` - 邏輯:`近${T}EPS較前期由${O}` - 說明:當一家公司的每股盈餘(EPS)從正值轉為負值時,這代表該公司在特定期間(無論是單季、近四季或全年)由獲利轉為虧損,顯示其營運狀況出現顯著惡化。這種情況通常會對市場信心造成打擊,並可能預示著公司基本面面臨嚴峻挑戰,投資人應深入探究虧損原因,評估其是暫時性還是結構性的問題。 每股盈餘(EPS)是衡量公司獲利能力的重要指標,EPS越高代表公司為股東賺錢的能力越強。因此,EPS由正轉負意味著公司從賺錢變成虧損,這通常會對股價產生負面影響。投資人需要進一步分析造成虧損的原因,例如是來自於本業營運不佳、一次性業外損失,或是產業環境的變化等。雖然EPS由負轉正可能帶來超額報酬的機會,但由正轉負則需警惕其潛在風險. | 參數 | 合法值 | 預設值 | |------|--------|--------| | `eps_type` | `1`(最近一季)、`2`(近四季)、`3`(全年) | `'1'` | | `operator` | `>`(翻正)、`<`(轉負) | `'<'` | ```python api.Block.con_us('近四季/單季/全年EPS較前期由正翻負') ``` ### 季營收季成長率>±P% - `id`: `f47` - 邏輯:`季營收季成長率${O}±${P}%` - 說明:這項條件著重於公司季度營收在季度基礎上是否出現顯著的變化。當月成長率的絕對值超過P%時,無論是營收加速成長或明顯放緩,都代表公司基本面可能正經歷重要的轉折,是判斷其未來營運趨勢的關鍵指標。 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `operator` | `>`、`<` | `'>'` | | `percent` | `20`、`30`、`40`、`50`、`-20`、`-30`、`-40`、`-50` | `20` | ```python api.Block.con_us('季營收季成長率>±P%') ``` ### 季營收年成長率>±P% - `id`: `f48` - 邏輯:`季營收年成長率${O}±${P}%` - 說明:「季營收年成長率大於P%」這個條件,代表公司在該季度營收相較去年同期有顯著的增長,顯示其產品或服務需求強勁,市場份額可能正在擴大。這是一個企業營運狀況良好、具備成長動能的積極訊號,通常被視為股價上漲的潛在驅動力。 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `operator` | `>`、`<` | `'>'` | | `percent` | `20`、`30`、`40`、`50`、`-20`、`-30`、`-40`、`-50` | `20` | ```python api.Block.con_us('季營收年成長率>±P%') ``` ### 近一年現金股利<>M元 - `id`: `f53` - 邏輯:`近一年現金股利${O}${M}元` - 說明:這個條件是用來篩選過去一年現金股利發放金額的公司。現金股利是企業獲利能力與回饋股東意願的直接展現,對於追求穩定現金流或評估公司財務體質的投資者而言,是一個重要的參考指標。它能幫助我們快速找出具備特定股利政策或派息能力的標的,例如排除不發放股利的公司,或篩選出股利發放金額高於或低於某個水準的企業。 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `operator` | `<`、`>` | `'>'` | | `amount` | `2`、`3`、`5`、`8`、`10`、`15` | `2` | ```python api.Block.con_us('近一年現金股利<>M元') ``` ### 近一年現金殖利率<>P% - `id`: `f55` - 邏輯:`近一年現金殖利率${O}${P}%` - 說明:「近一年現金殖利率<>P%」這個條件,代表我們正在篩選那些現金股利殖利率與特定百分比P有所差異的標的。這可能意味著投資者在尋找殖利率偏離市場平均或個人預期水準的機會,例如,高於P%可能代表股價被低估或公司獲利穩定,而低於P%則可能暗示公司將盈餘再投資以追求未來成長。 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `operator` | `>`、`<` | `'>'` | | `percent` | `3`、`4`、`5`、`6`、`7`、`8` | `3` | ```python api.Block.con_us('近一年現金殖利率<>P%') ``` ### 近N年平均殖利率<>P% - `id`: `f56` - 邏輯:`近${N}年平均殖利率${O}${P}%` - 說明:「近N年平均殖利率<>P%」這個條件,是用來評估一家公司在過去N年期間,其平均股息殖利率是否符合特定的P%標準。這項指標能幫助投資者篩選出符合其收益目標的股票,例如,尋求高於P%的穩定現金流,或是排除過高或過低的殖利率以符合特定的投資策略。 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `period` | `3`、`4`、`5`、`6`、`7`、`8` | `3` | | `operator` | `>`、`<` | `'>'` | | `percent` | `3`、`5`、`10` | `3` | ```python api.Block.con_us('近N年平均殖利率<>P%') ``` ### 近一年現金股利發放率<>P% - `id`: `f58` - 邏輯:`近一年現金股利發放率${O}${P}%` - 說明:現金股利發放率(Payout Ratio)反映了企業盈餘分配的取向。較高的發放率適合追求穩定現金流的收息投資者;而較低的發放率則可能暗示公司正處於成長期,傾向於將資金留存用於再投資(如研判 FOPLP 或 CPO 等先進技術的研發)。此指標能協助用戶根據自身投資屬性,精確定位適合的標的。 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `operator` | `>`、`<` | `'>'` | | `percent` | `40`、`50`、`60`、`70`、`80`、`90` | `50` | ```python api.Block.con_us('近一年現金股利發放率<>P%') ``` ### 近N年現金股利發放率<>P% - `id`: `f59` - 邏輯:`近${N}年現金股利發放率${O}${P}%` - 說明:此指標透過拉長觀察週期($N$ 年),計算現金股利發放率的平均值或穩定性。這有助於排除因處分業外資產或特殊會計調整造成的單一年度高分紅假象。對於建構收息型資產組合的投資者而言,此指標能有效定位具備「穩定股利政策」的成熟企業。 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `period` | `1`、`2`、`3`、`4`、`5`、`10`、`15`、`20` | `3` | | `operator` | `>`、`<` | `'>'` | | `percent` | `40`、`50`、`60`、`70`、`80`、`90` | `50` | ```python api.Block.con_us('近N年現金股利發放率<>P%') ``` ### 最近N季至少有S季毛利率<>P% - `id`: `f61` - 邏輯:`最近${N}季至少有${S}季毛利率${O}${P}%` - 說明:此條件用於評估企業的產品競爭力、成本控制穩定度或產業結構的根本性轉變。當設定為大於時(>P%),可用於篩選出獲利高且結構穩健的绩優股,或找出毛利率剛成功轉型、脫離毛三到四的轉機股;當設定為小於時(<P%),則可用於剔除成本受通膨侵蝕、或產業爆發價格戰的潛在地雷股。此積木是中長線選股策略中,用於動態調整基本面防禦力與獲利續航力的核心財務指標。 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `n` | `4`、`8`、`12`、`20`、`40` | `8` | | `s` | `2`、`3`、`4`、`6`、`9`、`12`、`16`、`20`、`32` | `4` | | `operator` | `>`、`<` | `'>'` | | `percent` | `20`、`30`、`40`、`50` | `30` | ```python api.Block.con_us('最近N季至少有S季毛利率<>P%') ``` ### 最近N季至少有S季營益率<>P% - `id`: `f62` - 邏輯:`最近${N}季至少有${S}季營益率${O}${P}%` - 說明:此條件用於評估公司本業賺錢能力的穩定度。當設定為大於(>P%),能精選出本業獲利穩健、管銷費用控制得當的績優股,或正值營運規模化、展現「轉機性」的企業;當設定為小於(<P%),則可用於剔除本業不賺錢、費用率過高的虛胖公司。是中長線策略中確保「本業高度防禦力」的核心指標。 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `n` | `4`、`8`、`12`、`20`、`40` | `4` | | `s` | `2`、`3`、`4`、`6`、`9`、`12`、`16`、`20`、`32` | `2` | | `operator` | `>`、`<` | `'>'` | | `percent` | `10`、`20`、`30`、`40` | `10` | ```python api.Block.con_us('最近N季至少有S季營益率<>P%') ``` ### 最近N季至少有S季稅前淨利率<>P% - `id`: `f63` - 邏輯:`最近${N}季至少有${S}季稅前淨利率${O}${P}%` - 說明:此條件結合了本業獲利與業外損益(如投資收益、匯兌損益、處分資產等),用於評估企業在排除稅負干擾前的綜合獲利水準。當設定為大於(>P%),常被用來發掘具備強大業外收益(如控股型公司、集團股)或本業加業外雙強的標的;若低於標準,則代表公司整體總體獲利能力面臨挑戰。 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `n` | `4`、`8`、`12`、`20`、`40` | `4` | | `s` | `2`、`3`、`4`、`6`、`9`、`12`、`16`、`20`、`32` | `2` | | `operator` | `>`、`<` | `'>'` | | `percent` | `5`、`10`、`20`、`30` | `5` | ```python api.Block.con_us('最近N季至少有S季稅前淨利率<>P%') ``` ### 最近N季至少有S季稅後淨利率<>P% - `id`: `f64` - 邏輯:`最近${N}季至少有${S}季稅後淨利率${O}${P}%` - 說明:此條件代表公司最終留給股東的真實利潤比例。當設定為大於(>P%),代表公司具備長期且穩定的最終賺錢能力,是計算 EPS 與發放股利的最關鍵基石。此積木常與毛利率、營益率連動,用於確認公司是否具備實質的高獲利結構,能有效幫助初學者篩選出真正能幫股東賺錢的「長線護城河股」。 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `n` | `4`、`8`、`12`、`20`、`40` | `4` | | `s` | `2`、`3`、`4`、`6`、`9`、`12`、`16`、`20`、`32` | `2` | | `operator` | `>`、`<` | `'>'` | | `percent` | `0`、`5`、`10`、`20`、`30` | `0` | ```python api.Block.con_us('最近N季至少有S季稅後淨利率<>P%') ``` ### 最近N季至少有S季負債比率<>P% - `id`: `f65` - 邏輯:`最近${N}季至少有${S}季負債比率${O}${P}%` - 說明:此條件是用於衡量公司財務健全度與破產風險的關鍵指標。當設定為小於時(<P%),可用於鎖定低負債、財務體質極度安全的防守型標的(如定存股);當設定為大於時(>P%),通常用於警示客戶該股槓桿過高、利息負擔沉重,或用來動態追蹤需要大量資本支出但具備高成長性(如半導體、營建業)的特殊產業結構。 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `n` | `4`、`8`、`12`、`20`、`40` | `4` | | `s` | `2`、`3`、`4`、`6`、`9`、`12`、`16`、`20`、`32` | `2` | | `operator` | `>`、`<` | `'<'` | | `percent` | `50`、`60`、`70`、`80` | `60` | ```python api.Block.con_us('最近N季至少有S季負債比率<>P%') ``` ### 最近N季至少有S季股東權益報酬率(ROE)<>P% - `id`: `f66` - 邏輯:`最近${N}季至少有${S}季股東權益報酬率(ROE)${O}${P}%` - 說明:此條件用於評估公司運用股東資金的賺錢效率。當設定大於(>P%),能篩選出高度幫股東賺錢的優質企業,也是價值投資的核心指標;設定小於則能剔除資金運用效率低下的公司。 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `n` | `4`、`8`、`12`、`20`、`40` | `4` | | `s` | `2`、`3`、`4`、`6`、`9`、`12`、`16`、`20`、`32` | `2` | | `operator` | `>`、`<` | `'>'` | | `percent` | `15`、`20`、`25` | `15` | ```python api.Block.con_us('最近N季至少有S季股東權益報酬率(ROE)<>P%') ``` ### 最近N季至少有S季資產報酬率(ROA)<>P% - `id`: `f67` - 邏輯:`最近${N}季至少有${S}季資產報酬率(ROA)${O}${P}%` - 說明:檢驗企業在 N 季中有 S 季的 ROA(每 100 元總資產能賺回幾元)大於或小於 P%。與 ROE 不同,ROA 將負債納入分母計算,能同時評估公司運用自有資金與借貸資金的總體效率。此積木常運用於金融業或高負債、高資產(如營建、面板)的產業篩選。 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `n` | `4`、`8`、`12`、`20`、`40` | `4` | | `s` | `2`、`3`、`4`、`6`、`9`、`12`、`16`、`20`、`32` | `2` | | `operator` | `>`、`<` | `'>'` | | `percent` | `8`、`12`、`16`、`20` | `8` | ```python api.Block.con_us('最近N季至少有S季資產報酬率(ROA)<>P%') ``` ### 最近N季至少有S季EPS<>M元 - `id`: `f68` - 邏輯:`最近${N}季至少有${S}季EPS${O}${M}元` - 說明:此條件是計算本益比與股價合理估值的最直接依據。當設定大於(>M 元),代表公司具備穩定且每季能幫每股股本賺取固定利潤的實力,可協助初學者迅速過濾掉處於虧損或獲利大幅波動的投機標的。 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `n` | `4`、`8`、`12`、`20`、`40` | `4` | | `s` | `2`、`3`、`4`、`6`、`9`、`12`、`16`、`20`、`32` | `2` | | `operator` | `>`、`<` | `'>'` | | `amount` | `0`、`1`、`2`、`3`、`5`、`10`、`15` | `1` | ```python api.Block.con_us('最近N季至少有S季EPS<>M元') ``` ### 最近N季至少有S季自由現金流量<0 - `id`: `f69` - 邏輯:`最近${N}季至少有${S}季自由現金流量<0` - 說明:此條件是用於防範「黑字倒閉」的防守型積木。當觸發次數過高時,代表公司賺的都是應收帳款或死存貨,手上沒有真現金,常用於波段或存股策略中,一鍵剔除虛胖、有財務危機風險的地雷股。 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `n` | `4`、`8`、`12`、`20`、`40` | `4` | | `s` | `2`、`3`、`4`、`6`、`9`、`12`、`16`、`20`、`32` | `2` | ```python api.Block.con_us('最近N季至少有S季自由現金流量<0') ``` ### 毛利率較上一季成長(衰退) - `id`: `f7` - 邏輯:`毛利率較上一季${O}` - 說明:毛利率較上一季成長,代表公司在產品或服務的銷售上,其核心獲利能力有所提升,這通常意味著成本控制得宜或產品議價能力增強。相反地,若毛利率衰退,則可能暗示公司面臨成本上升、市場競爭加劇或產品組合不佳等營運壓力。對於投資人而言,毛利率的季度變化是評估企業體質與未來獲利潛力的關鍵指標。 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `operator` | `>`(成長)、`<`(衰退) | `'>'` | ```python api.Block.con_us('毛利率較上一季成長(衰退)') ``` ### 最近N季至少有S季月營收年增率<>P% - `id`: `f71` - 邏輯:`最近${N}季至少有${S}季月營收年增率${O}${P}%` - 說明:此條件相較於單月指標,能有效平穩過濾掉單月過年連假或工作天數落差的雜訊,用於確認企業營收是否處於「長線且穩定的擴張期」,是兼顧基本面與中長線趨勢的核心積木。 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `n` | `4`、`8`、`12`、`20`、`40` | `4` | | `s` | `2`、`3`、`4`、`6`、`9`、`12`、`16`、`20`、`32` | `2` | | `operator` | `>`、`<` | `'>'` | | `percent` | `20`、`30`、`40`、`50`、`-20`、`-30`、`-40`、`-50` | `20` | ```python api.Block.con_us('最近N季至少有S季月營收年增率<>P%') ``` ### 最近N年至少有S年現金股利<>M元 - `id`: `f72` - 邏輯:`最近${N}年至少有${S}年現金股利${O}${M}元` - 說明:此條件是存股族建構高股息組合時最重視的穩定度指標。當設定大於(>M 元),代表公司有長期穩定的獲利基礎與發紅包能力,不會在景氣差時就突然不發股利,能為長期持股提供強大保護力。 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `n` | `3`、`5`、`10`、`20` | `3` | | `s` | `2`、`4`、`8`、`16` | `2` | | `operator` | `<`、`>` | `'>'` | | `amount` | `2`、`3`、`5`、`8`、`10`、`15` | `2` | ```python api.Block.con_us('最近N年至少有S年現金股利<>M元') ``` ### 最近N年至少有S年現金殖利率<>P% - `id`: `f73` - 邏輯:`最近${N}年至少有${S}年現金殖利率${O}${P}%` - 說明:此條件用於評估股價與股利之間的相對投報率。當設定大於(>P%),代表歷史上該股在特定價位具備高投報優勢,能吸引長線買盤進駐,在空頭市場時,往往能展現極強的抗跌與防守特性。 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `n` | `3`、`5`、`10`、`20` | `3` | | `s` | `2`、`4`、`8`、`16` | `2` | | `operator` | `>`、`<` | `'>'` | | `percent` | `3`、`4`、`5`、`6`、`7`、`8` | `3` | ```python api.Block.con_us('最近N年至少有S年現金殖利率<>P%') ``` ### 最近N年至少有S年現金股利發放率<>P% - `id`: `f75` - 邏輯:`最近${N}年至少有${S}年現金股利發放率${O}${P}%` - 說明:此條件能看出公司的慷慨程度與資金規劃。適中的發放率(如 50%~80%)代表公司大方且仍保留擴產資金;過高可能代表不願再投資,過低則代表對股東較吝嗇,可用於調整存股名單。 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `n` | `3`、`5`、`10`、`20` | `3` | | `s` | `2`、`4`、`8`、`16` | `2` | | `operator` | `>`、`<` | `'>'` | | `percent` | `40`、`50`、`60`、`70`、`80`、`90` | `50` | ```python api.Block.con_us('最近N年至少有S年現金股利發放率<>P%') ``` ### 連續N年發放現金股利 - `id`: `f76` - 邏輯:`連續${N}年發放現金股利` - 說明:指公司過去 N 年來,每年都有將賺到的利潤(現金或股票)分配給股東,中間從未中斷,連續發放的年數越長,代表公司的獲利能力越穩定、財務體質越健康,是評估「長期存股」與「防禦型投資」的重要指標。建議搭配「殖利率」一起觀察。 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `N` | `3`、`5`、`7`、`10`、`15`、`20` | `5` | ```python api.Block.con_us('連續N年發放現金股利') ``` ### 近四季稅前淨利率<>P% - `id`: `f77` - 邏輯:`近四季稅前淨利率${O}${P}%` - 說明:篩選出過去連續四個季度累計的『稅前淨利率』大於(或小於)特定門檻 P% 的企業。旨在過濾出具備強大定價能力、成本控管優異或具備高附加價值的『高獲利含金量』公司,並避開陷入價格戰或『做白工』的低毛利泥沼。 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `operator` | `<`、`>` | `'>'` | | `percent` | `0`、`5`、`10`、`20` | `10` | ```python api.Block.con_us('近四季稅前淨利率<>P%') ``` ### 近Y年EPS皆<>M元 - `id`: `f78` - 邏輯:`近${Y}年EPS皆${O}${M}元` - 說明:篩選出過去連續 Y 年,其每股盈餘(EPS)皆大於或小於 M 元的企業。當設定為大於 M 元時,旨在尋找獲利能力極度穩定、能夠穿越景氣牛熊循環的『長線績優股』與『金雞母』,是價值投資與存股策略最核心的防禦型底盤。 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `y` | `3`、`5`、`8`、`10` | `5` | | `operator` | `<`、`>` | `'>'` | | `amount` | `0`、`1`、`2`、`3`、`5`、`10`、`20` | `1` | ```python api.Block.con_us('近Y年EPS皆<>M元') ``` ### 預估今年全年EPS<>M元 - `id`: `f79` - 邏輯:`預估今年全年EPS${O}${M}元` - 說明:依據財務年化模型,篩選出『預估今年全年每股盈餘(Forward EPS)』大於或小於 M 元的企業。股市反映的是未來預期,本指標旨在提前鎖定今年度具備獲利爆發力、轉虧為盈,或盈餘成長明確的潛力標的,是計算『預估本益比』以發掘低估黑馬的核心參數。 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `operator` | `<`、`>` | `'>'` | | `amount` | `0`、`1`、`2`、`3`、`5`、`10`、`20` | `1` | ```python api.Block.con_us('預估今年全年EPS<>M元') ``` ### 毛利率創歷史新高(新低) - `id`: `f8` - 邏輯:`毛利率創歷史${O}` - 說明:毛利率創歷史新高,代表公司在銷售產品或服務後,扣除直接生產成本所剩下的利潤比例達到前所未有的高峰,這通常意味著公司擁有強大的定價能力、有效的成本控制或產品組合優化,顯示其核心業務獲利能力顯著提升。反之,若毛利率創歷史新低,則可能暗示公司面臨激烈的市場競爭、成本大幅上升或產品缺乏競爭力,導致其主要業務的獲利空間受到嚴重擠壓。 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `operator` | `>`(新高)、`<`(新低) | `'>'` | ```python api.Block.con_us('毛利率創歷史新高(新低)') ``` ### N年前資本支出佔股本率<>P% - `id`: `f85` - 邏輯:`N年前資本支出佔股本率${O}${P}%` - 說明:本策略往前回溯N年,抓取當時財報上的『資本支出』,將其除以『實收股本』計算出比例進行篩選。佔比>P%(大幅擴產):資本支出代表企業投資於購買土地、建廠、升級設備的真金白銀。當N年前的佔比極高,代表當年進行了極具攻擊性的擴產。如今N年過去,新廠房剛好落成投產,隨之而來的就是『營收天花板被打開』的業績大爆發。佔比持續` | `'>'` | | `percent` | `30`、`50`、`80`、`100`、`120` | `50` | ```python api.Block.con_us('N年前資本支出佔股本率<>P%') ``` ### 季(年)資本支出佔股本率<>P% - `id`: `f86` - 邏輯:`今年累季資本支出佔股本率${O}${P}%` - 說明:本策略抓取個股最新財報中的『今年度累計資本支出』,除以『實收股本』計算出比例。佔比>P%(年度擴張達標/超標):消除單一季度的入帳時間差,證明公司在今年度確實維持著極高強度的資本投入。若此數值在Q2或Q3就已經超越去年全年,代表擴產進度大幅超前,是極強烈的長線利多。佔比持續低迷(擴張停滯):即使老闆在法說會上喊出百億擴廠計畫,但累計到Q3財報時,資本支出佔比依然極低,代表計畫可能延宕、遭遇瓶頸,或是客戶臨時抽單導致公司緊急煞車。 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `operator` | `<`、`>` | `'>'` | | `percent` | `30`、`50`、`80`、`100`、`120` | `50` | ```python api.Block.con_us('季(年)資本支出佔股本率<>P%') ``` ### 今年累季資本支出佔股本率<>P% - `id`: `f87` - 邏輯:`今年累季資本支出佔股本率${O}${P}%` - 說明:本策略抓取個股最新財報中的『今年度累計資本支出』,除以『實收股本』計算出比例。佔比>P%(年度擴張達標/超標):消除單一季度的入帳時間差,證明公司在今年度確實維持著極高強度的資本投入。若此數值在Q2或Q3就已經超越去年全年,代表擴產進度大幅超前,是極強烈的長線利多。佔比持續低迷(擴張停滯):即使老闆在法說會上喊出百億擴廠計畫,但累計到Q3財報時,資本支出佔比依然極低,代表計畫可能延宕、遭遇瓶頸,或是客戶臨時抽單導致公司緊急煞車。 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `operator` | `<`、`>` | `'>'` | | `percent` | `30`、`50`、`80`、`100`、`120` | `50` | ```python api.Block.con_us('今年累季資本支出佔股本率<>P%') ``` ### 最近一年資本支出年增率<>P% - `id`: `f88` - 邏輯:`最近一年資本支出年增率${O}${P}%` - 說明:本策略計算個股『最近一年的資本支出』,與『去年同期』進行對比,得出年增率百分比。年增率>P%(攻擊態勢確立):這代表公司打破了過去的常態,突然看見了極度明確且龐大的未來商機,因而大幅調高今年的資本支出預算。這是超級成長股『初升段』的強力背書。年增率<-P%(進入收割期或衰退期):代表擴廠階段結束,資本支出大幅踩煞車。若此時營收下滑,為產業步入寒冬;但若此時『營收維持高檔』,則代表公司進入了甜蜜的『現金流收割期』,具備發放高額股息的潛力。 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `operator` | `<`、`>` | `'>'` | | `percent` | `30`、`50`、`80`、`100`、`120` | `50` | ```python api.Block.con_us('最近一年資本支出年增率<>P%') ``` ### 今年累季資本支出創近N年來新高 - `id`: `f89` - 邏輯:`今年累季資本支出創近${N}年來新高` - 說明:本策略抓取個股最新財報中的『今年度累計資本支出』,並將其與過去N年的『全年度總數值』進行陣列比對。創N年新高(破歷史天際線):企業的資本支出通常具備極強的週期性。當累計資本支出突破了過去5年甚至10年的天花板,這絕非單純的設備汰舊換新,而是代表該產業發生了『典範轉移』或迎來了具備霸權級地位的大客戶。這是長線超級成長股最具統治力的基本面訊號 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `N` | `1`、`2`、`3`、`4`、`5` | `3` | ```python api.Block.con_us('今年累季資本支出創近N年來新高') ``` ### 毛利率<>P% - `id`: `f9` - 邏輯:`毛利率${O}${P}%` - 說明:「毛利率不等於P%」這個條件,意味著我們正在檢視公司的核心獲利能力,並觀察其毛利率是否偏離了某個預設的基準點或市場預期。這種偏離可能反映了公司在產品組合、成本結構或市場競爭態勢上的變化,是評估其經營效率與未來獲利潛力的重要指標。 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `operator` | `>`、`<` | `'>'` | | `percent` | `20`、`30`、`40`、`50` | `20` | ```python api.Block.con_us('毛利率<>P%') ``` ### 近Y年內資本支出曾創下N年內新高 - `id`: `f90` - 邏輯:`近${Y}年內資本支出曾創下${N}年內新高` - 說明:本策略在時間軸上設定一個觀察區間,尋找在近Y年內是否曾出現『單年資本支出創下過去N年新高的歷史級擴產事件。意味著我們故意『跳過』了公司瘋狂砸錢的陣痛期。當初破紀錄的新廠房現在剛好落成投產,只要營收跟上,EPS 將會迎來毫無阻力的幾何級數爆發。 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `Y` | `1`、`2`、`3` | `2` | | `N` | `1`、`2`、`3`、`4`、`5` | `3` | ```python api.Block.con_us('近Y年內資本支出曾創下N年內新高') ``` ### 今年累季資本支出佔現金比<>P% - `id`: `f91` - 邏輯:`今年累季資本支出佔現金比${O}${P}%` - 說明:今年累季資本支出佔現金比<>P%,本策略抓取個股最新財報中的『今年度累計資本支出』,將其除以『資產負債表上的現金及約當現金總額』,計算出比例。佔比>P%(高流動性風險/豪賭型擴張):例如佔比高達80%甚至超過100%。代表公司為了擴充產能,幾乎快把手上的流動現金給燒光了。如果此時本業沒賺錢,公司極度容易面臨資金鏈斷裂的破產危機,或必須被迫大量發行可轉債、辦理現金增資。 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `operator` | `<`、`>` | `'>'` | | `percent` | `30`、`50`、`80`、`100`、`120` | `50` | ```python api.Block.con_us('今年累季資本支出佔現金比<>P%') ``` ### 再投資比率<>P% - `id`: `f92` - 邏輯:`再投資比率${O}${P}%` - 說明:本策略衡量公司將『賺來的淨利』再次投入於本業資產(或保留於公司內部)的比例。保留盈餘率=1-現金配息率。比率>P%(高再投資/攻擊型成長):例如比率高達70%甚至100%。代表公司正處於高速擴張期,認為『把錢留在公司投資新項目的報酬率,遠大於發還給股東』。這是孕育十年十倍股的搖籃,但股息殖利率通常極低。比率` | `'>'` | | `percent` | `30`、`50`、`80`、`100` | `50` | ```python api.Block.con_us('再投資比率<>P%') ``` ### 資本報酬率<>P% - `id`: `f93` - 邏輯:`資本報酬率${O}${P}%` - 說明:資本報酬率公式為:近四季稅前淨利/(流動資產-現金-長期投資+固定資產) | 參數 | 合法值 | 預設值 | |------|--------|--------| | `operator` | `<`、`>` | `'>'` | | `percent` | `0`、`10`、`20`、`30`、`40`、`50` | `20` | ```python api.Block.con_us('資本報酬率<>P%') ``` ### 盈餘報酬率<>P% - `id`: `f94` - 邏輯:`盈餘報酬率${O}${P}%` - 說明:盈餘報酬率公式為:近四季稅前淨利/(昨日收盤價*在外流通股數+長期負債-現金) | 參數 | 合法值 | 預設值 | |------|--------|--------| | `operator` | `<`、`>` | `'>'` | | `percent` | `0`、`10`、`20`、`30`、`40`、`50` | `20` | ```python api.Block.con_us('盈餘報酬率<>P%') ``` ### 葛林布雷名次<>N名 - `id`: `f95` - 邏輯:`葛林布雷名次${O}${N}名` - 說明:本策略同時參考資本報酬率與盈餘報酬率,根據名次加總後,得出葛林布雷名次 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `operator` | `<`、`>` | `'<'` | | `N` | `30`、`50`、`100`、`200`、`500`、`1000` | `100` | ```python api.Block.con_us('葛林布雷名次<>N名') ``` ### 每股清算價值<>N倍 - `id`: `f96` - 邏輯:`每股清算價值${O}${N}倍` - 說明:每股清算價值=(資產-負債-存貨-應收帳款-長期投資)/在外流通股數。股價<每股清算價值的N倍(極度超跌/清算套利):這種『買資產送公司』的極端低估,通常發生在大熊市的恐慌拋售期,或是被市場徹底遺忘的冷門夕陽產業。此為『深度價值』量化模型的最底層防線。它完全不看未來的成長性,只看當下資產負債表的變現能力。 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `operator` | `<`、`>` | `'<'` | | `N` | `0.5`、`0.8`、`1`、`1.2`、`1.5`、`2` | `1` | ```python api.Block.con_us('每股清算價值<>N倍') ``` ### 長期負債比率<>P% - `id`: `f97` - 邏輯:`長期負債比率${O}${P}%` - 說明:本策略計算個股財報中的『長期負債』,除以『總資產』或『總股東權益』計算出比例P%。佔比>P%(高槓桿):代表公司大量的營運資金是『借來的』。在降息循環或產業順風期,高槓桿能讓股東的獲利倍數放大;但在升息循環或景氣逆風時,龐大的固定利息支出將成為吞噬企業現金流的無底洞,甚至引發倒閉危機。佔比`、`<` | `'>'` | | `percent` | `20`、`40`、`60` | `40` | ```python api.Block.con_us('長期負債比率<>P%') ``` ### 長期負債佔股本比率<>P% - `id`: `f98` - 邏輯:`長期負債佔股本比率${O}${P}%` - 說明:本策略抓取個股財報中的『長期負債』,將其除以『實收股本』,計算出比例P%。佔比>P%(高槓桿/攻擊型資本結構):代表公司高度依賴外部借款來營運。當本業的資產報酬率大於借款利息時,這種高槓桿能以幾何倍數放大;但若遇到產業逆風,獲利也會以同樣的倍數雪崩。佔比`、`<` | `'>'` | | `percent` | `10`、`20`、`30`、`40` | `20` | ```python api.Block.con_us('長期負債佔股本比率<>P%') ``` ### 現金報酬率<>P% - `id`: `f99` - 邏輯:`現金報酬率${O}${P}%` - 說明:現金報酬率=(自由現金流量+淨利息)/完整持有企業的財務成本,自由現金流量=近四季營運活動現金流量-資本支出,淨利息=利息收入-利息成本,完整持有企業的財務成本=公司市值+長期負債-現金。現金報酬率>P%(超級現金牛):這家公司不僅本業極度賺錢,而且收帳能力超強、擴廠開銷控制得宜。現金報酬率`、`<` | `'>'` | | `percent` | `0`、`10`、`20` | `0` | ```python api.Block.con_us('現金報酬率<>P%') ``` ### 市值>M億 - `id`: `i28` - 邏輯:`市值>${M}億` - 說明:這代表您正在尋找市值高於 M 億元的股票。旨在排除極易受人為操縱、流動性極差的微型股(水餃股/雞蛋水餃股),確保選股池中的標的具備基本的市場規模、法人認可度與抗風險能力。 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `value` | `10`、`20`、`30`、`50`、`100` | `50` | ```python api.Block.con_us('市值>M億') ``` ### 大型股,100億<市值M億 - `id`: `i7` - 邏輯:`股本${operator}${value}億` - 說明:「股本」指的是一家公司發行的股票總額,是衡量公司規模的重要指標。當您設定「股本<>M億」這個條件時,是在篩選特定規模的企業,因為股本大小直接影響著股票的流動性、市場穩定性以及潛在的成長空間。 投資人會根據自身的風險偏好和投資策略,選擇不同股本規模的公司:例如,股本較大的公司通常流動性較好,股價波動相對穩定,但成長爆發力可能較小;而股本較小的公司則可能具備較高的成長潛力,但同時也伴隨著較高的波動性和流動性風險。 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `operator` | `>`、`<` | `'>'` | | `value` | `10`、`20`、`30`、`50`、`100` | `50` | ```python api.Block.con_us('股本<>M億') ``` ### D日均線糾結`(上)、`<`(下) | `'>'` | | `period2` | `5`、`10`、`20`、`60`、`120`、`240` | `20` | ```python api.Block.con_us('均線連三日持續向上(下)') ``` ### 今日收盤價突(跌)破近D日關鍵價格區間 - `id`: `m11` - 邏輯:`今日收盤價${A}破近${D}日關鍵價格區間` - 說明:「今日收盤價突破近D日關鍵價格區間」代表股價成功站穩在過去D天以來的重要壓力位之上,顯示市場買盤力道強勁,並可能預示著股價將擺脫先前的盤整或下跌格局。這是一個典型的「突破策略」訊號,意味著股價有機會開啟一波新的上漲趨勢,投資人會密切關注其後續動能。 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `operator` | `>`(突)、`<`(跌) | `'>'` | | `period` | `5`、`10`、`20`、`60`、`120`、`240` | `20` | ```python api.Block.con_us('今日收盤價突(跌)破近D日關鍵價格區間') ``` ### 今日收盤價<>近D日關鍵價格P% - `id`: `m12` - 邏輯:`今日收盤價${O}近${D}日關鍵價格${P}%` - 說明:這個條件表示今日收盤價與過去D天內的某個「關鍵價格」產生了P%的顯著偏離。這種偏離可能代表市場情緒出現了重大轉變,或是股價正在形成新的趨勢,值得投資人密切關注。 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `operator` | `<`、`>` | `'>'` | | `period` | `5`、`10`、`20`、`60`、`120`、`240` | `20` | | `percent` | `5`、`10`、`15`、`20`、`30`、`40` | `5` | ```python api.Block.con_us('今日收盤價<>近D日關鍵價格P%') ``` ### 今日收盤價在近D日關鍵價格附近P% - `id`: `m13` - 邏輯:`今日收盤價${O}近${D}日關鍵價格${P}%` - 說明:當今日收盤價落在近D日關鍵價格的P%範圍內時,這通常意味著股價正在一個重要的技術關卡附近進行盤整或測試。這種情況可能預示著市場正在重新評估該價格區間的支撐或壓力強度,並可能在短期內醞釀出方向性的突破或反轉。 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `period` | `5`、`10`、`20`、`60`、`120`、`240` | `20` | | `percent` | `1`、`2`、`3`、`4`、`5`、`10` | `3` | ```python api.Block.con_us('今日收盤價在近D日關鍵價格附近P%') ``` ### 今日收盤價在近D日關鍵價格區間±P%內,再度爆量 - `id`: `m14` - 邏輯:`今日收盤價在近${D}日關鍵價格${P}%,且日成交量${O}5ma成交量${N}倍` - 說明:今日收盤價在近期關鍵價格區間內,並伴隨再次爆量,這是一個強烈的市場訊號,表明多空雙方正在此重要價位進行激烈的籌碼交換。這種情況通常預示著股價即將結束盤整,並可能在短期內選擇一個明確的方向,值得密切關注其後續走勢。 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `period` | `5`、`10`、`20`、`60`、`120`、`240` | `20` | | `percent` | `1`、`2`、`3`、`4`、`5`、`10` | `3` | | `n` | `1`、`1.5`、`2`、`3` | `2` | ```python api.Block.con_us('今日收盤價在近D日關鍵價格區間±P%內,再度爆量') ``` ### 今日收盤價<>D日均線 - `id`: `m15` - 邏輯:`今日收盤價${O}${D}日均線` - 說明:此指標用於判定價格相對於移動平均線(MA)的位階。收盤價站上均線通常視為支勢轉強或趨勢發動的訊號;反之,跌破均線則暗示支撐力道轉弱。透過此條件,投資者可篩選出具備趨勢支撐的標的,或結合乖離率概念研判價格是否過度偏離平均成本。 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `operator` | `<`、`>` | `'>'` | | `period` | `5`、`10`、`20`、`60`、`120`、`240` | `20` | ```python api.Block.con_us('今日收盤價<>D日均線') ``` ### D日均線<>T日均線 - `id`: `m16` - 邏輯:`${D}日均線${O}${T}日均線` - 說明:本策略比較『短週期(D日)』與『長週期(T日)』兩條移動平均線的相對位置。當短均線大於長均線(或向上穿越),稱為『黃金交叉』,代表近期市場動能強勁、趨勢轉多;反之,當短均線小於長均線(或向下跌破),稱為『死亡交叉』,代表近期動能衰退、趨勢轉空。旨在捕捉波段行情的起漲與起跌點。 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `period1` | `5`、`10`、`20`、`60`、`120`、`240` | `5` | | `operator` | `<`、`>` | `'>'` | | `period2` | `10`、`5`、`20`、`60`、`120`、`240` | `20` | ```python api.Block.con_us('D日均線<>T日均線') ``` ### D日均線<>T日均線<>H日均線 - `id`: `m17` - 邏輯:`${D}日均線${O}${T}日均線${O}${H}日均線` - 說明:本策略同時檢視三條不同週期(短D、中T、長H)的移動平均線相對位置。當均線呈現『短D > 中T > 長H』時為多頭排列,代表短中長期的趨勢皆一致向上;反之若為『短D < 中T < 長H』則為空頭排列。旨在過濾單一均線的假突破雜訊,確認標的已進入穩定且明確的主升段或主跌段行情。 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `period1` | `5`、`10`、`20`、`60`、`120`、`240` | `5` | | `period2` | `10`、`5`、`20`、`60`、`120`、`240` | `20` | | `operator` | `<`、`>` | `'>'` | | `period3` | `20`、`10`、`5`、`60`、`120`、`240` | `60` | ```python api.Block.con_us('D日均線<>T日均線<>H日均線') ``` ### 今日收盤價<>D日(周月)均線 - `id`: `m18` - 邏輯:`今日收盤價${O}${D}${A}均線` - 說明:向上突破均線(站上均線):代表今日的收盤價,正式超越了過去D個交易日所有買進者的『平均成本』。市場由虧損轉為獲利,多方氣氛點火,為波段起漲的基本條件。向下跌破均線(跌破均線):代表今日收盤價跌穿了過去D日的平均成本。市場陷入套牢恐慌,空方奪回主導權,為波段起跌或停損的防守底線。 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `operator` | `<`、`>` | `'>'` | | `period` | `5`、`10`、`20`、`60`、`120`、`240` | `20` | | `table` | `日_K`(日)、`週_K`(周)、`月_K`(月) | `'日_K'` | ```python api.Block.con_us('今日收盤價<>D日(周月)均線') ``` ### 今日收盤價<>月(季年)線 - `id`: `m19` - 邏輯:`今日收盤價${O}${A}線` - 說明:站上季線(60日/13周):季線又稱『生命線』,因企業財報以季為單位。站上季線代表基本面轉機與中長線多頭的甦醒。站上年線(240日/52周):年線又稱『牛熊分界線』。突破年線代表該企業經歷了完整的產業谷底,正式開啟一到兩年的長線大牛市;反之跌破,則為長期熊市的開端 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `operator` | `<`、`>` | `'>'` | | `period` | `20`(月)、`60`(季)、`240`(年) | `60` | ```python api.Block.con_us('今日收盤價<>月(季年)線') ``` ### D日均線趨勢向上(下) - `id`: `m2` - 邏輯:`${D}日均線趨勢向${C}` - 說明:均線趨勢向上,代表均線之最新一日收盤價>最舊一日收盤價,代表股價保持持續上漲趨勢,反之均線趨勢向下,代表股價保持持續下跌趨勢,當趨勢形成時,除非有產生收盤價突破/跌破均線,否則方向不容易改變。 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `period` | `5`、`10`、`20`、`60`、`120`、`240` | `20` | | `operator` | `>`(上)、`<`(下) | `'>'` | ```python api.Block.con_us('D日均線趨勢向上(下)') ``` ### 短期三均線糾結 - `id`: `m20` - 說明:這代表著過去一週、兩週與一個月進場的投資人,其平均持有成本幾乎完全重疊。市場失去了明確的趨勢,進入極度低波動的『窒息盤整區』。均線糾結本身不是買點,而是『觀測訊號』。糾結過後必然伴隨變盤(向上噴發或向下破底)。一旦出現『帶量長紅K突破糾結區』,即為勝率極高的主升段右側買點。 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `threshold` | `5`、`10`、`20`、`50` | `5` | | `operator` | `<`、`>` | `'<'` | ```python api.Block.con_us('短期三均線糾結') ``` ### 長期四均線糾結(5MA/10MA/20MA) - `id`: `m21` - 邏輯:`長期四均線糾結(5MA/10MA/20MA)` - 說明:這代表著過去一個月、一季、半年甚至一年內進場的所有投資人與外資法人,其『長短期持有成本已經完全歸零一致』。籌碼經歷了最徹底的換手與清洗。此為技術分析中威力最強的『長線築底訊號』。一旦伴隨基本面轉機(營收由虧轉盈),並以帶量長紅突破糾結區,往往會走出以『倍數』計算的超級大多頭行情。 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `threshold` | `5`、`10`、`20`、`50` | `5` | | `operator` | `<`、`>` | `'<'` | ```python api.Block.con_us('長期四均線糾結(5MA/10MA/20MA)') ``` ### 長期三均線糾結(60MA/120MA/240MA) - `id`: `m22` - 說明:季線代表『企業單季財報轉機』,半年線代表『產業庫存去化週期』,年線代表『總體經濟與大牛熊市分界』。當這三條線黏合,代表該公司的基本面利空已經出盡,市場中長期的籌碼歷經極度血腥的清洗與換手,法人的持倉成本完全一致。此時只要出現帶量突破,往往預示著『以年為單位』的超級主升段正式啟動。 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `threshold` | `5`、`10`、`20`、`50` | `5` | | `operator` | `<`、`>` | `'<'` | ```python api.Block.con_us('長期三均線糾結(60MA/120MA/240MA)') ``` ### 短期三均線多(空)頭排列 - `id`: `m23` - 邏輯:`短期三均線${A}頭排列` - 說明:多頭排列:收盤價>5MA>10MA>20MA,且三條均線的斜率皆為『向上』。代表『過去一週、過去兩週、過去一個月』進場的投資人全部處於獲利狀態,短線籌碼達到絕對的做多共識,為強勢飆股的主升段特徵。空頭排列:收盤價<5MA<10MA<20MA,且三條均線的斜率皆為『向下』。代表短、中、長線的買盤全部慘遭套牢,市場充滿恐慌性的停損賣壓,為『摸底必死』的絕對空方禁區。 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `operator` | `>`(多)、`<`(空) | `'>'` | ```python api.Block.con_us('短期三均線多(空)頭排列') ``` ### 長期四均線多(空)頭排列 - `id`: `m24` - 邏輯:`長期四均線${A}頭排列` - 說明:多頭排列:收盤價>20MA>60MA>120MA>240MA,且三條均線的斜率皆為『向上』。代表『過去一週、過去兩週、過去一個月』進場的投資人全部處於獲利狀態,短線籌碼達到絕對的做多共識,為強勢飆股的主升段特徵。空頭排列:收盤價<20MA<60MA<120MA<240MA,且三條均線的斜率皆為『向下』。代表短、中、長線的買盤全部慘遭套牢,市場充滿恐慌性的停損賣壓,為『摸底必死』的絕對空方禁區。 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `operator` | `>`(多)、`<`(空) | `'>'` | ```python api.Block.con_us('長期四均線多(空)頭排列') ``` ### 最近一日收盤價<>D日均線扣抵值 - `id`: `m25` - 邏輯:`最近一日收盤價${O}${D}日均線扣抵值` - 說明:今日股價>扣抵值表示均線準備向上翻揚(產生支撐力道)。如果今日股價<扣抵值表示均線準備向下彎折(產生蓋頭反壓) | 參數 | 合法值 | 預設值 | |------|--------|--------| | `operator` | `<`、`>` | `'>'` | | `period` | `5`、`10`、`20`、`60`、`120`、`240` | `20` | ```python api.Block.con_us('最近一日收盤價<>D日均線扣抵值') ``` ### D日周月多(空)頭排列 - `id`: `m3` - 邏輯:`${D}日周月${E}頭排列` - 說明:「D日多(空)頭排列」指的是不同天期移動平均線(例如5日、10日、20日等)的排列順序,用來判斷股價的趨勢強弱。當短期均線在上方,依序為中期、長期均線,且均線皆向上發散時,稱為「多頭排列」,代表股價處於強勁的上升趨勢,買盤力道強勁。 反之,若短期均線在下方,依序為中期、長期均線,且均線皆向下發散時,則為「空頭排列」,顯示股價正處於明顯的下跌趨勢,賣壓沉重。 這種排列型態是判斷市場整體趨勢的重要指標,有助於投資人確認目前是多方主導還是空方主導的格局。 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `operator` | `>`(多)、`<`(空) | `'>'` | | `period_type` | `day`(日)、`week`(周)、`month`(月) | `'day'` | ```python api.Block.con_us('D日周月多(空)頭排列') ``` ### D日短均線與長均線,黃金交叉(死亡交叉) - `id`: `m4` - 邏輯:`${D}日短均線與${W}日長均線,呈現${G}交叉` - 說明:當短期移動平均線向上穿越長期移動平均線時,形成「黃金交叉」,這通常被視為股價可能上漲的買入訊號,代表市場動能轉強。反之,若短期移動平均線向下穿越長期移動平均線,則形成「死亡交叉」,這通常被解讀為股價可能下跌的賣出訊號,暗示市場趨勢轉弱。 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `period1` | `5`、`10`、`20` | `5` | | `period2` | `20`、`60`、`120`、`240` | `20` | | `operator` | `>`(黃金)、`<`(死亡) | `'>'` | ```python api.Block.con_us('D日短均線與長均線,黃金交叉(死亡交叉)') ``` ### 今日收盤價突(跌)破D日均線 - `id`: `m5` - 邏輯:`今日收盤價${A}破${D}${T}均線` - 說明:今日收盤價跌破D日均線,通常被視為短期或中期趨勢轉弱的訊號。這代表股價失去了該均線所提供的支撐力道,市場賣壓可能正在增強。投資人應留意後續股價可能面臨進一步下行的風險,並重新評估其持股策略。 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `operator` | `>`(突)、`<`(跌) | `'>'` | | `period` | `5`、`10`、`20` | `20` | | `period_type` | `day`(日)、`week`(周)、`month`(月) | `'day'` | ```python api.Block.con_us('今日收盤價突(跌)破D日均線') ``` ### 近N日内曾發生還原價向上突破/向下跌破 - `id`: `m6` - 邏輯:`近${D}日内曾發生${A}破還原價` - 說明:「還原價」是將除權息、增減資等因素納入考量後的股價,能更真實地反映股票的長期走勢。當還原價在近N日內向上突破,代表股價克服了重要的壓力位,顯示多方力量轉強,可能預示著一波上漲行情。反之,若還原價向下跌破,則表示股價跌破了關鍵支撐,空方力量佔優,可能面臨進一步下跌的風險。 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `period` | `5`、`10`、`20` | `20` | | `operator1` | `>`(突)、`<`(跌) | `'>'` | | `n` | `2`、`1`、`3`、`4`、`5` | `3` | ```python api.Block.con_us('近N日内曾發生還原價向上突破/向下跌破') ``` ### 今日收盤價(乖離率)<>D日均線P% - `id`: `m7` - 邏輯:`今日收盤價${O}${D}${T}均線價格${P}%` - 說明:「今日收盤價<>D日均線P%」這個條件,代表著當前股價相較於過去D日的平均成本線,產生了P%的乖離。這種乖離程度是判斷股價短期動能與市場情緒的重要指標:若乖離過大,可能暗示股價已出現超漲或超跌現象,值得關注其後續的修正或趨勢延續力道。 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `operator` | `<`、`>` | `'>'` | | `period` | `5`、`10`、`20`、`60`、`120`、`240` | `20` | | `percent` | `5`、`10`、`20`、`30` | `5` | ```python api.Block.con_us('今日收盤價(乖離率)<>D日均線P%') ``` ### 今日收盤價乖離<>P% - `id`: `m8` - 邏輯:`今日收盤價乖離${O}${P}%` - 說明:「今日收盤價乖離P%」指的是今日收盤價與某特定期間移動平均線的偏離程度達到P%。當乖離率為正P%時,表示股價已顯著高於其平均成本,可能暗示短期內股價過熱或上漲動能強勁;反之,若乖離率為負P%,則表示股價已顯著低於其平均成本,可能暗示短期內股價超跌或下跌動能強勁。 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `percent` | `5`、`10`、`20`、`50` | `5` | | `period` | `5`、`10`、`20`、`60`、`120`、`240` | `20` | ```python api.Block.con_us('今日收盤價乖離<>P%') ``` ### D日均線斜率<>0.4 - `id`: `m9` - 邏輯:`${D}日均線斜率${O}0.4` - 說明:「D日均線斜率」是衡量股價在D個交易日內趨勢方向與強度的重要指標。當其斜率不等於0.4時,這意味著市場的D日均線並未呈現一個特定且溫和的上升趨勢。這種情況可能暗示著股價正處於更為強勁的多頭或空頭格局,或是進入了盤整區間,而非穩步上揚的狀態。 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `period` | `5`、`10`、`20`、`60`、`120`、`240` | `20` | | `operator` | `<`、`>` | `'>'` | ```python api.Block.con_us('D日均線斜率<>0.4') ``` ### D日均線斜率<>-0.4 - `id`: `m9` - 邏輯:`${D}日均線斜率${O}-0.4` - 說明:「D日均線斜率」代表著過去D天股價趨勢的方向與強度,它就像市場的「速度計」,顯示股價平均變化的快慢與方向。 當D日均線斜率不等於-0.4時,這表示股價的趨勢並非處於一個特定程度的溫和下跌狀態。這可能意味著股價的下跌趨勢較為緩和、呈現盤整,甚至已經轉為上升趨勢,或者反之,下跌趨勢更為劇烈,需要進一步觀察其具體數值來判斷。 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `period` | `5`、`10`、`20`、`60`、`120`、`240` | `20` | | `operator` | `<`、`>` | `'>'` | ```python api.Block.con_us('D日均線斜率<>-0.4') ``` ### 今日收盤價<>開高低P% - `id`: `o1` - 邏輯:`今日收盤價${O}今日${A}${P}%` - 說明:這個技術條件表示當日收盤價相對於開盤價或當日交易區間(高點至低點)呈現顯著的強勢。它意味著在交易時段內,買方力量持續主導,將股價推升至相對高位並維持至收盤。這通常被視為一個強烈的看漲訊號,預示著市場對該股票的積極情緒和潛在的進一步上漲動能。 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `operator` | `<`、`>` | `'>'` | | `field1` | `Open`(開盤價)、`High`(最高價)、`Low`(最低價) | `'Open'` | | `percent` | `1`、`2`、`3`、`5`、`7`、`9` | `0` | ```python api.Block.con_us('今日收盤價<>開高低P%') ``` ### 今日收盤價距今日最低價 <>-P% - `id`: `o10` - 邏輯:`今日收盤價距今日最低價${O}-${P}%` - 說明:今日收盤價顯著高於盤中最低價,代表股價在盤中觸及低點後,出現了強勁的買盤支撐,將股價推升。這通常被視為多方力道轉強的訊號,顯示市場對該股的信心有所恢復,或是在低檔有承接買盤進場。 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `operator` | `>`、`<` | `'<'` | | `percent` | `3`、`5`、`7`、`9` | `3` | ```python api.Block.con_us('今日收盤價距今日最低價 <>-P%') ``` ### 今日收盤價(開低高)與近D日內最高價P% - `id`: `o17` - 邏輯:`今日收盤價跳空漲>${P}%` - 說明:當股價今日開盤價顯著高於昨日收盤價,形成一個未被交易填補的價格區間時,我們稱之為「跳空上漲」。這種現象通常代表市場在盤後或盤前接收到重大利多消息,導致買盤強勁湧入,使得股價直接跳過一段價格區間開出。若跳空漲幅超過P%,則顯示市場對該股票的預期極為樂觀,買方力道異常強勁,可能預示著股價將進入一段快速上漲的趨勢,但也需留意後續是否會出現獲利了結賣壓。 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `percent` | `3`、`5`、`7`、`9` | `3` | ```python api.Block.con_us('今日跳空漲>P%') ``` ### 今日跳空跌>-P% - `id`: `o18` - 邏輯:`今日收盤價跳空跌>-${P}%` - 說明:「今日跳空跌>-P%」表示該股票今日開盤價較昨日收盤價大幅下跌,且跌幅超過P%。這通常反映市場對該股票或整體市場出現了重大的負面消息或恐慌情緒,導致開盤即出現賣壓宣洩。這種情況下,股價可能面臨進一步的下行壓力,但若跌幅過大,也可能吸引逢低買盤,形成短線反彈或回補跳空缺口。 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `percent` | `3`、`5`、`7`、`9` | `3` | ```python api.Block.con_us('今日跳空跌>-P%') ``` ### 近D日內漲幅>P% - `id`: `o19` - 邏輯:`近${D}日內漲幅>${P}%` - 說明:這個條件表示股價在近期D個交易日內出現了顯著的P%漲幅,這通常意味著市場對該股票的買盤力道強勁,並可能預示著股價進入了加速上漲的階段。它反映了短期的強勢動能,吸引了市場的關注,可能是趨勢啟動的訊號。 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `period` | `5`、`10`、`20`、`60`、`120`、`240` | `20` | | `percent` | `5`、`10`、`15`、`20` | `10` | ```python api.Block.con_us('近D日內漲幅>P%') ``` ### 近D日內跌幅>-P% - `id`: `o20` - 邏輯:`近${D}日內跌幅>-${P}%` - 說明:這項技術條件指出,在過去D個交易日內,該檔股票的跌幅並未超過P%。這代表其股價表現相對穩健,市場賣壓有限,可能正處於築底或橫向盤整的階段,顯示出較強的抗跌性。 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `period` | `5`、`10`、`20`、`60`、`120`、`240` | `20` | | `percent` | `5`、`10`、`15`、`20` | `10` | ```python api.Block.con_us('近D日內跌幅>-P%') ``` ### 近D日區間振幅<>P% - `id`: `o21` - 邏輯:`近${D}日區間振幅<>${P}%` - 說明:「近D日區間振幅」指的是在過去D個交易日內,股價最高點與最低點之間的波動幅度,用以衡量股票在特定期間內的活躍程度與波動風險。當振幅較大時,通常代表市場交投熱絡,股價波動劇烈,可能預示著趨勢的形成或反轉;反之,若振幅較小,則可能意味著股價處於盤整階段,市場正在積蓄能量,等待方向的選擇。 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `period` | `5`、`10`、`20`、`60`、`120`、`240` | `20` | | `percent` | `5`、`10`、`15`、`20` | `10` | ```python api.Block.con_us('近D日區間振幅<>P%') ``` ### 連續D日皆漲,且累積幅度>P% - `id`: `o22` - 邏輯:`連續${D}日皆漲,且累積幅度>${P}%` - 說明:「連續D日皆漲,且累積幅度>P%」代表該股票在短時間內展現出強勁的上升動能,市場買盤持續積極。這種現象通常預示著股價可能正處於突破階段,或是新的上升趨勢正在形成,值得投資人密切關注其後續發展。 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `period` | `5`、`10`、`20`、`60`、`120`、`240` | `5` | | `percent` | `10`、`15`、`20`、`30`、`40`、`50`、`100` | `10` | ```python api.Block.con_us('連續D日皆漲,且累積幅度>P%') ``` ### 連續D日皆跌,且累積幅度>-P% - `id`: `o23` - 邏輯:`連續${D}日皆跌,且累積幅度>-${P}%` - 說明:這個條件描述的是一檔股票在連續數個交易日中呈現下跌走勢,但其累積跌幅並未達到極端程度。這通常意味著市場情緒雖然偏空,但並未出現恐慌性拋售,股價可能正在經歷溫和的修正或築底過程,而非失控的崩跌。 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `period` | `5`、`10`、`20`、`60`、`120`、`240` | `5` | | `percent` | `10`、`15`、`20`、`30`、`40`、`50`、`100` | `10` | ```python api.Block.con_us('連續D日皆跌,且累積幅度>-P%') ``` ### 當日為長紅K,且漲幅>P% - `id`: `o27` - 邏輯:`當日為長紅K,且漲幅>${P}%` - 說明:當日出現長紅K線,代表市場買盤力道強勁,股價從開盤到收盤呈現顯著上漲,顯示多方主導了當天的交易。若漲幅更超越特定百分比 (P%),則進一步確認了這股買氣的強度與市場的積極情緒,可能預示著股價短期內具備上攻動能或趨勢反轉的潛力。 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `percent` | `3.5`、`5`、`7`、`9` | `5` | ```python api.Block.con_us('當日為長紅K,且漲幅>P%') ``` ### 當日為長黑K,且跌幅>-P% - `id`: `o28` - 邏輯:`當日為長黑K,且跌幅>-${P}%` - 說明:「當日為長黑K,且跌幅>-P%」代表該股在交易日中遭遇了顯著的賣壓,導致收盤價大幅低於開盤價,並伴隨了超過P%的跌幅。這通常被解讀為市場情緒極度悲觀的訊號,暗示股價短期內可能面臨進一步的下行風險。 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `percent` | `3.5`、`5`、`7`、`9` | `5` | ```python api.Block.con_us('當日為長黑K,且跌幅>-P%') ``` ### 連續D日(周、月) K棒為紅K - `id`: `o29` - 邏輯:`連續${D}根${A}K棒為紅K` - 說明:這個技術條件表示在過去D個交易日(或週、月)中,股價的收盤價持續高於開盤價。這是一個明確的多頭訊號,顯示市場買盤強勁,股價呈現連續上漲的趨勢,通常預示著股價可能進入或正在經歷一段上升行情。 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `period` | `1`、`2`、`3`、`4`、`5` | `3` | | `period_type` | `day`(日)、`week`(周)、`month`(月) | `'day'` | ```python api.Block.con_us('連續D日(周、月) K棒為紅K') ``` ### 開盤漲幅>P%,張數>n張 - `id`: `o3` - 邏輯:`開盤漲幅>${P}%,成交量>${V}張` - 說明:當一檔股票在開盤時即展現出超過P%的漲幅,並伴隨著高於n張的成交量,這通常意味著市場對該股有高度的關注與強勁的買盤。這種「價漲量增」的現象,可能預示著股價將延續強勢表現,或是突破關鍵壓力位,展現出強勁的攻擊力道。 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `percent` | `1`、`2`、`3`、`5`、`7`、`9` | `3` | | `volume_threshold` | `100`、`300`、`500`、`1000` | `100000` | ```python api.Block.con_us('開盤漲幅>P%,張數>n張') ``` ### 連續D日(周、月) K棒為黑K - `id`: `o30` - 邏輯:`連續${D}根${A}K棒為黑K` - 說明:「連續D日(周、月) K棒為黑K」代表在D個連續的交易日、週或月內,該股票的收盤價都低於開盤價。這是一個明確的空頭訊號,顯示市場賣壓持續且強勁,投資人情緒趨於悲觀,股價可能處於下跌趨勢或即將反轉向下。 這種型態,特別是連續出現時,暗示著多方力量的衰竭,空方主導市場,後市股價可能進一步走弱。 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `period` | `1`、`2`、`3`、`4`、`5` | `3` | | `period_type` | `day`(日)、`week`(周)、`month`(月) | `'day'` | ```python api.Block.con_us('連續D日(周、月) K棒為黑K') ``` ### 突破近D日新高後,已回檔修正超過P% - `id`: `o31` - 邏輯:`突破近${D}日新高後,回檔修正已超過${P}%` - 說明:當股價突破近期高點後,隨即出現超過P%的拉回,這通常意味著市場在強勁上漲後進行獲利了結或技術性修正。此時,投資人會密切關注股價是否能在前高附近找到支撐,以確認這是一個健康的「回踩」動作,為下一波漲勢積蓄動能,或是突破動能不足的「假突破」訊號。 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `period` | `1`、`5`、`10`、`20`、`60`、`120`、`240` | `20` | | `percent` | `5`、`10`、`15`、`20`、`30` | `10` | ```python api.Block.con_us('突破近D日新高後,已回檔修正超過P%') ``` ### 跌破近D日低點後,已反彈超過P% - `id`: `o32` - 邏輯:`跌破近${D}日低點後,反彈不超過${P}%` - 說明:當股價跌破近期D日的低點時,通常會引發市場的恐慌性賣壓或停損賣盤,顯示短期趨勢轉弱。然而,若隨後股價能從低點迅速反彈超過P%,這代表在跌破低點後,市場出現了強勁的承接買盤,或是空頭力量已耗盡,形成一個潛在的「破底翻」格局。這種情況暗示股價可能已經完成築底,並準備展開一波反彈行情,是尋找轉折點的投資策略之一。 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `period` | `1`、`5`、`10`、`20`、`60`、`120`、`240` | `20` | | `percent` | `5`、`10`、`15`、`20`、`30` | `10` | ```python api.Block.con_us('跌破近D日低點後,已反彈超過P%') ``` ### 突破近D日新高後,已回檔修正不超過P% - `id`: `o33` - 邏輯:`突破近${D}日新高後,已回檔修正不超過${P}%` - 說明:當股價成功突破近期高點後,通常代表市場買盤強勁,趨勢向上確立。隨後的P%拉回,則可視為市場在消化獲利賣壓,或是對原突破點進行回測,這是一個健康的整理過程,為下一波漲勢積蓄動能,也提供投資人逢低佈局的機會。 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `period` | `1`、`5`、`10`、`20`、`60`、`120`、`240` | `20` | | `percent` | `5`、`10`、`15`、`20`、`30` | `10` | ```python api.Block.con_us('突破近D日新高後,已回檔修正不超過P%') ``` ### 跌破近D日低點後,已反彈不超過P% - `id`: `o34` - 邏輯:`跌破近${D}日低點後,已反彈不超過${P}%` - 說明:鎖定股價在跌破近 D 日(如一個月或一季)的新低點後,目前雖然有所回升,但回升幅度仍限制在 P% 以內。旨在篩選出處於『低檔震盪』或『築底階段』的標的,避開已經大幅飆漲的強勢股,尋求股價位階相對安全且具備補漲空間的進場機會。也可能股價反彈無力,可能只是「跌深反彈的休息站」,之後還有可能續跌(破底翻失敗) | 參數 | 合法值 | 預設值 | |------|--------|--------| | `period` | `1`、`5`、`10`、`20`、`60`、`120`、`240` | `20` | | `percent` | `5`、`10`、`15`、`20`、`30` | `10` | ```python api.Block.con_us('跌破近D日低點後,已反彈不超過P%') ``` ### 今日收盤(開高低)距近D日最高價昨日最高價 - `id`: `o37` - 邏輯:`今日${A}${O}昨日最高價` - 說明:這個條件是在觀察今日股價的表現,特別是開盤、最高、最低或收盤價,與昨日最高價之間的關係。當今日股價能夠有效突破並站穩昨日最高價時,通常代表市場買盤強勁,股價可能正在形成突破走勢,顯示多頭力道增強。反之,若股價未能突破昨日高點,則可能意味著上方壓力沉重,短期內上漲動能受阻。 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `field` | `Open`(開盤價)、`High`(最高價)、`Low`(最低價)、`Close`(收盤價) | `'Close'` | | `operator` | `<`、`>` | `'>'` | ```python api.Block.con_us('今日收盤(開高低)價<>昨日最高價') ``` ### 今日收盤(開高低)價<>昨日最低價 - `id`: `o38` - 邏輯:`今日${A}${O}昨日最低價` - 說明:「今日的股價區間,包括開盤、盤中高點、盤中低點及收盤價,皆高於昨日最低價」這個技術條件,意味著市場在今日展現了強勁的買盤承接力道,成功將股價推離並守穩在昨日的最低點之上。這通常被視為一個明確的止跌或反彈訊號,顯示空方力量已顯著減弱,多方開始掌握主導權,股價有機會進一步向上發展。 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `field` | `Open`(開盤價)、`High`(最高價)、`Low`(最低價)、`Close`(收盤價) | `'Close'` | | `operator` | `<`、`>` | `'>'` | ```python api.Block.con_us('今日收盤(開高低)價<>昨日最低價') ``` ### 今日區間震幅>近D日平均震幅P% - `id`: `o39` - 邏輯:`今日區間震幅>近${D}日平均震幅${P}%` - 說明:「今日區間震幅大於近D日平均震幅P%」代表今日股價的波動幅度顯著超越了過去D天的平均水準。這種異常擴大的震幅,通常暗示著市場情緒的劇烈變化,可能是多空雙方力量正在激烈交鋒,預示著股價可能即將脫離原有的盤整區間,進入一個新的趨勢階段。 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `period` | `5`、`10`、`20`、`60`、`120`、`240` | `20` | | `percent` | `0.01`、`1`、`3`、`5` | `1` | ```python api.Block.con_us('今日區間震幅>近D日平均震幅P%') ``` ### 開盤漲跌幅>±P% - `id`: `o43` - 邏輯:`開盤漲跌幅>±${P}%` - 說明:「開盤漲跌幅大於±P%」代表該股票在開盤時出現了顯著的跳空上漲或下跌,形成所謂的「跳空缺口」現象。這通常暗示著市場對該標的在盤前累積了強烈的多空共識,可能是受到重大消息面影響,進而導致股價在開盤瞬間產生劇烈波動。這種情況值得密切關注,因為它可能預示著當日股價的趨勢方向,但也可能因過度反應而出現回補或反轉。 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `percent` | `3`、`5`、`7`、`9` | `3` | ```python api.Block.con_us('開盤漲跌幅>±P%') ``` ### 連續漲跌超過P%,且成交量>N張 - `id`: `o5` - 邏輯:`連續${A}${D}超過${P}%,且成交量>${V}張` - 說明:這個條件表示股價在短時間內出現了顯著的方向性變動,無論是上漲或下跌,都伴隨著大量的交易活動。這代表市場對該股票的看法趨於一致,顯示出強勁的買盤推升或恐慌性的賣壓出籠,且這些趨勢都得到了市場資金的強力支持,使其成為一個值得關注的動態。 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `direction` | `up`(漲)、`down`(跌) | `'up'` | | `period` | `2`、`3`、`4`、`5`、`7` | `3` | | `percent` | `10`、`15`、`20`、`30`、`50` | `10` | | `volume_threshold` | `300`、`500`、`1000`、`2000`、`5000`、`10000`、`20000`、`50000` | `100000` | ```python api.Block.con_us('連續漲跌超過P%,且成交量>N張') ``` ### 最近第一根日(周月)K棒震幅<>最近第2根至第N根之平均震幅P倍 - `id`: `o50` - 邏輯:`最近第一根${A}K棒震幅${O}最近第2根至第${N}根之平均震幅${P}倍` - 說明:本策略將『最新一根 K 棒(日/週/月)的高低點震幅』,與『過去一段時間(第 2 根至第 N 根)的歷史平均震幅』進行比較。旨在偵測股價波動慣性的改變。若最新震幅顯著大於平均,代表趨勢正在爆發或發生轉折;若小於平均,則代表籌碼正在沉澱、趨勢進入收斂與蓄勢階段。 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `period_type` | `day`(日)、`week`(周)、`month`(月) | `'day'` | | `operator` | `<`、`>` | `'>'` | | `n` | `2`、`3`、`4`、`5`、`6`、`10`、`20`、`60`、`120`、`240` | `5` | | `multiplier` | `1`、`1.2`、`1.5`、`2`、`2.5`、`3` | `1.5` | ```python api.Block.con_us('最近第一根日(周月)K棒震幅<>最近第2根至第N根之平均震幅P倍') ``` ### 最近一根分(日/周/月)收盤價<>前一根(開盤價/最高價/最低價/收盤價) - `id`: `o51` - 邏輯:`最近一根${A}收盤價<>前一根${B}` - 說明:透過相鄰週期的價位變動,識別趨勢的慣性改變(如突破前高或跌破前低),作為進場攻擊或出場避險的即時訊號。 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `period_type` | `day`(日)、`week`(周)、`month`(月) | `'day'` | | `field` | `Open`(開盤價)、`High`(最高價)、`Low`(最低價)、`Close`(收盤價) | `'Close'` | ```python api.Block.con_us('最近一根分(日/周/月)收盤價<>前一根(開盤價/最高價/最低價/收盤價)') ``` ### 最近一日收盤K為實體長紅K,且上影線` | `'>'` | ```python api.Block.con_us('區間振幅P%') ``` ### 今日收盤價距今日最高價 <>P% - `id`: `o9` - 邏輯:`今日收盤價距今日最高價${O}${P}%` - 說明:當收盤價與盤中最高價之間存在顯著差距時,這通常暗示股價在衝高後遭遇強勁賣壓,未能守住漲幅。這反映出市場在較高價位承接力道不足,或有獲利了結賣盤湧現,可能預示短期上漲動能減弱。 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `operator` | `>`、`<` | `'>'` | | `percent` | `3`、`5`、`7`、`9` | `3` | ```python api.Block.con_us('今日收盤價距今日最高價 <>P%') ``` ### 最近一日收盤價<>N日前收盤價P% - `id`: `o93` - 邏輯:`最近一日收盤價${O}${N}日前收盤價${P}%` - 說明:動能強勢:忽略中間的盤整與震盪,該標的在N天內創造了實質的P%正報酬。動能衰竭:該標的在N天內發生了嚴重的實質虧損(如跌幅>20%)。在多頭市場中,這可能是極佳的『乖離過大、跌深反彈』左側買點。 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `operator` | `<`、`>` | `'>'` | | `period` | `5`、`10`、`20`、`60`、`120`、`240` | `20` | | `percent` | `5`、`10`、`20`、`30`、`40`、`50` | `10` | ```python api.Block.con_us('最近一日收盤價<>N日前收盤價P%') ``` ### 日漲跌幅排行前N名 - `id`: `r1` - 邏輯:`日漲跌幅排行前${N}名` - 說明:「日漲跌幅排行」是市場上最直接反映當日股價變動強弱的指標,它列出了當天漲幅最大和跌幅最大的股票。透過觀察這個排行,投資人可以迅速掌握市場熱點、資金流向以及哪些個股受到重大消息或事件的影響,進而評估潛在的交易機會或風險。 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `top_n` | `5`、`10`、`100`、`150`、`200`、`500`、`1000` | `50` | | `direction` | `>`(漲)、`<`(跌) | `''` | ```python api.Block.con_us('日漲跌幅排行前N名') ``` ### 成交量增排行前N名 - `id`: `r10` - 邏輯:`成交量增排行前${N}名` - 說明:「成交量增排行榜」顯示的是市場上交易活動顯著增加的股票。這通常意味著這些股票正受到投資者的高度關注,可能是因為有新的資訊、消息或基本面變化,進而引發了大量的買賣行為。成交量的放大,往往預示著股價可能即將出現較大的波動,是判斷市場熱度與潛在趨勢轉變的重要指標。 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `top_n` | `5`、`10`、`100`、`150`、`200`、`500`、`1000` | `50` | ```python api.Block.con_us('成交量增排行前N名') ``` ### 股價淨值比排行前N名 - `id`: `r11` - 邏輯:`股價淨值比排行前${N}名` - 說明:「股價淨值比排行榜」是一種將股票依照其股價淨值比(P/B Ratio)由低到高或由高到低排列的工具。股價淨值比是衡量公司股價相對於其每股淨值(即公司總資產減去總負債後,再除以流通股數)的比例,反映了市場願意為公司每單位淨資產支付的價格。 這個排行榜常用於價值投資策略,投資者藉此尋找股價可能被低估的股票,特別是那些股價淨值比低於1的公司,這可能意味著市場低估了其資產價值,或是公司股價低於其帳面價值。然而,單純的低股價淨值比並不保證是好的投資,仍需結合公司前景、行業趨勢及其他財務指標(如本益比、股東權益報酬率)進行全面評估.。 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `top_n` | `5`、`10`、`100`、`150`、`200`、`500`、`1000` | `50` | ```python api.Block.con_us('股價淨值比排行前N名') ``` ### 股價創N日新高 - `id`: `r12` - 邏輯:`股價創 ${period} 日新高` - 說明:股價創N日內最高價,今日收盤價>=近D日內最高價 當股價創下N日新高時,這代表在過去N個交易日內,該股票的收盤價或盤中價達到了最高點。這通常被視為一個強烈的多頭訊號,顯示市場對該股票的買盤力道強勁,股價具有向上突破的動能,可能預示著一波新的上漲趨勢即將展開。 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `period` | `1`、`5`、`10`、`20`、`60`、`120`、`240` | `20` | ```python api.Block.con_us('股價創N日新高') ``` ### 近D日漲跌幅排行榜前N名 - `id`: `r16` - 邏輯:`近${D}日${A}幅排行前${N}名` - 說明:「漲跌幅排行榜」顧名思義,是列出在特定時間內股價上漲或下跌幅度最大的股票。漲幅排行榜不僅能快速揭示市場的熱點板塊和強勢個股,更是資金流向的重要指標,有助於投資人掌握當前市場的主流趨勢與潛力標的。跌幅排行榜通常反映了市場的恐慌情緒、突發利空消息,或是公司基本面出現重大惡化。對於投資人而言,它既可能是尋找「超跌反彈」機會的起點,也可能是警示應避開風險的訊號。 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `period` | `1`、`2`、`3`、`4`、`5`、`10`、`20`、`60`、`120`、`240` | `20` | | `direction` | `>`(漲)、`<`(跌) | `''` | | `top_n` | `5`、`10`、`30`、`50`、`100`、`150`、`200`、`500`、`1000` | `50` | ```python api.Block.con_us('近D日漲跌幅排行榜前N名') ``` ### 月營收月增率排行前N名 - `id`: `r17` - 邏輯:`月營收月增率排行前${N}名` - 說明:月營收月增率排行,指的是比較公司當月營收與上個月營收的成長幅度,並將其進行排序。這項指標能快速篩選出短期營收動能強勁的企業,通常代表公司產品或服務需求旺盛,有助於判斷其近期營運表現是否正在加速。 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `top_n` | `50`、`100`、`150`、`200`、`500`、`1000` | `50` | ```python api.Block.con_us('月營收月增率排行前N名') ``` ### 月營收年增率排行前N名 - `id`: `r18` - 邏輯:`月營收年增率排行前${N}名` - 說明:月營收年增率排行,指的是將公司每月公布的營收與去年同期營收進行比較,並依其成長幅度進行排序。這項指標能有效反映公司短期的營運成長動能與市場競爭力,是評估企業基本面是否持續改善的重要參考依據。高年增率通常代表公司產品或服務需求旺盛,有助於吸引投資人關注。 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `top_n` | `50`、`100`、`150`、`200`、`500`、`1000` | `50` | ```python api.Block.con_us('月營收年增率排行前N名') ``` ### 市值排名前N名以上(下)公司 - `id`: `r19` - 邏輯:`市值排名前${N}名${A}公司` - 說明:市值排名「以上」(前段班): 通常是尋求權值股、穩定領息或長期配置。 市值排名「以下」(後段班): 若策略是挑選排名較後的公司,通常是在尋找中小型成長股,雖然風險較高,但潛在翻倍的爆發力也較大。 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `top_n` | `50`、`100`、`150`、`200`、`500`、`1000` | `50` | | `direction` | `以上`、`以下` | `'up'` | ```python api.Block.con_us('市值排名前N名以上(下)公司') ``` ### 月漲跌幅排行前N名 - `id`: `r2` - 邏輯:`月漲跌幅排行前${N}名` - 說明:「月漲跌幅排行」是一種快速篩選工具,用來識別在過去一個月內股價表現最突出(上漲或下跌)的股票。透過這個排行,投資者可以迅速掌握市場熱點或潛在的超跌股,進而評估其動能是否延續,或是否存在反彈機會。這有助於執行動能追蹤策略,尋找強勢股;或是進行逆勢操作,挖掘被錯殺的價值股。 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `top_n` | `5`、`10`、`100`、`150`、`200`、`500`、`1000` | `50` | | `direction` | `>`(漲)、`<`(跌) | `''` | ```python api.Block.con_us('月漲跌幅排行前N名') ``` ### 股本排名前N名以上(下)公司 - `id`: `r20` - 邏輯:`股本排名前${N}名以${O}公司` - 說明:本策略根據公司的股本(發行總股數)大小進行排序。選取股本最大(或最小)的前 N 名企業,旨在區分標的的『市場代表性』與『價格波動性』,藉此過濾出大型藍籌股或具備高彈性的中小型成長股。 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `top_n` | `50`、`100`、`150`、`200`、`500`、`1000` | `50` | | `direction` | `上`、`下` | `'up'` | ```python api.Block.con_us('股本排名前N名以上(下)公司') ``` ### 股價排名前N名以上(下)公司 - `id`: `r21` - 邏輯:`股價排名前${N}名以${O}公司` - 說明:本策略根據市場股價的絕對價值進行排序,僅選取全市場中股價最高(或最低)的前 N 名企業作為交易池。其核心邏輯在於篩選出具備『高價值/高門檻』或『低價/高轉機』特性的標的。 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `top_n` | `50`、`100`、`150`、`200`、`500`、`1000` | `50` | | `direction` | `上`、`下` | `'up'` | ```python api.Block.con_us('股價排名前N名以上(下)公司') ``` ### 周轉率排行前N名 - `id`: `r22` - 邏輯:`周轉率排行前${N}名公司` - 說明:本策略根據股票在特定期間內的『周轉率』進行排序。選取全市場中交易最活絡(或最冷門)的前 N 名標的,旨在捕捉市場資金的流向,找出當下最具人氣、動能最強,或是籌碼最為沉澱的觀察清單。 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `top_n` | `50`、`100`、`150`、`200`、`500`、`1000` | `50` | ```python api.Block.con_us('周轉率排行前N名') ``` ### 成交值排行前N名 - `id`: `r23` - 邏輯:`成交值排行前${N}名公司` - 說明:本策略根據標的的『成交金額』(股價 × 成交股數)進行排序。選取全市場中資金參與度最高的前 N 名企業,旨在識別市場的核心主戰場,確保投資標的具備極佳的流動性,並緊跟法人與大戶的資金動向。 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `top_n` | `50`、`100`、`150`、`200`、`500`、`1000` | `50` | ```python api.Block.con_us('成交值排行前N名') ``` ### 成交金額排行前N名 - `id`: `r23` - 邏輯:`成交金額排行前${N}名` - 說明:「成交金額排行」是衡量市場資金流向與個股熱門程度的重要指標。它代表了在特定時間內,股票交易的總金額,而非單純的交易股數,因為不同股價的股票,即使交易股數相同,其成交金額也會有巨大差異。透過觀察成交金額排行,我們可以判斷哪些股票或產業板塊正受到市場的高度關注與資金追捧,進而掌握潛在的投資機會或市場趨勢. | 參數 | 合法值 | 預設值 | |------|--------|--------| | `top_n` | `5`、`10`、`100`、`150`、`200`、`500`、`1000` | `50` | ```python api.Block.con_us('成交金額排行前N名') ``` ### 近D日成交值增(減)幅排行前N名 - `id`: `r24` - 邏輯:`近${D}日成交值${O}幅排行前${N}名` - 說明:本策略計算個別標的在近 D 日內的『平均成交值』,並與前一時期相比的變動百分比進行排序。旨在捕捉資金突然大量湧入(或撤出)的訊號,識別出市場情緒剛開始轉變、或是主力部隊正在集結的『起漲/起跌』標的。 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `period` | `1`、`2`、`3`、`4`、`5`、`10`、`20`、`60`、`120`、`240` | `20` | | `direction` | `增`、`減` | `'up'` | | `top_n` | `50`、`100`、`150`、`200`、`500`、`1000` | `50` | ```python api.Block.con_us('近D日成交值增(減)幅排行前N名') ``` ### 近D日區間振幅排行前N名 - `id`: `r28` - 邏輯:`近D日區間振幅排行前${N}名` - 說明:本策略計算個股在近 D 日內,『區間最高價』與『區間最低價』的差額,並除以『區間期初收盤價』(或前一日收盤價),得出該期間的總震盪幅度(%),最後將全市場個股進行由大到小的排序,取出前 N 名。此指標旨在篩選出市場上目前股價『波動最劇烈、洗盤最兇狠、極具短線爆發力』的焦點股。 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `top_n` | `30`、`50`、`100`、`150`、`200`、`500`、`1000` | `50` | | `period` | `1`、`2`、`3`、`4`、`5`、`10`、`20`、`60`、`120`、`240` | `20` | ```python api.Block.con_us('近D日區間振幅排行前N名') ``` ### 夏普指數排行前N名 - `id`: `r29` - 邏輯:`夏普指數排行前${N}名` - 說明:夏普指數指標是金融界最常用來衡量投資組合性價比的指標。公式是(預期年化報酬率-無風險利率)/年化標準差,以此排名 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `top_n` | `30`、`50`、`100`、`150`、`200`、`500`、`1000` | `50` | ```python api.Block.con_us('夏普指數排行前N名') ``` ### 資本報酬率排行前N名 - `id`: `r30` - 邏輯:`資本報酬率排行前${N}名` - 說明:本策略計算全市場所有上市櫃公司的『資本報酬率,將其由高至低進行排序。進入前N 名(品質因子封頂):代表這家公司利用股東的錢(或包含借來的錢)去賺取利潤的效率,傲視全市場。這類公司通常擁有極強的『定價權』、極高的『無形資產(如專利、品牌)』或無可取代的『規模優勢(如先進製程代工)』。此為『品質因子』量化模型的核心樞紐。 長期持有資本報酬率霸榜的公司,其資產的複利成長速度將遠超大盤均值。 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `top_n` | `30`、`50`、`100`、`150`、`200`、`500`、`1000` | `50` | ```python api.Block.con_us('資本報酬率排行前N名') ``` ### 盈餘報酬率排行前N名 - `id`: `r31` - 邏輯:`盈餘報酬率排行前${N}名` - 說明:本策略計算全市場上市櫃公司的『盈餘報酬率』,將其由高至低進行排序。盈餘報酬率:其為本益比的倒數。公式為每股盈餘÷每股股價。它代表著:『如果我今天用這個股價把這家公司買下來,它每年能幫我賺回百分之幾的收益?』進入前N名(超值煙蒂股或遭錯殺的好公司):代表這家公司的股價被市場極度低估,或是其獲利能力遠超其目前的市值表現,這類公司具備極高的安全邊際 - 無參數 ```python api.Block.con_us('盈餘報酬率排行前N名') ``` ### 葛林布雷排行前N名 - `id`: `r32` - 邏輯:`葛林布雷排行前${N}名` - 說明:本策略同時參考資本報酬率與盈餘報酬率,根據名次加總後,找出排名數字較低,代表靠前排名的公司 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `top_n` | `30`、`50`、`100`、`150`、`200`、`500`、`1000` | `50` | ```python api.Block.con_us('葛林布雷排行前N名') ``` ### 近四季本益比排行前N名 - `id`: `r5` - 邏輯:`近四季本益比排行前${N}名` - 說明:這個條件指的是根據公司過去四個季度的累計盈餘計算出的本益比,並將其與其他公司進行比較排名。透過觀察「近四季本益比排行榜」,投資者可以快速篩選出相對被低估或高估的股票,作為價值投資或成長投資的初步參考依據。 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `top_n` | `5`、`10`、`100`、`150`、`200`、`500`、`1000` | `50` | ```python api.Block.con_us('近四季本益比排行前N名') ``` ### 本益比排行前N名 - `id`: `r6` - 邏輯:`本益比排行前${N}名` - 說明:「本益比排行榜」是將股票依照其本益比(Price-to-Earnings Ratio, P/E)高低進行排序的列表,本益比是衡量股價相對於公司每股盈餘的指標。投資者通常利用此排行榜來快速篩選出相對便宜或昂貴的股票,作為評估投資價值和潛在風險的初步參考。然而,單純的本益比高低並非絕對的投資判斷依據,還需結合產業特性、公司成長性及整體市場狀況進行綜合分析,才能更全面地評估其合理性.「本益比排行榜」是將股票依照其本益比(Price-to-Earnings Ratio, P/E)高低進行排序的列表,本益比是衡量股價相對於公司每股盈餘的指標。投資者通常利用此排行榜來快速篩選出相對便宜或昂貴的股票,作為評估投資價值和潛在風險的初步參考。然而,單純的本益比高低並非絕對的投資判斷依據,還需結合產業特性、公司成長性及整體市場狀況進行綜合分析,才能更全面地評估其合理性。 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `top_n` | `5`、`10`、`100`、`150`、`200`、`500`、`1000` | `50` | ```python api.Block.con_us('本益比排行前N名') ``` ### 近四季EPS排行前N名 - `id`: `r7` - 邏輯:`近四季EPS排行前${N}名` - 說明:「近四季EPS排行榜」是衡量一家公司在過去一年(四個季度)獲利能力的關鍵指標,透過將稅後淨利除以流通在外普通股股數,得出每股股票所賺取的盈餘。這個排行榜能幫助投資人快速篩選出獲利能力強勁且相對穩定的公司,因為它能有效平滑單一季度可能存在的季節性或一次性損益波動,提供更具參考價值的長期盈利趨勢。 投資者可藉此評估公司的基本面是否穩健,並作為進一步研究其成長性與投資價值的起點。 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `top_n` | `5`、`10`、`100`、`150`、`200`、`500`、`1000` | `50` | ```python api.Block.con_us('近四季EPS排行前N名') ``` ### 成交量排名前30(股本小於50億) - `id`: `r9` - 邏輯:`成交量排名前${N}(股本小於${V}億)` - 說明:這個篩選條件著重於市場上「高流動性」與「高彈性」的標的。成交量排名前30確保了這些股票具有足夠的市場關注度與交易活絡度,便於資金進出;而股本小於50億則意味著這些公司在獲得資金青睞時,股價更容易產生顯著的波動與爆發力,是尋找潛在成長股或短期交易機會的有效策略。 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `top_n` | `30` | `30` | | `value` | `50` | `50` | ```python api.Block.con_us('成交量排名前30(股本小於50億)') ``` ### 日KD的D值<>N - `id`: `t1` - 邏輯:`日KD的D值${operator}${percent}` - 說明:日KD指標中的D值,代表股價在一段時間內的平均動能趨勢。當D值不等於N時,這表示目前的股價動能並未處於N所代表的特定關鍵狀態,例如超買(D>80)、超賣(D<20)或多空平衡點(D=50)。這通常意味著市場尚未達到或已經脫離了N所定義的某個重要轉折或趨勢確認點,因此需要結合K線走勢及其他指標來判斷後續方向。 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `operator` | `>`、`<` | `'<'` | | `percent` | `20`、`50`、`80` | `20` | ```python api.Block.con_us('日KD的D值<>N') ``` ### 月KD 黃金交叉 - `id`: `t10` - 說明:「月KD 黃金交叉」代表著股價在月線圖上,快速反應的K值向上突破慢速反應的D值。這通常被視為一個中長期趨勢由空翻多、股價可能進入上升通道的買進訊號,暗示著市場動能正在增強,投資人信心回升。 - 無參數 ```python api.Block.con_us('月KD 黃金交叉') ``` ### 威廉指標N% - `id`: `t12` - 邏輯:`威廉指標${operator}${percent}%` - 說明:當威廉指標(Williams %R)數值高於N%時,這通常意味著股價在過去一段時間內已達到相對高點,進入了超買區間,暗示短期內可能面臨回檔或整理壓力。然而,在極度強勢的市場中,威廉指標長時間維持在高檔,也可能反映出強勁的買盤動能,股價仍有上攻潛力。 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `operator` | `>` | `'>'` | | `percent` | `-20`、`-50`、`-80` | `-20` | ```python api.Block.con_us('威廉指標>N%') ``` ### DIF-MACD<>0 - `id`: `t13` - 邏輯:`DIF-MACD${operator}${percent}` - 說明:「DIF-MACD<>0」指的是MACD指標中的柱狀圖不為零。這代表DIF快線與MACD慢線尚未發生交叉,市場的動能趨勢仍在持續中。當柱狀圖為正值時,表示DIF線在MACD線上方,多頭動能強勁;當柱狀圖為負值時,則顯示DIF線在MACD線下方,空頭動能佔優勢,有助於判斷當前趨勢的強度與方向。 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `operator` | `>`、`<` | `'>'` | | `percent` | `0` | `0` | ```python api.Block.con_us('DIF-MACD<>0') ``` ### DIF-MACD正轉負 - `id`: `t14` - 說明:「DIF-MACD正轉負」在技術分析中,指的是DIF線(快線)由上方向下穿越MACD線(慢線),這通常被稱為「死亡交叉」。這個訊號意味著股價的短期上漲動能正在減弱,甚至可能預示著股價即將進入調整或下跌趨勢。此時,投資者應密切關注市場走勢,並考慮風險管理,因為這可能是一個賣出訊號或趨勢反轉的警示.。 - 無參數 ```python api.Block.con_us('DIF-MACD正轉負') ``` ### DIF-MACD負轉正 - `id`: `t15` - 說明:「DIF-MACD負轉正」指的是MACD指標中的柱狀圖(Histogram)從負值轉為正值。這代表著DIF線(快線)向上穿越了MACD線(慢線),形成所謂的「黃金交叉」買入訊號。 這個技術條件意味著短期市場動能開始增強,多頭力量逐漸佔據主導地位,通常被視為股價可能由跌轉漲或加速上漲的潛在買進時機。 - 無參數 ```python api.Block.con_us('DIF-MACD負轉正') ``` ### DIF-MACD近D日持續增加(減少) - `id`: `t16` - 邏輯:`DIF-MACD近${period}日持續${operator}` - 說明:這是在幫你找『順風』或『逆風』。如果這兩個數值的差持續變大,就像風愈吹愈大,你跟著風走會比較省力(趨勢強勁);如果差值開始縮小,就代表風快停了,這時候要小心可能快要轉向了。 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `period` | `1`、`2`、`3`、`4`、`5`、`10` | `3` | | `operator` | `>`(增加)、`<`(減少) | `'>'` | ```python api.Block.con_us('DIF-MACD近D日持續增加(減少)') ``` ### DIF<>0 - `id`: `t17` - 邏輯:`DIF${operator}0` - 說明:DIF(差離值)是MACD指標中的核心組成部分,它代表了短期移動平均線與長期移動平均線之間的差值。當DIF不等於零時,表示短期與長期趨勢線之間存在明顯的距離,這暗示著市場正處於一個明確的趨勢之中,而非盤整或趨勢不明的狀態。具體來說,DIF大於零通常被視為多頭趨勢的訊號,而DIF小於零則傾向於空頭趨勢。 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `operator` | `>`、`<` | `'>'` | ```python api.Block.con_us('DIF<>0') ``` ### DIF正轉負 - `id`: `t18` - 說明:DIF(差離值)是MACD指標中的一條快線,它代表短期與長期移動平均線之間的差值,用來衡量市場的短期動能。當DIF從正值轉為負值時,表示短期動能由強轉弱,從多頭主導轉為空頭主導,這通常被視為一個潛在的賣出訊號,暗示股價可能由漲轉跌或下跌動能增強。 這意味著市場的短期趨勢開始弱於長期趨勢,投資者應留意股價可能進入回檔或下跌的階段。 - 無參數 ```python api.Block.con_us('DIF正轉負') ``` ### DIF負轉正 - `id`: `t19` - 說明:「DIF負轉正」是指MACD指標中的DIF(差離值)線從零軸下方穿越至零軸上方。這代表短期移動平均線已向上突破長期移動平均線,顯示市場的短期動能由空方轉為多方,暗示股價可能從下跌趨勢轉為上漲趨勢。這是一個重要的多頭訊號,預示著潛在的趨勢反轉或新一輪上漲行情的啟動。 - 無參數 ```python api.Block.con_us('DIF負轉正') ``` ### 日K<>日D - `id`: `t2` - 邏輯:`日K${operator}日D` - 說明:「日K<>日D」指的是KD指標中的K線與D線發生交叉。K線是快速線,D線是慢速線,兩者的交叉代表市場動能的轉變。當K線向上突破D線時,稱為「黃金交叉」,通常被視為買進訊號,暗示股價可能從低點反轉向上;反之,當K線向下跌破D線時,稱為「死亡交叉」,則被視為賣出訊號,預示股價可能從高點反轉向下。 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `operator` | `>`、`<` | `'>'` | ```python api.Block.con_us('日K<>日D') ``` ### DIF近D日持續增加(減少) - `id`: `t20` - 邏輯:`DIF近${period}日持續${operator}` - 說明:DIF(差離值)是MACD指標中的「快線」,它反映了短期與長期指數移動平均線之間的差值,用來衡量市場的短期動能變化。 當DIF在近D日持續增加時,這代表短期上漲動能持續增強,相對於長期趨勢而言,多頭力量正在累積,顯示市場可能處於上升趨勢或即將轉強。 反之,若DIF持續減少,則表示短期下跌動能持續增強,空頭力量佔據主導,暗示市場可能處於下降趨勢或面臨回檔壓力。 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `operator` | `>`(增加)、`<`(減少) | `'>'` | | `period` | `2`、`3`、`4`、`5`、`6`、`8`、`10`、`20` | `3` | ```python api.Block.con_us('DIF近D日持續增加(減少)') ``` ### DIF黃金交叉上穿過MACD - `id`: `t21` - 說明:當DIF線從下方穿越MACD線,形成「黃金交叉」時,這通常被視為一個看漲訊號。這表示短期動能正在增強,超越了長期動能,暗示股價可能即將進入上升趨勢或延續其漲勢。 - 無參數 ```python api.Block.con_us('DIF黃金交叉上穿過MACD') ``` ### DIF死亡交叉下穿過MACD - `id`: `t22` - 說明:「DIF死亡交叉下穿過MACD」是指在MACD指標中,DIF快線由上方向下跌破MACD慢線(也稱為DEA線或訊號線)的現象。這通常被視為一個看跌訊號,暗示著市場的短期動能正在減弱,可能預示著股價將進入下跌趨勢或現有跌勢將持續。簡單來說,這代表短期平均買進價格小於長期平均價格,賣壓轉強,投資人應考慮獲利了結或止損。 - 無參數 ```python api.Block.con_us('DIF死亡交叉下穿過MACD') ``` ### 周DIF-MACD<>0 - `id`: `t23` - 邏輯:`周DIF-MACD${operator}${percent}` - 說明:「周DIF-MACD<>0」代表週線圖上的MACD柱狀圖不為零,這意味著DIF快線與MACD慢線目前並未交叉。這顯示市場正處於一個明確的趨勢慣性之中,而非趨勢轉折的關鍵時刻,有助於判斷中長期趨勢的延續性。 具體來說,DIF(差離值)是短期指數移動平均線(通常為12日EMA)減去長期指數移動平均線(通常為26日EMA)的結果,反映了短期與中期價格趨勢的偏離程度。 MACD線(又稱DEA或訊號線)則是DIF的9日指數移動平均線,對DIF進行了平滑處理,使其信號更為穩定。 當DIF與MACD線不相等時,MACD柱狀圖就會顯示數值(正值或負值),這表示DIF線與MACD線之間存在距離,市場動能正在持續,而非處於即將發生黃金交叉或死亡交叉的轉折點。 由於是「周」線級別的分析,這種趨勢的延續性通常具有較高的可靠性,適合用於判斷中長期的市場方向。 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `operator` | `>`、`<` | `'>'` | | `percent` | `0` | `0` | ```python api.Block.con_us('周DIF-MACD<>0') ``` ### 周DIF-MACD正轉負 - `id`: `t24` - 說明:「周DIF-MACD正轉負」表示DIF線(短期與長期移動平均線的差值)已由正值轉為負值,這是一個重要的中長期趨勢反轉訊號。它暗示著股價的上升動能正在衰竭,市場可能從多頭格局轉為空頭格局,投資人應留意潛在的下跌風險。 - 無參數 ```python api.Block.con_us('周DIF-MACD正轉負') ``` ### 周DIF-MACD負轉正 - `id`: `t25` - 說明:「周DIF-MACD負轉正」代表在週線圖上,DIF線(快線)從負值區間向上穿越MACD線(慢線),形成「黃金交叉」買入訊號。這通常意味著股價的短期動能由弱轉強,且超越了長期動能,暗示著市場情緒從空頭轉為多頭,可能預示著一波中長期上漲趨勢的開始或強勁反彈。由於是週線級別的訊號,其可靠性與趨勢的持續性通常會比日線級別的訊號更強。 - 無參數 ```python api.Block.con_us('周DIF-MACD負轉正') ``` ### 周DIF-MACD近D日持續增加(減少) - `id`: `t26` - 邏輯:`周DIF-MACD近${period}日持續${operator}` - 說明:這個技術條件指的是MACD指標中的「柱狀圖」(或稱MACD動能柱)在週線圖上的表現。當周DIF-MACD在近D週持續增加時,這代表股價的上升動能正在增強,或者下跌動能正在減弱,通常被視為一個看漲訊號,暗示股價可能進入上升趨勢或其上升趨勢正在加速。反之,若周DIF-MACD在近D週持續減少,則表示股價的上升動能正在減弱,或者下跌動能正在增強,這通常被視為一個看跌訊號,暗示股價可能進入下跌趨勢或其下跌趨勢正在加速。由於是使用週線數據,這個訊號對於判斷中長期趨勢的轉變具有較高的參考價值。 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `period` | `1`、`2`、`3`、`4`、`6`、`8` | `3` | | `operator` | `>`(增加)、`<`(減少) | `'>'` | ```python api.Block.con_us('周DIF-MACD近D日持續增加(減少)') ``` ### 周DIF<>0 - `id`: `t27` - 邏輯:`周DIF${operator}0` - 說明:當「周DIF<>0」時,這代表在週線圖上,DIF線(快線)並未處於零軸位置。這意味著市場的短期週線動能與長期週線動能之間存在明顯差異,顯示股價正處於一個有方向性的趨勢中,而非盤整或中性狀態。具體來說,DIF大於零表示多頭動能較強,而DIF小於零則表示空頭動能佔優。 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `operator` | `>`、`<` | `'>'` | ```python api.Block.con_us('周DIF<>0') ``` ### 周DIF正轉負 - `id`: `t28` - 說明:「周DIF正轉負」代表著股價的短期移動平均線(通常是12週EMA)已經向下穿越了長期移動平均線(26週EMA)。這是一個重要的賣出訊號,暗示著股價的上升動能正在減弱,並可能預示著中長期趨勢由多轉空,投資人應提高警覺。 - 無參數 ```python api.Block.con_us('周DIF正轉負') ``` ### 周DIF負轉正 - `id`: `t29` - 說明:「周DIF負轉正」是指在MACD指標中,代表短期動能的DIF線(快線)從零軸下方穿越至零軸上方。這通常意味著股價的短期平均成本已超越長期平均成本,市場的空頭力量減弱,多頭力量開始增強,預示著股價可能從下跌趨勢轉為上漲趨勢,是一個潛在的買入訊號。 - 無參數 ```python api.Block.con_us('周DIF負轉正') ``` ### 周K<>周D - `id`: `t3` - 邏輯:`周K${operator}周D` - 說明:「周K<>周D」表示在週線圖上,隨機指標(Stochastic Oscillator)的K線與D線目前並未重合。這代表市場的短期動能(K線)與長期動能(D線)之間存在差異,暗示著股價趨勢正在形成或延續,而非處於盤整或轉折的關鍵時刻。 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `operator` | `>`、`<` | `'>'` | ```python api.Block.con_us('周K<>周D') ``` ### 周DIF近D周持續增加(減少) - `id`: `t30` - 邏輯:`周DIF近${period}周持續${operator}` - 說明:「周DIF持續增加」表示在過去D週內,股價的短期動能相對於長期趨勢持續增強,這通常預示著市場買盤力道穩健,股價有望維持上漲趨勢。反之,「周DIF持續減少」則代表短期動能持續減弱,賣壓可能正在累積,需留意股價可能面臨回檔或轉弱的風險。DIF(差離值)是MACD指標中的核心組成部分,它反映了短期指數移動平均線與長期指數移動平均線之間的差值,用以衡量市場動能的強弱與方向。 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `operator` | `>`(增加)、`<`(減少) | `'>'` | | `period` | `1`、`2`、`3`、`4`、`5`、`6`、`9`、`12` | `3` | ```python api.Block.con_us('周DIF近D周持續增加(減少)') ``` ### 周DIF黃金交叉上穿過周MACD - `id`: `t31` - 說明:當週線圖上的DIF線向上穿越MACD線形成「黃金交叉」時,這是一個強烈的看漲訊號。這表示短期動能已顯著增強並超越了長期趨勢,暗示股價可能正從下跌或盤整格局轉為一個更為穩固且持續的上升趨勢。 - 無參數 ```python api.Block.con_us('周DIF黃金交叉上穿過周MACD') ``` ### 周DIF死亡交叉下穿過周MACD - `id`: `t32` - 說明:當週線DIF(差離值)向下穿越週線MACD(訊號線)時,這通常被視為一個看跌的「死亡交叉」訊號。它意味著股票的短期動能正在減弱,並可能預示著股價將進入一段下跌趨勢,或是現有跌勢的延續,投資人應留意風險。 - 無參數 ```python api.Block.con_us('周DIF死亡交叉下穿過周MACD') ``` ### 月DIF-MACD<>0 - `id`: `t33` - 邏輯:`月DIF-MACD${operator}${percent}` - 說明:「月DIF-MACD<>0」這個技術條件,指的是月線圖上的MACD柱狀圖不為零。這意味著月線的DIF快線與MACD慢線目前並未交叉,顯示市場的長期動能處於明確的趨勢之中,而非處於盤整或轉折的關鍵時刻。當柱狀圖為正值時,代表多頭動能強勁;當為負值時,則顯示空頭趨勢佔優。 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `operator` | `>`、`<` | `'>'` | | `percent` | `0` | `0` | ```python api.Block.con_us('月DIF-MACD<>0') ``` ### 月DIF-MACD正轉負 - `id`: `t34` - 說明:「月DIF-MACD正轉負」代表在月線圖上,DIF線(快線)從MACD線(慢線)上方穿越至下方,形成一個「死亡交叉」的賣出訊號。 這通常預示著股價的上升動能正在減弱,甚至可能進入中長期下跌趨勢,對於投資者而言,這是一個需要高度警惕的訊號,可能需要考慮減持或出場以規避潛在的下行風險。 - 無參數 ```python api.Block.con_us('月DIF-MACD正轉負') ``` ### 月DIF-MACD負轉正 - `id`: `t35` - 說明:「月DIF-MACD負轉正」這個技術條件,指的是在月線圖上,MACD指標中的DIF線(快線)由下往上穿越MACD線(慢線或訊號線),使得兩者之間的差值(即MACD柱狀圖)從負值轉為正值。 這是一個強烈的長期買入訊號,代表股價的月線級別動能由空轉多,暗示著市場趨勢可能正從下跌或盤整轉為上升,是中長期投資者判斷趨勢轉折的重要依據。 - 無參數 ```python api.Block.con_us('月DIF-MACD負轉正') ``` ### 月DIF-MACD近D月持續增加(減少) - `id`: `t36` - 邏輯:`月DIF-MACD近${period}月持續${operator}` - 說明:當月DIF線與MACD線的差值(即MACD柱狀圖)在近D個月持續增加時,這代表著股價的上升動能正在穩定且持續地增強,顯示多方力量逐漸佔據主導地位。反之,若持續減少,則意味著下跌動能不斷累積,空方力量正在增強,股價可能面臨更大的下行壓力。 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `period` | `1`、`2`、`3`、`4`、`5`、`6` | `3` | | `operator` | `>`(增加)、`<`(減少) | `'>'` | ```python api.Block.con_us('月DIF-MACD近D月持續增加(減少)') ``` ### 月DIF<>0 - `id`: `t37` - 邏輯:`月DIF${operator}0` - 說明:「月DIF<>0」表示月線MACD指標中的DIF線不為零,這意味著在月線級別上,股價的短期與長期趨勢之間存在著動能差異。當DIF不為零時,市場正處於一個有方向性的趨勢中,無論是多頭或空頭,都顯示出一定的力量,而非處於盤整或無明確方向的狀態。 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `operator` | `>`、`<` | `'>'` | ```python api.Block.con_us('月DIF<>0') ``` ### 月DIF正轉負 - `id`: `t38` - 說明:當月DIF從正值轉為負值時,這代表著MACD指標中的快線(DIF)向下穿越慢線(DEM),形成死亡交叉。這通常被視為股價動能由強轉弱的訊號,暗示著中長期趨勢可能從上漲轉為下跌或進入盤整階段。 - 無參數 ```python api.Block.con_us('月DIF正轉負') ``` ### 月DIF負轉正 - `id`: `t39` - 說明:「月DIF負轉正」代表著股價的短期動能已從弱勢轉為強勢,這是MACD指標中一個重要的多頭訊號。這表示月線圖上的短期移動平均線已向上穿越長期移動平均線,顯示市場的買盤力道正在增強,股價可能從下跌趨勢中反轉向上,進入上升階段。 - 無參數 ```python api.Block.con_us('月DIF負轉正') ``` ### 月K<>月D - `id`: `t4` - 邏輯:`月K${operator}月D` - 說明:「月K<>月D」這個技術條件表示月線圖上的隨機指標(KD指標)中,K值與D值並未重疊。這意味著市場在月級別的動能並非處於完全停滯或極度盤整的狀態,而是存在著明確的趨勢方向或動能變化。換句話說,月線KD指標正在積極地反映市場的長期買賣力道,而非處於無方向的膠著狀態。 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `operator` | `>`、`<` | `'>'` | ```python api.Block.con_us('月K<>月D') ``` ### 月DIF近D月持續增加(減少) - `id`: `t40` - 邏輯:`月DIF近${period}月持續${operator}` - 說明:「月DIF近D月持續增加」表示在較長的時間週期內,股價的短期動能持續超越長期趨勢,暗示市場買盤力道穩健增強,有利於股價維持上升格局。 反之,若「月DIF近D月持續減少」,則意味著短期賣壓不斷加重,股價可能面臨持續下行的風險。 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `period` | `1`、`2`、`3`、`4`、`5`、`6` | `3` | | `operator` | `>`(增加)、`<`(減少) | `'>'` | ```python api.Block.con_us('月DIF近D月持續增加(減少)') ``` ### 月DIF黃金交叉上穿過月MACD - `id`: `t41` - 說明:當月DIF線從下方穿越月MACD線形成黃金交叉時,這是一個強烈的多頭訊號,代表股價的短期動能已轉強並超越長期動能。這通常預示著股價可能進入一個新的、更為穩固的長期上升趨勢,顯示市場買盤力道正在增強。 - 無參數 ```python api.Block.con_us('月DIF黃金交叉上穿過月MACD') ``` ### 月DIF死亡交叉下穿過月MACD - `id`: `t42` - 說明:「月DIF死亡交叉下穿過月MACD」表示在月線圖上,DIF線(快線)向下穿越MACD線(慢線)。這是一個強烈的長期看跌訊號,通常預示著股價的上升動能已經耗盡,並可能進入一段較長時間的下跌趨勢或盤整期,投資者應警惕市場趨勢可能反轉向下。 - 無參數 ```python api.Block.con_us('月DIF死亡交叉下穿過月MACD') ``` ### 日RSI(5)<>RSI(10) - `id`: `t43` - 邏輯:`日RSI(5)${operator}RSI(10)` - 說明:「日RSI(5) > RSI(10)」這個技術條件,代表著短期(5日)的股價動能已超越了中期(10日)的動能。RSI(相對強弱指標)是一種衡量價格變動速度與幅度的動量震盪指標,數值介於0到100之間,通常用於判斷市場的超買或超賣狀態。 當短期RSI(例如5日)向上突破長期RSI(例如10日)時,這通常被視為一個股價動能轉強的「黃金交叉」訊號,暗示著近期買盤力道增強,股價可能正處於或即將進入一個上升趨勢。這表示在較短的時間週期內,股價上漲的強度大於下跌的強度,且這種短期強勢已超越了中期的表現,是潛在的買入訊號。 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `operator` | `>`、`<` | `'>'` | ```python api.Block.con_us('日RSI(5)<>RSI(10)') ``` ### 日周月RSI(5)值<>N - `id`: `t44` - 邏輯:`${A}RSI(5)值${O}${N}` - 說明:「日周月RSI(5)值<>N」這個條件,代表您正在同時觀察一檔股票在日線、週線和月線圖上,其5日相對強弱指標(RSI)的數值是否符合您設定的特定條件N。5日RSI是一個短週期動量指標,能靈敏反映股價的短期漲跌力道;透過在不同時間週期上檢視其與N值的關係,您可以綜合判斷該股票在短期、中期及長期趨勢中的動能狀態,例如判斷是否超買超賣,或動能轉強轉弱,為您的交易決策提供多維度的參考。 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `table` | `日_K`(日)、`週_K`(周)、`月_K`(月) | `'日_K'` | | `operator` | `>`、`<` | `'<'` | | `percent` | `20`、`50`、`80` | `20` | ```python api.Block.con_us('日周月RSI(5)值<>N') ``` ### RSI(5)死亡交叉下穿過RSI(10) - `id`: `t45` - 說明:當RSI(5)死亡交叉下穿過RSI(10)時,這代表短期市場動能已明顯轉弱,並跌破了中期的動能支撐。這通常被視為一個看跌訊號,暗示股價上漲的力道正在減退,未來可能面臨回檔或下跌的壓力。 - 無參數 ```python api.Block.con_us('RSI(5)死亡交叉下穿過RSI(10)') ``` ### RSI(5)黃金交叉上穿過RSI(10) - `id`: `t46` - 說明:RSI(5)黃金交叉上穿RSI(10)代表短期市場買盤力道增強,並超越了中長期動能。這通常被視為一個看漲訊號,暗示股價可能即將進入上升趨勢或延續其漲勢,反映了市場情緒的積極轉變。 - 無參數 ```python api.Block.con_us('RSI(5)黃金交叉上穿過RSI(10)') ``` ### 周RSI(5)死亡交叉下穿過周RSI(10) - `id`: `t47` - 說明:當週RSI(5)死亡交叉下穿過週RSI(10)時,這通常被視為一個中長期趨勢轉弱的訊號。它意味著短期內的上漲動能正在快速減弱,並已跌破較長期的平均動能,暗示股價可能進入一段修正或下跌的趨勢。這代表市場的買盤力道正在消退,賣壓可能逐漸增強。 - 無參數 ```python api.Block.con_us('周RSI(5)死亡交叉下穿過周RSI(10)') ``` ### 周RSI(5)黃金交叉上穿過周RSI(10) - `id`: `t48` - 說明:「週RSI(5)黃金交叉上穿週RSI(10)」這個技術條件,代表著短期動能(5週RSI)已經超越了長期動能(10週RSI),顯示市場買盤力道正在增強。這通常被視為一個中長期看漲的訊號,暗示股價的上升動能正在累積,可能預示著一波上漲趨勢的開始或延續。 - 無參數 ```python api.Block.con_us('周RSI(5)黃金交叉上穿過周RSI(10)') ``` ### 周RSI(5)<>周RSI(10) - `id`: `t49` - 邏輯:`周RSI(5)${operator}周RSI(10)` - 說明:這代表短期(5週)的相對強弱指標RSI,已經超越了中期(10週)的RSI。這通常被視為一個看漲訊號,暗示股價的短期上漲動能正在增強,並可能預示著股價趨勢由弱轉強或持續上漲。在技術分析中,這被稱為RSI的「黃金交叉」,是判斷買入時機的常見指標之一。 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `operator` | `>`、`<` | `'>'` | ```python api.Block.con_us('周RSI(5)<>周RSI(10)') ``` ### 日KD 死亡交叉 - `id`: `t5` - 說明:日KD死亡交叉代表短期趨勢線(快線K值)向下穿越長期趨勢線(慢線D值),這通常被視為股價動能由強轉弱的訊號。這暗示著股價可能面臨下跌壓力,投資人應留意潛在的賣出時機或風險。 - 無參數 ```python api.Block.con_us('日KD 死亡交叉') ``` ### 月RSI(5)死亡交叉下穿過月RSI(10) - `id`: `t50` - 說明:這個技術條件表示在月線圖上,短期動能指標RSI(5)已經向下穿越長期動能指標RSI(10),形成一個「死亡交叉」訊號。這通常被解讀為股價的短期上漲動能正在減弱,並可能預示著中長期趨勢將由強轉弱,投資人應留意潛在的賣壓或趨勢反轉風險。 - 無參數 ```python api.Block.con_us('月RSI(5)死亡交叉下穿過月RSI(10)') ``` ### 月RSI(5)黃金交叉上穿過月RSI(10) - `id`: `t51` - 說明:當月RSI(5)黃金交叉上穿月RSI(10)時,這代表短期市場動能已顯著增強,並超越了中長期動能。這通常被視為一個強烈的看漲訊號,暗示股價在月線圖上可能正從底部反轉,或現有的上升趨勢將進一步加速。 - 無參數 ```python api.Block.con_us('月RSI(5)黃金交叉上穿過月RSI(10)') ``` ### 月RSI(5)<>月RSI(10) - `id`: `t52` - 邏輯:`月RSI(5)${operator}月RSI(10)` - 說明:「月RSI(5) <> 月RSI(10)」這個條件,從技術分析的角度來看,表示在月線級別上,衡量短期(5個月)與中期(10個月)股價動能的相對強弱指標數值並不一致。這暗示著市場的短期動能與中期動能之間存在著動態的變化,而非處於完全同步的狀態。這種差異是許多動能策略(例如黃金交叉或死亡交叉)形成的前提,因為它反映了市場力量的消長與潛在趨勢轉變的可能。 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `operator` | `>`、`<` | `'>'` | ```python api.Block.con_us('月RSI(5)<>月RSI(10)') ``` ### 今日K棒(今日收盤價)突破布林上中下軌 - `id`: `t53` - 邏輯:`今日收盤價突破布林${A}軌` - 說明:「今日K棒突破布林上中下軌」意味著股價出現了顯著的波動,並脫離了布林通道的常態區間。當K棒向上突破上軌時,通常預示著強勁的買盤動能,股價可能進入加速上漲階段;而若K棒向下突破下軌,則暗示賣壓沉重,股價可能加速下跌。這兩種情況都代表市場波動性增強,值得投資人密切關注。 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `dataType` | `top`(上)、`middle`(中)、`bottom`(下) | `'top'` | ```python api.Block.con_us('今日K棒(今日收盤價)突破布林上中下軌') ``` ### 今日K棒(今日收盤價)跌破布林上中下軌 - `id`: `t54` - 邏輯:`今日收盤價跌破布林${A}軌` - 說明:今日K棒跌破布林通道的上、中、下軌,這是一個極為罕見且劇烈的訊號,代表股價在一天之內經歷了從高點到低點的巨大波動,並穿透了整個布林通道的範圍。這通常意味著市場出現了異常強勁的賣壓,預示著趨勢可能發生劇烈反轉或加速下行,同時也可能使股價進入超賣區,值得投資人密切關注。 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `dataType` | `top`(上)、`middle`(中)、`bottom`(下) | `'top'` | ```python api.Block.con_us('今日K棒(今日收盤價)跌破布林上中下軌') ``` ### 今日K棒<>上中下軌<>P% - `id`: `t55` - 邏輯:`今日K棒${operator}${dataType}軌${percent}%` - 說明:這個技術條件是觀察今日K棒相對於布林通道(上中下軌)的相對位置,並以P%來量化其偏離程度。它主要用於判斷股價在當前波動區間內的相對強弱,例如當K棒靠近或突破上軌,且偏離程度達到P%時,可能暗示股價短期過熱;反之,若靠近或跌破下軌,則可能代表股價短期超跌,有機會出現反彈。 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `operator` | `>`、`<` | `'>'` | | `dataType` | `top`(上)、`middle`(中)、`bottom`(下) | `'top'` | | `percent` | `1`、`2`、`3`、`4`、`5` | `1` | ```python api.Block.con_us('今日K棒<>上中下軌<>P%') ``` ### 今日布林通道帶寬<>P% - `id`: `t56` - 邏輯:`今日布林通道帶寬${operator}${percent}%` - 說明:「布林通道帶寬」衡量的是布林通道上下軌之間的距離,它反映了股價波動的劇烈程度。當帶寬數值較高時,表示市場波動劇烈,股價可能處於強勢趨勢中或經歷大幅震盪;而當帶寬數值較低時,則代表股價波動趨於平緩,市場可能正在盤整,這通常預示著未來可能會有較大的方向性突破。 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `operator` | `>`、`<` | `'>'` | | `percent` | `10`、`20`、`30`、`40` | `20` | ```python api.Block.con_us('今日布林通道帶寬<>P%') ``` ### 今日布林軌道發散股 - `id`: `t57` - 邏輯:`今日布林軌道發散股,連續${period}日` - 說明:「布林軌道發散」指的是布林通道(Bollinger Bands)的上下軌道向外擴張,這代表市場的波動性顯著增加。 這種情況通常預示著股價可能正在形成或延續一個強勁的趨勢,無論是上漲或下跌,都暗示著市場動能的增強。 對於交易者而言,這是一個捕捉趨勢啟動或延續的潛在機會。 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `period` | `2`、`3`、`4`、`5` | `3` | ```python api.Block.con_us('今日布林軌道發散股') ``` ### 今日布林軌道壓縮股 - `id`: `t58` - 邏輯:`今日布林軌道壓縮股,連續${period}日` - 說明:「布林軌道壓縮股」指的是股價經過一段時間的盤整,導致布林通道的上下軌道逐漸收窄,這代表市場波動性降低,多空雙方力量趨於平衡,猶如彈簧被壓縮。 這種現象通常預示著股價即將脫離盤整區,醞釀一波較大的方向性變動,可能是向上突破或向下破底。 雖然壓縮本身不指示方向,但它提醒投資人需密切關注,等待股價帶量突破上下軌道,以確認未來的趨勢方向。 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `period` | `2`、`3`、`4`、`5` | `3` | ```python api.Block.con_us('今日布林軌道壓縮股') ``` ### 今周(今周收盤價)K棒突破布林上中下軌 - `id`: `t59` - 邏輯:`今周收盤價K棒突破布林${A}軌` - 說明:「今周K棒突破布林上中下軌」這個技術條件,意味著股價在本週出現了極為強勁的單邊走勢,其波動幅度已大到足以穿越布林通道所定義的常態波動區間。這通常代表市場情緒正處於極度亢奮或恐慌的狀態,預示著股價可能即將進入一個新的趨勢階段,投資人應密切觀察後續動能的延續性與方向。 布林通道(Bollinger Bands)是由三條軌道線組成的帶狀通道,中軌為股價的移動平均線,而上軌和下軌則分別是中軌加上或減去一定倍數的標準差,用來衡量股價的波動範圍和趨勢強弱。當股價K棒突破布林通道的上下軌時,通常被視為市場波動性增加,可能預示著新趨勢的開始或原有趨勢的加速。 這種「突破」現象,特別是週K棒的突破,暗示著市場力量(買方或賣方)的極度強勢,使得股價脫離了常態的波動區間。例如,若K棒向上突破上軌,可能代表強勁的買盤推動股價進入超買區域,預示著強勢上漲趨勢的延續;反之,若向下突破下軌,則可能代表強勁的賣壓導致股價進入超賣區域,預示著下跌趨勢的加速。投資者此時應結合其他技術指標(如成交量、MACD等)來確認突破的有效性,並判斷趨勢是否能持續,以避免假突破的風險. | 參數 | 合法值 | 預設值 | |------|--------|--------| | `dataType` | `top`(上)、`middle`(中)、`bottom`(下) | `'top'` | ```python api.Block.con_us('今周(今周收盤價)K棒突破布林上中下軌') ``` ### 日KD 黃金交叉 - `id`: `t6` - 說明:「日KD黃金交叉」是指KD指標中的K值(快線)從下方向上突破D值(慢線)的現象。這通常被視為一個多方訊號,暗示股價可能從低點開始反轉向上,是潛在的買進時機。特別是當黃金交叉發生在KD值20以下的超賣區時,其參考價值更高,代表市場買盤動能正在回溫。 - 無參數 ```python api.Block.con_us('日KD 黃金交叉') ``` ### 今周K棒(今周收盤價)跌破布林上中下軌 - `id`: `t60` - 邏輯:`今周收盤價跌破布林${A}軌` - 說明:「今周K棒跌破布林上中下軌」這個技術條件,通常意味著股價在本週出現了極為強勁的下跌動能。這不僅代表股價已跌破布林帶的中軌,顯示趨勢可能轉弱,更進一步下穿了下軌,暗示市場已進入極度超賣區間,賣壓沉重。這種走勢預示著一個強勢的空頭趨勢正在形成或加速,投資人應密切關注後續的止跌訊號。 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `dataType` | `top`(上)、`middle`(中)、`bottom`(下) | `'top'` | ```python api.Block.con_us('今周K棒(今周收盤價)跌破布林上中下軌') ``` ### 今周K棒<>上中下軌<>P% - `id`: `t61` - 邏輯:`今周K棒${operator}${dataType}軌${percent}%` - 說明:「今周K棒<>上中下軌<>P%」這個條件,主要在觀察本週股價的K線與布林通道(Bollinger Bands)上下軌的相對位置及偏離程度。當K線觸及或突破布林通道的上下軌,並伴隨P%的偏離時,這通常被視為股價波動性擴大或趨勢加速的訊號,可能預示著市場進入超買或超賣狀態,值得留意潛在的趨勢轉折或延續。 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `operator` | `>`、`<` | `'>'` | | `dataType` | `top`(上)、`middle`(中)、`bottom`(下) | `'top'` | | `percent` | `1`、`2`、`3`、`4`、`5` | `1` | ```python api.Block.con_us('今周K棒<>上中下軌<>P%') ``` ### 今周布林通道帶寬<>P% - `id`: `t62` - 邏輯:`今周布林通道帶寬${operator}${percent}%` - 說明:今周4倍標準差<>P% 布林通道帶寬(Bollinger Band Width)是用來衡量股價波動性的一個指標。當今週布林通道帶寬大於P%時,表示市場波動劇烈,股價可能處於強勁的趨勢行情中,無論是上漲或下跌,都值得密切關注其動能延續性。反之,若帶寬小於P%,則代表市場波動性低,股價可能正處於盤整或醞釀突破的階段。 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `operator` | `>`、`<` | `'>'` | | `percent` | `10`、`20`、`30`、`40` | `20` | ```python api.Block.con_us('今周布林通道帶寬<>P%') ``` ### 今周布林軌道發散股 - `id`: `t63` - 邏輯:`今周布林軌道發散股,連續${period}周` - 說明:「今周布林軌道發散股」指的是該股票的布林通道(Bollinger Bands)在本週出現擴張的現象。布林通道由三條線組成:中軌(通常是20日移動平均線)、上軌和下軌,其中上軌和下軌是根據股價的標準差計算而來,反映了市場的波動性。 當布林通道發散時,表示上軌和下軌之間的距離正在擴大,這通常意味著市場波動性顯著增加,股價可能正在形成一個新的趨勢,無論是上漲或下跌,都預示著股價將有較大的變動空間。 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `period` | `2`、`3`、`4`、`5` | `3` | ```python api.Block.con_us('今周布林軌道發散股') ``` ### 今周布林軌道壓縮股 - `id`: `t64` - 邏輯:`今周布林軌道壓縮股,連續${D}周` - 說明:「今周布林軌道壓縮股」指的是那些股價波動幅度在近期(本週)顯著收窄,導致布林通道(Bollinger Bands)上下軌道線距離大幅縮小的股票。這種「壓縮」現象通常預示著市場波動性已降至低點,股價正在醞釀一波新的趨勢行情,可能是向上突破或向下破底。 投資人會密切關注這類股票,因為它暗示著在經歷一段盤整後,股價即將迎來一次較大的方向性變動。 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `period` | `2`、`3`、`4`、`5` | `3` | ```python api.Block.con_us('今周布林軌道壓縮股') ``` ### DMI多方(空方)股 - `id`: `t65` - 邏輯:`ADX${operator}${percent}` - 說明:「DMI多方股」指的是當DMI指標中的「+DI線」(上升動向指數)位於「-DI線」(下降動向指數)上方時,顯示買方力量強於賣方,股價處於上升趨勢。 相反地,「DMI空方股」則表示「-DI線」在「+DI線」上方,代表賣方力量佔優,股價傾向下跌。 結合ADX線(平均趨向指數)判斷趨勢強度,能更精準地確認該股是處於強勁的多頭或空頭走勢。 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `operator` | `>`(DMI多方)、`<`(DMI空方) | `'>'` | | `percent` | `5`、`10`、`15`、`20`、`25` | `15` | ```python api.Block.con_us('DMI多方(空方)股') ``` ### TR(1)>ATR(20)P% - `id`: `t66` - 邏輯:`TR(1)${operator}ATR(20)${percent}%` - 說明:這個技術條件表示當前交易日的真實波動幅度 (True Range) 顯著大於過去 20 個交易日的平均真實波動幅度 (Average True Range) 的 P%。這代表市場在當前交易日出現了異常劇烈的價格波動,可能預示著市場情緒的劇烈變化,或是重大事件導致的股價大幅度移動,值得投資人密切關注。 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `operator` | `>`、`<` | `'>'` | | `percent` | `0`、`50`、`100`、`150`、`200` | `100` | ```python api.Block.con_us('TR(1)>ATR(20)P%') ``` ### 日(周月)DMI 黃金(死亡)交叉 - `id`: `t67` - 邏輯:`${A}DMI ${B}交叉` - 說明:本策略利用DMI指標中的+DI(多方動向)、-DI(空方動向)與ADX(平均動向指數)來捕捉趨勢。黃金交叉:當+DI由下往上突破-DI,代表多方力道正式超越空方,為波段起漲訊號。死亡交叉:當+DI由上往下跌破-DI,代表空方力道壓過多方,為波段起跌訊號。搭配日/周/月不同時間級別,可分別過濾出短線強勢股、中線波段主升段、以及長線宏觀大趨勢。 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `period_type` | `日`、`周`、`月` | `'日'` | | `operator` | `>`(黃金)、`<`(死亡) | `'>'` | ```python api.Block.con_us('日(周月)DMI 黃金(死亡)交叉') ``` ### D日MTM<>0 - `id`: `t68` - 邏輯:`${D}日MTM${O}0` - 說明:本策略利用D日動量指標與零軸的交叉來判斷趨勢轉折。MTM的公式極度簡單:今日收盤價-D天前的收盤價。MTM>0(向上突破零軸):代表今日價格正式超越D天前的價格,股價『加速度』轉正,為動能轉強的偏多訊號。MTM<0(向下跌破零軸):代表今日價格跌破D天前的價格,股價『加速度』轉負,為動能轉弱的偏空訊號。零軸(0)就是多空動能的絕對分水嶺。 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `period` | `5`、`10`、`20`、`60`、`240` | `10` | | `operator` | `<`、`>` | `'>'` | ```python api.Block.con_us('D日MTM<>0') ``` ### D日MTM突(跌)破0軸 - `id`: `t69` - 邏輯:`D日MTM${A}破0軸` - 說明:本策略精準篩選出D日動量指標在『最近一日』剛好完成零軸穿越的標的。突破0軸(黃金交叉):股價擺脫過去D日的頹勢,今日收盤價正式超越D日前的價格。代表多方動能瞬間點火,為波段右側的『起漲轉折訊號』。跌破0軸(死亡交叉):今日收盤價正式跌破D日前的價格。代表空方動能瞬間摜破防線,為波段右側的『起跌逃命訊號』。 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `operator` | `突`、`跌` | `'突'` | | `period` | `5`、`10`、`20`、`60`、`120` | `10` | ```python api.Block.con_us('D日MTM突(跌)破0軸') ``` ### 周KD 死亡交叉 - `id`: `t7` - 說明:當週KD指標出現死亡交叉時,這通常意味著股價的短期動能正在減弱,並可能預示著中期趨勢將由上漲轉為下跌。由於是週線級別的訊號,其可靠性相對較高,投資人應留意股價可能進入一段修正或盤整期。 - 無參數 ```python api.Block.con_us('周KD 死亡交叉') ``` ### 連續D日10日MTM遞(減) - `id`: `t70` - 邏輯:`連續${D}日10日MTM${A}` - 說明:本策略追蹤10日動量指標在過去D個交易日內的『數值變化斜率』。連續遞增:代表股價上漲的『加速度』正在持續放大,多方推升力道一天比一天猛烈,為強勢主升段的特徵。若發生在MTM<0,則代表跌勢正在急速煞車。連續遞減:代表股價推升的力道開始衰退(油門鬆開),或下跌的加速度正在加劇。若股價創新高但MTM連續遞減,即構成經典的『高檔動能背離』,為強烈反轉示警訊號。 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `period` | `2`、`3`、`4`、`5` | `3` | | `operator` | `>`(增)、`<`(減) | `'>'` | ```python api.Block.con_us('連續D日10日MTM遞(減)') ``` ### 今日ADX<>N - `id`: `t71` - 邏輯:`今日ADX${O}${N}` - 說明:本策略利用ADX指標,來判斷市場是否具備明確的趨勢。ADX本身不區分多空方向,它只測量『趨勢的強度』。ADX向上突破N:代表市場擺脫無方向的盤整,趨勢動能正式點火。ADX向下跌破N:代表市場動能衰退,進入『死水盤整區』,此時所有的趨勢跟隨策略都容易產生頻繁虧損的假訊號。 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `operator` | `<`、`>` | `'>'` | | `threshold` | `25`、`50`、`75` | `25` | ```python api.Block.con_us('今日ADX<>N') ``` ### D日OBV<>T日OBV - `id`: `t72` - 邏輯:`${D}日OBV${O}${T}日OBV` - 說明:利用OBV指標的短天期移動平均線與長天期移動平均線進行黃金或死亡交叉判定 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `d_period` | `5`、`10`、`20`、`60`、`120` | `5` | | `operator` | `<`、`>` | `'>'` | | `t_period` | `10`、`20`、`60`、`120`、`240` | `20` | ```python api.Block.con_us('D日OBV<>T日OBV') ``` ### OBV呈多(空)頭排列 - `id`: `t73` - 邏輯:`OBV呈${A}頭排列` - 說明:將經典的『多頭排列』概念,完美移植到 OBV(能量潮指標)之上。其嚴格定義為:提取OBV的三條不同天期移動平均線(如 5日、10日、20日),且今日數值必須呈現『短天期 > 中天期 > 長天期』(例如 5日 OBV MA > 10日 OBV MA > 20日 OBV MA),同時這三條均線的斜率皆必須為正(向上彎折)。此型態代表市場資金在短期、中期、長期的維度上,全面達成『買進大於賣出』的強烈共識,是推升股價走長波段大多頭的最強燃料庫。 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `trend` | `多`、`空` | `'多'` | ```python api.Block.con_us('OBV呈多(空)頭排列') ``` ### 布林通道距突(跌)破上中下軌N - `id`: `t75` - 邏輯:`收盤價標準差${O}${N}` - 說明:標準差是衡量價格離散程度的統計工具,無關多空方向。標準差>N(向上突破):代表股價擺脫長期的死水盤整,波動率瞬間急遽放大。若伴隨價格向上突破頸線,為極強勢的『波段起漲/軋空發動訊號』。標準差` | `'>'` | | `threshold` | `3`、`5`、`7`、`10` | `5` | ```python api.Block.con_us('收盤價標準差<>N') ``` ### 近D日標準差平均<>N - `id`: `t76` - 邏輯:`近D日標準差平均${O}${N}` - 說明:旨在識別標的的常態波動慣性,透過拉長時間軸來排除單日極端波動,確保策略執行的環境具備穩定的波動基調。 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `operator` | `<`、`>` | `'>'` | | `threshold` | `3`、`5`、`7`、`10` | `5` | | `period` | `5`、`10`、`20`、`60`、`120` | `5` | ```python api.Block.con_us('近D日標準差平均<>N') ``` ### 夏普指數<>N - `id`: `t77` - 邏輯:`夏普指數${O}${N}` - 說明:夏普指數指標是金融界最常用來衡量投資組合性價比的指標。公式是(預期年化報酬率-無風險利率)/年化標準差 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `operator` | `<`、`>` | `'>'` | | `threshold` | `0`、`1`、`2` | `1` | ```python api.Block.con_us('夏普指數<>N') ``` ### 最近一日(周月)KD的D值<>N - `id`: `t78` - 邏輯:`最近一${A}KD的D值${O}${N}` - 說明:D值N(通常N=80,超買區):市場處於極度狂熱狀態。在盤整市中代表短線即將見高點;但在強勢多頭中,這稱為『高檔鈍化』,代表軋空行情正在狂飆。D值穿越N(通常N=50,多空分水嶺):代表中長線資金動能的板塊位移,50以上為多方控盤,50以下為空方控盤。 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `table` | `日_K`(日)、`週_K`(周)、`月_K`(月) | `'日_K'` | | `operator` | `<`、`>` | `'<'` | | `percent` | `20`、`25`、`50`、`75`、`80` | `20` | ```python api.Block.con_us('最近一日(周月)KD的D值<>N') ``` ### 近N個月內,曾發生月KD黃金(死亡)交叉 - `id`: `t79` - 邏輯:`近${N}個月內,曾發生月KD${A}交叉` - 說明:近N月內黃金交叉:代表該標的結束了長達數季甚至數年的空頭跌勢,長線買盤正式奪回主導權。這類股票底氣極強,後續極易走出『長線保護短線』的大多頭波段。近N月內死亡交叉:代表長線景氣循環見頂,或基本面出現結構性衰退。大資金正在堅決撤退,任何短線的反彈都是逃命波。 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `period` | `1`、`2`、`3`、`4`、`5`、`6`、`9`、`12` | `5` | | `operator` | `crossup`(黃金)、`crossdown`(死亡) | `'crossup'` | ```python api.Block.con_us('近N個月內,曾發生月KD黃金(死亡)交叉') ``` ### 周KD 黃金交叉 - `id`: `t8` - 說明:「週KD黃金交叉」是指在週線圖上,KD指標中的K線(快線)從下方向上突破D線(慢線)的現象。這通常被視為一個中長期趨勢可能由空轉多的重要買進訊號,暗示著市場的賣壓減弱,買盤力量正在增強,股價動能有機會從低點開始反轉向上,進入新的上漲週期。 - 無參數 ```python api.Block.con_us('周KD 黃金交叉') ``` ### 月KD 死亡交叉 - `id`: `t9` - 說明:「月KD死亡交叉」是指在月線圖上,KD指標中的K值(快線)由上方向下跌破D值(慢線)的現象。這通常被視為一個強烈的長期看跌訊號,暗示股價的上升動能正在減弱,可能預示著股價將進入一段較長時間的下跌趨勢或修正波段。由於是月線級別的交叉,其訊號的可靠性較高,但出現頻率相對較低,對投資人而言是判斷中長期趨勢轉變的重要參考依據。 - 無參數 ```python api.Block.con_us('月KD 死亡交叉') ``` ### 短均日均量<>長均日均量 - `id`: `v1` - 邏輯:`${MA1}日均量${O}${MA2}日均量` - 說明:短均日均量與長均日均量的比較,反映了市場近期交易熱度與長期平均熱度的差異。當短均量大於長均量時,通常意味著近期市場交投活絡,可能是資金進駐或籌碼換手積極的訊號,預示著股價可能出現較大的波動。反之,若短均量小於長均量,則顯示市場觀望氣氛濃厚,交易清淡,股價可能處於盤整或缺乏動能的狀態。 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `period1` | `5`、`10`、`20` | `5` | | `operator` | `<`、`>` | `'>'` | | `period2` | `10`、`20`、`60`、`120`、`240` | `20` | ```python api.Block.con_us('短均日均量<>長均日均量') ``` ### 近D日均量>V張 - `id`: `v10` - 邏輯:`近${D}日均量>${V}張` - 說明:這個條件表示在過去D個交易日中,該股票的平均成交量超過了V張。高於特定門檻的平均成交量,通常代表市場對這檔股票的關注度較高,流動性也相對較好。這有助於確保投資者在進出時,不會因為成交量不足而面臨買賣困難或價格大幅波動的風險。 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `period` | `1`、`5`、`10`、`20`、`60` | `20` | | `threshold` | `500`、`1000`、`2000`、`3000`、`5000`、`10000`、`20000` | `1000` | ```python api.Block.con_us('近D日均量>V張') ``` ### 今日近D日均量<>前一日近D日均量 - `id`: `v11` - 邏輯:`今日近${D}日均量${O}前一日近${D}日均量` - 說明:這個條件是在觀察市場的活躍程度與資金動能的變化。當今日的近D日均量與前一日的近D日均量出現差異時,代表市場在過去D天內的平均交易熱度發生了轉變。 若均量顯著增加,通常暗示著市場參與者對該股票的關注度提升,無論是買盤或賣盤力道都可能增強;反之,若均量減少,則可能表示市場交投趨於清淡,動能有所減弱.。 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `operator` | `>`、`<` | `'>'` | | `period` | `1`、`5`、`10`、`20`、`60` | `5` | ```python api.Block.con_us('今日近D日均量<>前一日近D日均量') ``` ### 今日成交量>前D日內最大量N倍 - `id`: `v12` - 邏輯:`今日成交量>前${D}日內最大量${P}倍` - 說明:當日成交量顯著超越過去D天內的最高量N倍,這代表市場對該股票的關注度急劇升高,資金進出非常活躍。這種爆量通常伴隨著股價的關鍵性變動,可能預示著趨勢的啟動或反轉,是判斷市場力量轉變的重要訊號。 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `period` | `1`、`5`、`10`、`20`、`60` | `5` | | `multiplier` | `1`、`1.5`、`2` | `1` | ```python api.Block.con_us('今日成交量>前D日內最大量N倍') ``` ### 近D日成交量周轉率<>P% - `id`: `v2` - 邏輯:`近${D}日成交量周轉率${O}${P}%` - 說明:「近D日成交量周轉率<>P%」這個條件,是用來衡量股票在過去D個交易日內的換手頻率是否偏離了某個基準值P%。當周轉率顯著高於P%時,通常代表市場對該股的關注度與交易熱度急遽升高,資金進出頻繁,這可能預示著股價即將出現較大的波動;反之,若周轉率顯著低於P%,則可能意味著市場交投清淡,缺乏動能,股價多半處於盤整或等待方向的階段。 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `period` | `1`、`5`、`10`、`20`、`60` | `10` | | `operator` | `>`、`<` | `'>'` | | `threshold` | `20`、`30`、`40`、`50` | `50` | ```python api.Block.con_us('近D日成交量周轉率<>P%') ``` ### 日成交金額<>M億 - `id`: `v3` - 邏輯:`日成交金額${O}${M}億` - 說明:「日成交金額<>M億」這個條件,指的是我們在觀察股票每日的交易總金額是否達到或偏離某個特定的 M 億元門檻。這通常是用來評估市場對該股票的關注度與流動性,例如:成交金額顯著放大(遠超 M 億)可能代表市場熱度高漲或有主力進出,而成交金額萎縮(遠低於 M 億)則可能暗示籌碼沉澱或市場觀望氣氛濃厚。 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `operator` | `>`、`<` | `'>'` | | `threshold` | `1`、`20`、`50`、`100`、`500` | `10` | ```python api.Block.con_us('日成交金額<>M億') ``` ### 日成交量<>V張 - `id`: `v36` - 邏輯:`日成交量${O}${V}張` - 說明:大於V張:確保該標的具備足夠的『市場流動性』。代表市場參與者眾多,買賣報價連續,是主力法人資金進出的主戰場,能有效避免『買得到卻賣不掉』的流動性陷阱。小於V張:通常用於反向篩選。若用於大盤暴跌後的底部,可尋找『量縮窒息、籌碼沉澱』的潛伏期;若該股長期小於V張,則為缺乏人氣的『冷門股』,會有高滑價風險。 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `operator` | `>`、`<` | `'>'` | | `threshold` | `500`、`1000`、`2000`、`3000`、`5000`、`10000`、`20000` | `1000` | ```python api.Block.con_us('日成交量<>V張') ``` ### 近D日平均成交量<>V張 - `id`: `v37` - 邏輯:`近${D}日平均成交量${O}${V}張` - 說明:均量>V張:證明該標的具備『常態性的高流動性』,絕非大戶單日左手換右手做出來的假量。這是法人資金長期駐守、進出無礙的優質戰場。均量`、`<` | `'>'` | | `threshold` | `20000`、`50000`、`100000`、`200000` | `20000` | ```python api.Block.con_us('近D日平均成交量<>V張') ``` ### 近D日累積成交量<>V張 - `id`: `v38` - 邏輯:`近${D}日累積成交量${O}${V}張` - 說明:大於V張:用於『流動性安全過濾』,確保中長線大資金進出時擁有足夠的對手盤,避免嚴重的滑價風險;亦可用於尋找近D日持續放量的催化標的。小於V張:用於『籌碼窒息量篩選』,在股價回測支撐時,尋找過去D日內成交量極度萎縮、代表浮額清洗完畢的潛伏標的。 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `period` | `2`、`3`、`4`、`5`、`10`、`20` | `20` | | `operator` | `>`、`<` | `'>'` | | `threshold` | `20000`、`50000`、`100000`、`200000` | `20000` | ```python api.Block.con_us('近D日累積成交量<>V張') ``` ### 周(月)成交金額<>M億 - `id`: `v3x` - 邏輯:`周(月)成交金額${O}${M}億` - 說明:「成交金額」指的是一檔股票在過去一週內的總交易價值,它是衡量市場對該股票關注度與資金流動性的關鍵指標。當週成交金額達到M億這個特定門檻時,通常代表市場交投熱絡,有大量資金進出,這可能預示著股價即將出現較大的波動或趨勢轉變。 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `operator` | `>`、`<` | `'>'` | | `threshold` | `100`、`500`、`1000`、`2000` | `100` | ```python api.Block.con_us('周(月)成交金額<>M億') ``` ### 日成交量>V張 - `id`: `v4` - 邏輯:`日成交量 ${O} ${V} 張` - 說明:「日成交量大於V張」代表市場對該股票的關注度與參與度顯著提升,顯示其流動性充裕。這通常暗示著股價可能正醞釀或已進入較為活躍的階段,無論是趨勢的確認或反轉,都值得投資人密切觀察。 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `operator` | `>`、`<` | `'>'` | | `threshold` | `500`、`1000`、`2000`、`3000`、`5000`、`10000`、`20000` | `1000` | ```python api.Block.con_us('日成交量>V張') ``` ### 周成交量>V張 - `id`: `v4x` - 邏輯:`周成交量${O}${V}張` - 說明:「周成交量大於V張」代表該股票在過去一週的交易活動顯著放大,顯示市場對其關注度大幅提升,有大量資金正在進出。這通常預示著股價可能即將出現較大的波動,無論是趨勢的確立或反轉,都值得投資人密切留意。 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `operator` | `>`、`<` | `'>'` | | `threshold` | `20000`、`50000`、`100000`、`200000` | `20000` | ```python api.Block.con_us('周成交量>V張') ``` ### 今日(周)成交量>上一日(周)成交量P倍 - `id`: `v5` - 邏輯:`今${A}成交量>上一${A}成交量${P}倍` - 說明:這個技術條件表示該股票在當日(或當週)的交易活動顯著放大,成交量達到前一日(或前一週)的P倍。這通常意味著市場對該股的關注度急劇升高,無論是買盤積極湧入或是賣壓大量釋出,都可能預示著股價即將出現較大的波動或趨勢轉變。 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `table` | `日_K`(日)、`週_K`(周) | `'日_K'` | | `multiplier` | `1`、`1.5`、`2`、`3` | `2` | ```python api.Block.con_us('今日(周)成交量>上一日(周)成交量P倍') ``` ### 日成交量<>5ma成交量P倍 - `id`: `v5x` - 邏輯:`日成交量${O}5ma成交量${P}倍` - 說明:這個條件「日成交量是5日均量P倍」,代表著當日股票的交易活動量,相較於過去五個交易日的平均成交量,出現了P倍的顯著放大。這種現象通常暗示著市場對該股票的關注度或交易意願出現了顯著變化,無論是買盤或賣盤的力量都明顯增強。它可以是趨勢延續的確認訊號,例如在突破關鍵價位時伴隨巨量,或是潛在趨勢反轉的早期跡象,尤其當極端大量出現在股價高點或低點時。 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `operator` | `>`、`<` | `'>'` | | `multiplier` | `1`、`1.5`、`2`、`3` | `2` | ```python api.Block.con_us('日成交量<>5ma成交量P倍') ``` ### 最近一日成交量<>前一日P倍,且<>張 - `id`: `v6` - 邏輯:`最近一日成交量${O}前一日${P}倍,且>${V}張` - 說明:「最近一日成交量大於前一日P倍,且大於X張」這個條件,代表市場對該股票的關注度與交易活動顯著放大,顯示有大量資金正在進出。這種量能的急劇放大,通常預示著股價可能即將出現較大的方向性變動,是判斷市場情緒轉變或趨勢確立的重要訊號。 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `operator1` | `>`、`<` | `'>'` | | `percent` | `1`、`1.5`、`2`、`3` | `100` | | `threshold` | `500`、`1000`、`2000`、`3000`、`5000`、`10000`、`20000` | `0` | ```python api.Block.con_us('最近一日成交量<>前一日P倍,且<>張') ``` ### 日周月成交量創近D日新高(低) - `id`: `v7` - 邏輯:`${A}成交量創近${D}日新${B}` - 說明:當日成交量創下近D日新高時,這通常意味著市場對該股票的關注度顯著提升,無論是買方或賣方都展現出強烈的交易意願,這可能預示著股價即將出現較大的波動或趨勢的確認。反之,若成交量創下近D日新低,則表示市場交投清淡,投資人觀望氣氛濃厚,股價可能進入盤整階段,或是原有趨勢動能減弱的訊號。 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `table` | `日_K`(日)、`週_K`(周) | `'日_K'` | | `period` | `5`、`10`、`20`、`60`、`120`、`240` | `60` | | `metric` | `max`(高)、`min`(低) | `'max'` | ```python api.Block.con_us('日周月成交量創近D日新高(低)') ``` ### 日(周)成交量漸增(減)連續3次 - `id`: `v8` - 邏輯:`${A}成交量漸${C}連續3次` - 說明:當日(或週)成交量連續三次呈現漸增趨勢時,這通常代表市場對該股票的關注度與參與度正在持續提升,無論股價是上漲或下跌,都顯示出動能的累積。反之,若成交量連續三次漸減,則可能意味著市場熱度正在降溫,多空雙方觀望氣氛濃厚,股價走勢可能進入盤整或趨勢反轉的前兆。 | 參數 | 合法值 | 預設值 | |------|--------|--------| | `table` | `日_K`(日)、`週_K`(周) | `'日_K'` | | `operator` | `>`(增)、`<`(減) | `'>'` | ```python api.Block.con_us('日(周)成交量漸增(減)連續3次') ``` --- ==================================================================================================== # Data 模組總覽 > 所屬章節:Data 表格查詢 > 以 2026-08-20 實際執行結果為準 ## Overview `api.Data`(台股)與 `api.USData`(美股)是**表格式**查詢:一次要一張表,回傳 `pandas.DataFrame`,欄位是中文名稱。三個方法: | 方法 | 用途 | |------|------| | `get_table()` | 印出所有可用表名與其必填參數 | | `get(table, *args)` | 取一張表 | | `get_snapshots(symbols)` | 取即時報價快照(**僅美股 `api.USData`**;台股 `api.Data` 沒有) | 與 `api.MSMP` 的分工: | | `api.Data` | `api.MSMP` | |---|---|---| | 形狀 | 一般表格(一列一筆記錄) | 矩陣:日期(index)× 股票代號(columns) | | 欄位 | 中文(`收盤價`、`成交量`) | 一個欄位就是一張矩陣 | | 適合 | 查單一標的的明細、財報、分K | 全市場橫向運算、選股、回測 | | 需要 token | 是 | 否(本地快取) | 積木(`api.Block`)底層用的是 `api.MSMP`,不是 `api.Data`。 ## Manual Sample Input/Output ### Example 1:方法清單 #### input ```python [n for n in dir(api.Data) if not n.startswith('_')] # 台股 [n for n in dir(api.USData) if not n.startswith('_')] # 美股 ``` #### output ```text ['get', 'get_table'] # 台股 api.Data ['get', 'get_snapshots', 'get_table'] # 美股 api.USData(多 get_snapshots) ``` 台股 `api.Data` 與美股 `api.USData` 幾乎相同,差別是 **`get_snapshots` 只有美股有**。 --- ## 相關文件 - [Data.get_table 列出可用表格](data-get-table.md) - [Data.get 取得表格資料](data-get.md) - [USData.get_snapshots 美股即時快照](data-get-snapshots.md) - [USData 美股表格查詢](usdata.md) ==================================================================================================== # Data.get_table 列出可用表格 > 所屬章節:Data 表格查詢 > 以 2026-08-20 實際執行結果為準 ## Overview **印出**(不是回傳)所有可用表名,以及每張表的必填參數。 ```python api.Data.get_table() api.USData.get_table() ``` 沒有參數。輸出按用途分成六段:多股單期、單股多期、分K、批次取得、其他。 表名後面接的就是 `get()` 要補的參數,例如 `"symbol"` 代表必須傳股票代號。 ## Manual Sample Input/Output ### Example 1:台股表格清單(節錄) > 台股共 **80 張**表。下面是節錄,另有 14 張列在本頁最後的「Example 3」——那批是分點籌碼、大盤法人與盤中明細,先前漏收。 #### input ```python api.Data.get_table() ``` #### output ```text =========================多股單期========================= '台股產業對照表': '全額交割股': '處置股票': '分盤交易': '禁現沖標的': '今日暫停交易': '注意股票': '上市櫃/ETF清單(含當沖限制)': 'ROE/ROA-多檔股票最新時間': '股市行事曆-多檔股票最新時間': 'EPS/本益比/殖利率-多檔股票最新時間': '日K價量資料(個股、ETF)-多檔股票最新時間': '籌碼買賣資料(個股、ETF)-多檔股票最新時間': '三大法人買賣超-多檔股票最新時間': '漲跌家數(盤中)': '漲跌列表(盤中)': '漲跌家數分鐘歷史(盤中)': '粗產業多(盤中)': '粗產業空(盤中)': '即時周轉率排行': '收盤20日周轉率': '券資比-多檔股票最新時間': '前15大主力券商買賣超佔比-多檔股票最新時間': '即將下市及過去五年下市股票-多檔股票最新時間': '成交金額及股本-多檔股票指定時間': "date"(yyyyMMdd) =========================單股多期========================= '日K/技術指標/價量資料-單檔股票多個區間': "symbol" '週K/技術指標/價量/籌碼資料-單檔股票多個區間': "symbol" '月K/技術指標/價量/籌碼資料-單檔股票多個區間': "symbol" '還原日K價量資料(個股、ETF、大盤)-單檔股票多個區間': "symbol" '還原週K價量資料(個股、ETF、大盤)-單檔股票多個區間': "symbol" '還原月K價量資料(個股、ETF、大盤)-單檔股票多個區間': "symbol" '季毛利率/季營益率/ROE-單檔股票多個區間': "symbol" '公司基本資料': "symbol" '季稅後淨利/季稅後EPS-單檔股票多個區間': "symbol" '個股季財報資訊-單檔股票多個區間': "symbol" '個股股利資訊(年)-單檔股票多個區間': "symbol" '個股籌碼分佈-單檔股票多個區間': "symbol" '個股資本支出-單檔股票多個區間': "symbol" '個股營收資訊-單檔股票多個區間': "symbol" '籌碼資料(個股、ETF、大盤)-單檔股票多個區間': "symbol" 'ETF持股清單': "symbol"(etf) '個股股利資訊(季、含填息天數)-單檔股票多個區間': "symbol" '大/小股東持股變化-單檔股票多個區間': "symbol" '市值/淨利/淨值(個股、ETF、大盤)-單檔股票多個區間': "symbol" '查詢八大行庫買賣超-單檔股票多個區間': "symbol" '股市行事曆-單檔股票多個區間': "symbol" '近四季財報加總-單檔股票多個區間': "symbol" '個股資餘資券相抵-單檔股票多個區間': "symbol" '籌碼集中渙散/主力買賣超-單檔股票多個區間': "symbol" '個股券商買賣超Top10-單檔股票多個區間': "symbol" '月營收創歷史新高新低': "symbol" '股價報酬(日)Beta值-單檔股票多個區間': "symbol" ===========================分K=========================== '取得即時分K(最後交易日)': "symbol" ,minutes(1/3/5/15/30/60) '取得歷史分K(指定日期前)': "symbol" ,"date"(yyyyMMdd) ,minutes(1/3/5/15/30/60) '取得即時分K-含興櫃': "symbol" '取得歷史3分K(指定當日)': "symbol" ,"date"(yyyyMMdd) '取得歷史5分K(指定當日)': "symbol" ,"date"(yyyyMMdd) '取得歷史分K(含加權/櫃買指數)': "symbol" ,minutes(1/3/5/15/30/60) '分價量': "symbol" '取得指定日期前幾天的分價量歷史資料': "symbol" ,"date"(yyyyMMdd) ,days '取得歷史1分K(指定起訖日)': "symbol" ,"startDate"(yyyyMMdd) ,"endDate"(yyyyMMdd) '取得歷史1分K(指定日期前5天)': "symbol" ,"endDate"(yyyyMMdd) =========================批次取得========================= '批次取得個股盤中行情': List[symbol、symbol、symbol....] '批次取得個股盤中行情-含興櫃(tick含試搓)': List[symbol、symbol、symbol....] '批次取得個股盤中內外盤-含興櫃與權證': List[symbol、symbol、symbol....] '批次取得盤中預估量': List[symbol、symbol、symbol....] ``` --- ### Example 2:怎麼讀參數標記 | 標記 | 意思 | 呼叫寫法 | |------|------|----------| | (空白) | 不用參數 | `api.Data.get('台股產業對照表')` | | `"symbol"` | 要股票代號 | `api.Data.get('公司基本資料', '2330')` | | `"date"(yyyyMMdd)` | 要日期字串 | `api.Data.get('成交金額及股本-多檔股票指定時間', '20260819')` | | `"symbol" ,minutes(1/3/5/15/30/60)` | 代號 + 分鐘數 | `api.Data.get('取得歷史分K(含加權/櫃買指數)', '2330', 30)` | | `List[symbol、...]` | 要代號 list | `api.Data.get('批次取得個股盤中行情', ['2330','2317'])` | 參數給錯時的錯誤訊息會直接告訴你正確用法,見 [Data.get](data-get.md)。 > `get_table()` 只印出來,**不回傳值**。想用程式列舉表名的話, > 目前沒有公開 API,只能改讀 `api.Data.get_table` 背後的對照表。 --- ### Example 3:先前漏收的 14 張(全部實測過) `get_table()` 的輸出裡有這 14 張,但本頁 Example 1 的節錄漏了。 形狀是 `2330` / 指定參數下的實測值。 #### 分點籌碼(5 張) 券商分點的買賣超。`brokerId` 的格式是 `'代號 分點名'`。 | 表名 | 參數 | 形狀 | 主要欄位 | |---|---|---|---| | `查詢近100日買賣張數加總_高至低排序` | `symbol` | (878, 2) | `分點代號`、`分點名稱` —— 這檔股票近 100 日有交易的所有分點 | | `查詢TOP15主力分點買賣超加總資料(指定起訖日)` | `symbol`, `startDate`(yyyyMMdd), `endDate` | (30, 13) | `買賣超排名`、`券商代號`、`券商名稱`、`買(張)`、`賣(張)`、`買賣超(張)`、`買賣總和(張)` | | `查詢近100日該分點資料` | `symbol`, `brokerId` | (120, 6) | `日期`、`買(張)`、`賣(張)`、`買賣超(張)`、`買入均價`、`賣出均價` | | `查詢分點最新TOP10買賣超資料` | `brokerId` | (20, 5) | `日期`、`股票代號`、`股票名稱`、`買賣超(張)`、`買賣超排名` | | `查詢分點近N日Top15買賣超資料` | `brokerId`, `N`(1/2/3/4/5/10/20/60/80/100/120/180/240) | (30, 8) | 同上再加 `券商代號`、`起日期` | `查詢近100日買賣張數加總_高至低排序` 回的是**分點清單**(878 個), 拿它的 `分點代號 分點名稱` 組成 `brokerId` 再去查後面三張。 #### 大盤法人買賣(2 張) | 表名 | 參數 | 形狀 | 主要欄位 | |---|---|---|---| | `大盤-法人買賣資料-多檔股票最新時間` | 無 | (29, 15) | `代號`、`名稱`、`日期`、`買入金額(百萬元)`、`賣出金額(百萬元)`、`買賣超金額(百萬元)`、`成交金額(百萬元)` | | `大盤-法人買賣資料-單檔股票多個區間` | `args`(用上一張的 `代號`) | — | 同上的時間序列 | 29 列是**法人分類**(外資、投信、自營各種細分),不是 29 檔股票。 單檔版的參數要填上一張的 `代號`,不是股票代號。 #### 盤中與逐筆明細(6 張) | 表名 | 參數 | 形狀 | 說明 | |---|---|---|---| | `取得今日即時成交明細(含五檔報價)` | `symbol` | (1817, 28) | 當日逐筆,含 `成交價`、`成交量`、`總成交量`、`最佳買價`/`最佳賣價`、五檔 | | `取得今日即時成交明細(貼標大戶/散戶)` | `symbol` | (1817, 29) | 同上多一欄 `類型`(大戶/散戶標記) | | `取得最新一筆成交明細(含五檔報價)` | `symbol` | (1, 28) | 只要最新一筆時用這張,省流量 | | `取得零股成交明細` | `symbol` | (1370, 8) | `成交價`、`成交量(股)`、`總成交量(股)`——**單位是股** | | `取得個股盤中內外盤-含興櫃` | `symbol` | (1, 4) | `股票代號`、`交易所`、`内盤`、`外盤`(注意是「内」不是「內」) | | `個股上個交易日成交均張(成交量/成交筆數)` | `symbol` | (1, 2) | `成交量/成交筆數`,判斷散戶/法人參與度 | #### 產業(1 張) | 表名 | 參數 | 形狀 | |---|---|---| | `產業個股清單` | `sector` | (6, 3)(以 `'水泥'` 為例) | `sector` 要填 `台股產業對照表` 的 **`指數彙編分類`** 欄的值,共 **172 種** (`水泥`、`預拌混凝土`、`飲料相關`、`食品加工`、`塑膠原料`…)。 > **傳錯值的錯誤訊息會誤導。** 例如傳 `'半導體'`(不在 172 種裡)會拋 > `KeyError: 'symbol'`——看起來像少傳了 symbol,其實是 sector 值不合法。 > 先取合法值清單: > > ```python > t = api.Data.get('台股產業對照表') > sectors = t['指數彙編分類'].dropna().unique() # 172 種 > ``` ==================================================================================================== # Data.get 取得表格資料 > 所屬章節:Data 表格查詢 > 以 2026-08-20 實際執行結果為準 ## Overview 查詢指定資料表,回傳 `pandas.DataFrame`。 ```python api.Data.get(table, *args) ``` | 參數 | 型態 | 說明 | |------|------|------| | `table` | `str` | 表名,從 `get_table()` 取得 | | `*args` | | 該表的必填參數(股票代號、日期、分鐘數…),順序照 `get_table()` 標示 | ## Manual Sample Input/Output ### Example 1:上市櫃/ETF 清單(無參數) #### input ```python df = api.Data.get('上市櫃/ETF清單(含當沖限制)') df.head() ``` #### output ```text DataFrame shape: (2728, 8) columns: ['股票代號', '股票名稱', '日期', '市場', 'ETF', '可先買後賣當沖標的', '可先賣後買當沖標的', '當日禁止當沖標的'] 股票代號 股票名稱 日期 市場 ETF 可先買後賣當沖標的 可先賣後買當沖標的 當日禁止當沖標的 0 00400A 主動國泰動能高息 2026-08-20 1 1 Y Y 1 00401A 主動摩根台灣鑫收 2026-08-20 1 1 Y Y 2 00402A 主動安聯美國科技 2026-08-20 1 1 Y Y 3 00403A 主動統一升級50 2026-08-20 1 1 Y Y 4 00404A 主動聯博動能50 2026-08-20 1 1 Y Y ``` > `市場` 與 `ETF` 是代碼欄(`1` 代表該分類),不是中文標籤。 --- ### Example 2:還原日K(單股多期) #### input ```python df = api.Data.get('還原日K價量資料(個股、ETF、大盤)-單檔股票多個區間', '2330') df.tail(3) ``` #### output ```text DataFrame shape: (1000, 14) columns: ['日期', '股票代號', '股票名稱', '開盤價', '最高價', '最低價', '收盤價', '成交量', '漲跌', '漲跌幅(%)', '市值(百萬元)', '次日開盤參考價', '成交金額(百萬)', '現股當沖量(千股)'] 日期 股票代號 股票名稱 開盤價 最高價 最低價 收盤價 成交量 漲跌 漲跌幅(%) 市值(百萬元) 次日開盤參考價 997 2026-08-17 2330 台積電 2410 2420 2390 2400 13482.4560 5 0.2100 62237688 2400 998 2026-08-18 2330 台積電 2415 2415 2375 2380 19997.2130 -20 -0.8300 61719041 2380 999 2026-08-19 2330 台積電 2340 2355 2335 2350 23618.6120 -30 -1.2600 60941070 2350 ``` 固定回傳最近 1000 筆交易日。 --- ### Example 3:個股季財報 #### input ```python df = api.Data.get('個股季財報資訊-單檔股票多個區間', '2330') df.shape, df.columns[:12].tolist() ``` #### output ```text (46, 135) ['年季', '資產(千)', '負債(千)', '股東權益(千)', '流動資產(千)', '流動負債(千)', '合約負債–流動(千)', '合約負債–非流動(千)', '合約負債(千)', '公告累計EPS(元)', '公告EPS(元)', '公告EPS成長率(%)'] ``` 46 季(2015-Q1 起)× 135 欄。`年季` 欄格式為 `'2015-Q1'`。 金額類欄位單位在欄名裡(`(千)`、`(百萬)`),比率類是 `(%)`。 --- ### Example 4:分K #### input ```python df = api.Data.get('取得歷史分K(含加權/櫃買指數)', '2330', 30) df.tail(3) ``` #### output ```text DataFrame shape: (999, 11) columns: ['日期', 'hhmm', '開盤價', '最高價', '最低價', '收盤價', '成交量', '日成交金額(千)', '日成交量', '日平均價', 'datetime'] 日期 hhmm 開盤價 最高價 最低價 收盤價 成交量 日成交金額(千) 日成交量 日平均價 datetime 996 2026-08-20 1030 2360 2365 2355 2360 897 11743195 4972 2361.8700 2026-08-20 10:30:00 997 2026-08-20 1100 2355 2360 2350 2355 818 13669960 5790 2360.9600 2026-08-20 11:00:00 998 2026-08-20 1130 2360 2360 2355 2360 93 13889035 5883 2360.8800 2026-08-20 11:30:00 ``` 分K 有**當日盤中**資料(與 `api.MSMP` 只到前一交易日不同)。 --- ### Example 5:兩種錯誤訊息 缺必填參數——訊息會直接給正確用法: #### input ```python api.Data.get('個股季財報資訊-單檔股票多個區間') ``` #### output ```text ValueError: 參數輸入錯誤,正確用法:Data.get('個股季財報資訊-單檔股票多個區間', '2330') ``` 表名不存在: #### input ```python api.Data.get('不存在的表') ``` #### output ```text ValueError: 找不到 table: 不存在的表 ``` --- ## 80 張表按用途分組 `get_table()` 一次吐 80 個表名很難掃。這裡按用途分組,**合計剛好 80 張,一張都沒漏**。 參數欄照 `get_table()` 的原始標記。 ### 清單與狀態(無參數)(10 張) | 表名 | 參數 | |---|---| | `台股產業對照表` | (無) | | `全額交割股` | (無) | | `處置股票` | (無) | | `分盤交易` | (無) | | `禁現沖標的` | (無) | | `今日暫停交易` | (無) | | `注意股票` | (無) | | `上市櫃/ETF清單(含當沖限制)` | (無) | | `股市行事曆-多檔股票最新時間` | (無) | | `即將下市及過去五年下市股票-多檔股票最新時間` | (無) | ### 盤中大盤概況(5 張) | 表名 | 參數 | |---|---| | `漲跌家數(盤中)` | (無) | | `漲跌列表(盤中)` | (無) | | `漲跌家數分鐘歷史(盤中)` | (無) | | `粗產業多(盤中)` | (無) | | `粗產業空(盤中)` | (無) | ### 全市場排行/快照(多檔最新)(12 張) | 表名 | 參數 | |---|---| | `ROE/ROA-多檔股票最新時間` | (無) | | `EPS/本益比/殖利率-多檔股票最新時間` | (無) | | `日K價量資料(個股、ETF)-多檔股票最新時間` | (無) | | `籌碼買賣資料(個股、ETF)-多檔股票最新時間` | (無) | | `三大法人買賣超-多檔股票最新時間` | (無) | | `即時周轉率排行` | (無) | | `收盤20日周轉率` | (無) | | `券資比-多檔股票最新時間` | (無) | | `前15大主力券商買賣超佔比-多檔股票最新時間` | (無) | | `成交金額及股本-多檔股票指定時間` | "date"(yyyyMMdd) | | `月營收創歷史新高新低` | "symbol" | | `大盤-法人買賣資料-多檔股票最新時間` | (無) | ### 單檔多期:K線與技術指標(7 張) | 表名 | 參數 | |---|---| | `日K/技術指標/價量資料-單檔股票多個區間` | "symbol" | | `週K/技術指標/價量/籌碼資料-單檔股票多個區間` | "symbol" | | `月K/技術指標/價量/籌碼資料-單檔股票多個區間` | "symbol" | | `還原日K價量資料(個股、ETF、大盤)-單檔股票多個區間` | "symbol" | | `還原週K價量資料(個股、ETF、大盤)-單檔股票多個區間` | "symbol" | | `還原月K價量資料(個股、ETF、大盤)-單檔股票多個區間` | "symbol" | | `股價報酬(日)Beta值-單檔股票多個區間` | "symbol" | ### 單檔多期:財報與基本面(9 張) | 表名 | 參數 | |---|---| | `季毛利率/季營益率/ROE-單檔股票多個區間` | "symbol" | | `季稅後淨利/季稅後EPS-單檔股票多個區間` | "symbol" | | `個股季財報資訊-單檔股票多個區間` | "symbol" | | `個股股利資訊(年)-單檔股票多個區間` | "symbol" | | `個股資本支出-單檔股票多個區間` | "symbol" | | `個股營收資訊-單檔股票多個區間` | "symbol" | | `個股股利資訊(季、含填息天數)-單檔股票多個區間` | "symbol" | | `市值/淨利/淨值(個股、ETF、大盤)-單檔股票多個區間` | "symbol" | | `近四季財報加總-單檔股票多個區間` | "symbol" | ### 單檔多期:籌碼(11 張) | 表名 | 參數 | |---|---| | `個股籌碼分佈-單檔股票多個區間` | "symbol" | | `籌碼資料(個股、ETF、大盤)-單檔股票多個區間` | "symbol" | | `大/小股東持股變化-單檔股票多個區間` | "symbol" | | `查詢八大行庫買賣超-單檔股票多個區間` | "symbol" | | `股市行事曆-單檔股票多個區間` | "symbol" | | `個股資餘資券相抵-單檔股票多個區間` | "symbol" | | `籌碼集中渙散/主力買賣超-單檔股票多個區間` | "symbol" | | `個股券商買賣超Top10-單檔股票多個區間` | "symbol" | | `取得歷史1分K(指定起訖日)` | "symbol" ,"startDate"(yyyyMMdd) ,"endDate"(yyyyMMdd) | | `大盤-法人買賣資料-單檔股票多個區間` | "args"(查閲"大盤-法人買賣資料-多檔股票最新時間"中的"代號") | | `查詢TOP15主力分點買賣超加總資料(指定起訖日)` | "symbol" ,"startDate"(yyyyMMdd) ,"endDate"(yyyyMMdd) | ### 券商分點(3 張) | 表名 | 參數 | |---|---| | `查詢近100日該分點資料` | `symbol`、`brokerId` | | `查詢分點最新TOP10買賣超資料` | `brokerId` | | `查詢分點近N日Top15買賣超資料` | `brokerId`、`N`(1/2/3/4/5/10/20/60/80/100/120/180/240) | ### 分K與逐筆明細(15 張) | 表名 | 參數 | |---|---| | `取得即時分K(最後交易日)` | "symbol" ,minutes(1/3/5/15/30/60) | | `取得歷史分K(指定日期前)` | "symbol" ,"date"(yyyyMMdd) ,minutes(1/3/5/15/30/60) | | `取得即時分K-含興櫃` | "symbol" | | `取得歷史3分K(指定當日)` | "symbol" ,"date"(yyyyMMdd) | | `取得歷史5分K(指定當日)` | "symbol" ,"date"(yyyyMMdd) | | `取得歷史分K(含加權/櫃買指數)` | "symbol" ,minutes(1/3/5/15/30/60) | | `分價量` | "symbol" | | `取得指定日期前幾天的分價量歷史資料` | "symbol" ,"date"(yyyyMMdd) ,days | | `取得歷史1分K(指定日期前5天)` | "symbol" ,"endDate"(yyyyMMdd) | | `批次取得個股盤中內外盤-含興櫃與權證` | List[symbol、symbol、symbol....] | | `取得個股盤中內外盤-含興櫃` | "symbol" | | `取得今日即時成交明細(含五檔報價)` | "symbol" | | `取得今日即時成交明細(貼標大戶/散戶)` | "symbol" | | `取得零股成交明細` | "symbol" | | `取得最新一筆成交明細(含五檔報價)` | "symbol" | ### 批次盤中(3 張) | 表名 | 參數 | |---|---| | `批次取得個股盤中行情` | List[symbol、symbol、symbol....] | | `批次取得個股盤中行情-含興櫃(tick含試搓)` | List[symbol、symbol、symbol....] | | `批次取得盤中預估量` | List[symbol、symbol、symbol....] | ### 單值查詢(給一個代號拿一組結果,5 張) | 表名 | 參數 | |---|---| | `公司基本資料` | "symbol" | | `ETF持股清單` | "symbol"(etf) | | `個股上個交易日成交均張(成交量/成交筆數)` | "symbol" | | `產業個股清單` | "sector"( "台股產業對照表"中的"指數彙編分類") | | `查詢近100日買賣張數加總_高至低排序` | `symbol` | > **`brokerId` 的格式是 `'代號 分點名'`**(例如 `'1234 某券商某分點'`)。 > 合法值從 `查詢近100日買賣張數加總_高至低排序` 取——它回的是這檔股票近 100 日 > 有交易的分點清單(`分點代號` / `分點名稱` 兩欄,實測 878 筆),把兩欄組起來即可。 > > `get_table()` 自己印的提示會帶一個券商分點當範例,那段文字是**伺服器回傳的**, > 不在套件裡。 ### 挑表的三個判斷 **「多檔最新」vs「單檔多期」**是最重要的分野: 表名結尾 `-多檔股票最新時間` 是**全市場一個時間點**(拿來做排行、篩選), `-單檔股票多個區間` 是**一檔股票的時間序列**(拿來看趨勢、算指標)。 **要全市場的時間序列就別用 `api.Data`**,用 `api.MSMP` 的矩陣 (日期 × 股票代號),一次拿到全部。見 [msmp.md](msmp.md)。 **歷史長度看頻率**:日頻一律 1000 筆(約 4.1 年),週/月/季/年頻回溯 11~16 年。 見 [data-history.md](data-history.md)。 --- ## 注意 - `api.Data` 需要有效 token。登入時若印出 `[系統訊息] Token無效`,`api.Data` 不會掛上。 - 每次 `get()` 都是一次網路請求,會印一行 `INFO - Fetching table: ...`。 要對全市場做橫向運算請改用 [api.MSMP](msmp.md),那是本地快取的矩陣。 ==================================================================================================== # 資料頻率與歷史長度 > 所屬章節:Data 表格查詢 > 全部以 2026-08-21 實測(標的 `2330`,資料日 2026-08-20) **問「近五年 / 近十年」之前先看這頁。** 日頻有 1000 筆硬上限(約 4 年)。 台股降頻就能拿到 11~16 年,**但美股不行**(週/月 K 也只有 4 年)——見下方「美股的規則不一樣」。 答不出來通常不是沒資料,是**頻率選錯了**。 下面的表除非另外標明,都是**台股**。 ## 歷史長度地圖 | 頻率 | 取法 | 筆數 | 期間 | 約幾年 | |---|---|---|---|---| | **日** | `MSMP.日_*`(K、三大法人、融資券、指標…) | **1000** | 2022-07-08 ~ 2026-08-20 | **4.1** | | **日** | `Data.get('日K/技術指標/價量資料-單檔股票多個區間', s)` | **1000** | 同上 | **4.1** | | **日** | `Data.get('還原日K價量資料(個股、ETF、大盤)-單檔股票多個區間', s)` | **1000** | 同上 | **4.1** | | 週 | `MSMP.週_K` | 604 | 2014-12-05 ~ | 11.7 | | 週 | `Data.get('還原週K價量資料(個股、ETF、大盤)-單檔股票多個區間', s)` | **754** | **2012-01-06 ~** | **14.6** | | 月 | `MSMP.月_K` | 141 | 2014-12-31 ~ | 11.7 | | 月 | `Data.get('還原月K價量資料(個股、ETF、大盤)-單檔股票多個區間', s)` | **176** | **2012-01-01 ~** | **14.6** | | 月營收 | `MSMP.月_營收` | **199** | **2010-M01 ~** | **16.6** | | 月營收 | `Data.get('個股營收資訊-單檔股票多個區間', s)` | 175 | — | ~14.6 | | 季財報 | `Data.get('個股季財報資訊-單檔股票多個區間', s)` | 46 | 2015-Q1 ~ 2026-Q2 | 11.5 | | 年股利 | `Data.get('個股股利資訊(年)-單檔股票多個區間', s)` | 15 | 2012 ~ 2026 | 15 | | 年股利 | `MSMP.季股利資訊` | 15 | 2012-Y ~ 2026-Y | 15 | | 期貨 1 分 | `MSMP._fut_TXF` | **2,570,820** | **2017-05-15 ~** | **9.3** | | 個股 1 分 | `Data.get('取得歷史1分K(指定起訖日)', s, start, end)` | 依區間 | 你指定 | — | **日頻是 1000 筆,週/月頻的 `Data` 版本比 `MSMP` 版本更長。** 要長歷史的日線只能自己用 `取得歷史1分K(指定起訖日)` 逐段抓再聚合。 ## 「近 N 年」該走哪張表 | 問題 | 走哪 | |---|---| | 近一週 / 一個月 / 一季 | 日頻,隨便哪張都行 | | 近一年 ~ 近四年 | 日頻可以(1000 筆剛好蓋到 4.1 年) | | **近五年** | **日頻不夠**。週頻(`還原週K`,14.6 年)或季頻(`個股季財報`,11.5 年) | | 近十年 | 週/月頻,或月營收(16.6 年) | | 十年以上 | 只有 `月_營收`(2010 起)與年股利(2012 起) | 實例——「2330 近五年 PER 走勢」: ```python # ✗ 日頻只有 4.1 年,給不出五年 api.MSMP.日_指標.本益比['2330'] # (1000,) 2022-07-08 起 # ✓ 季頻有 11.5 年 d = api.Data.get('個股季財報資訊-單檔股票多個區間', '2330') d[d['年季'] >= '2021-Q1'][['年季', '本益比', '公告EPS(元)']] # 22 期,本益比 13.1 ~ 32.4 ``` ## 兩個容易誤判的陷阱 **1. `月_營收` 的 index 是字串不是日期。** 格式 `'2026-M07'`, 所以 `.resample()` / `>= pd.Timestamp(...)` 都不能用,要用字串比較: ```python s = api.MSMP.月_營收.金額_千['2330'] s[s.index >= '2026-M01'] # 字串比較剛好可行(zero-padded) ``` 季頻同理是 `'2026-Q2'`、年頻是 `'2026-Y'` 或 `2026`(整數)。 **2. `月_營收.金額_千` 的單位是千元。** 換億元要 `÷ 1e5`,不是 `÷ 1e7`: ```python api.MSMP.月_營收.金額_千['2330'].iloc[-1] # 467580548.0 # ÷ 1e5 = 4676 億元 ← 對 # ÷ 1e7 = 46.8 ← 錯了 100 倍 ``` 凡是 `_千` 結尾的欄位都是這個規則。`_百萬` 結尾(如 `成交額_百萬`)則是 `÷ 1e4` 得億元。 ## 期貨資料在 `MSMP._fut_TXF` **不在 `api.Data` 的 80 張表裡**(那些全是台股現貨),期貨是 `MSMP` 的一個私有屬性: ```python f = api.MSMP._fut_TXF # DataFrame (2570820, 7) # columns: DateTime, Open, High, Low, Close, TotalVolume, settlement ``` | 欄 | 說明 | |---|---| | `DateTime` | 1 分 K 的時間。**零重複**——這是單一「近月連續序列」,不是多合約併排 | | `Open`/`High`/`Low`/`Close` | 點數 | | `TotalVolume` | 口數 | | `settlement` | 這根 K 屬於哪個合約(結算日)。共 113 個不同值 = 113 個合約月 | 因為 `DateTime` 不重複,任何時點都只有近月合約,聚合成日線就是「近月合約日成交資訊」: ```python g = api.MSMP._fut_TXF.set_index('DateTime') daily = g.resample('D').agg(開盤=('Open','first'), 最高=('High','max'), 最低=('Low','min'), 收盤=('Close','last'), 成交量=('TotalVolume','sum'), 結算日=('settlement','last')).dropna(subset=['開盤']) daily.tail(5) ``` 實測近一週(2026-08-15 ~ 08-20)合計 269,758 口,08-19 換月到 09-16 合約。 > 要 K 線而不是自己 resample,用 `api.bt.Tools.get_fut_ohlc('TXF', freq=60)`—— > 它讀的就是這份快取,還會處理日夜盤時段與結算切斷。見 > [backtest-data.md](backtest-data.md)。 ## 美股的規則不一樣 **台股的「降頻拿長歷史」在美股不成立。** 台股週/月 K 回溯 11.7 年, 美股週 K 只有 4.5 年、月 K 只有 4 年——跟日 K 差不多。 | 頻率 | 台股 | 美股 | |---|---|---| | 日 | 1000 筆 / 4.1 年 | 1000 筆 / 4.0 年 | | 週 | 604 筆 / **11.7 年** | 235 筆 / **4.5 年** | | 月 | 141 筆 / **11.7 年** | 49 筆 / **4.0 年** | | 季財報 | 46 期 / 11.5 年(走 `Data`) | 111 期 / **27.8 年**(`USMSMP.季財報_*`) | | 月/季營收 | 199 期 / 16.6 年 | 111 期 / 27.8 年 | | 年股利 | 15 期 / 15 年 | 34 期 / **34 年** | 所以: - **美股要長期股價**:沒有。價格類最多 4.5 年。 - **美股要長期基本面**:很充足,季財報回到 1998-Q4、股利回到 1993。 - 美股財報只覆蓋 **5801 檔**,價格覆蓋 13174 檔——跨表運算要 `.dropna()`。 細節見 [usmsmp.md](usmsmp.md)。 ## SnowyOwl 沒有的資料 問到這些要直接說沒有,不要硬湊: - **選擇權**(台指選擇權、個股選擇權)——完全沒有 - **匯率**(USD/TWD 等 FX 行情)——沒有。表裡出現的「匯率」都是財報的 「匯率變動對現金及約當現金之影響」,不是行情 - **利率**(央行、聯準會、公債殖利率)——沒有。出現的「利率」都是 「殖利率」「毛利率」「週轉率」這類財務比率 - **原物料**(原油、黃金…)——沒有 - **海外期貨**——沒有,期貨只有台指期 TXF ## 相關頁 - [Data.get_table 列出可用表格](data-get-table.md):台股 80 張表完整清單 - [MSMP 資料表與欄位完整清單](msmp-tables.md):台股 25 張、美股 10 張矩陣表 - [回測:資料與週期](backtest-data.md):`bt.Tools.get_stock_ohlc` / `get_fut_ohlc` - [USMSMP 美股矩陣資料](usmsmp.md):美股 10 張表的欄位、形狀與期間 ==================================================================================================== # USData.get_snapshots 美股即時快照 > 所屬章節:Data 表格查詢 > 以 2026-09-10 實際執行結果為準 ## Overview 取一批**美股**股票的即時報價快照。這是**拉取式**的一次性查詢。 ```python api.USData.get_snapshots(symbols) ``` | 參數 | 型態 | 說明 | |------|------|------| | `symbols` | `list[str]` | 美股代號清單(如 `['AAPL', 'MSFT']`) | 回傳 `dict[str, Symbol]`,key 是股票代號。 > **只有美股 `api.USData` 有這個方法。台股 `api.Data` 不含 `get_snapshots`。** > 台股要盤中資料請用 `api.Data.get(...)` 的分K/逐筆查詢,見 [intraday.md](intraday.md)。 ## Manual Sample Input/Output ### Example 1:取兩檔 #### input ```python s = api.USData.get_snapshots(['AAPL', 'MSFT']) print(type(s).__name__, len(s), list(s)) s['AAPL'] ``` #### output ```text dict 2 ['AAPL', 'MSFT'] Symbol(timestamp='20260910160000000', open=316.67, high=326.74, low=316.51, close=326.57, volume=70011913, previousClose=315.34, netChange=11.23, percentChange=3.56) ``` --- ### Example 2:Symbol 欄位 | 欄位 | 型態 | 說明 | |------|------|------| | `timestamp` | `str` | 報價時間,格式 `yyyyMMddHHmmssSSS`(毫秒) | | `open` / `high` / `low` / `close` | `float` | 當日開 / 高 / 低 / 最新(收)價 | | `volume` | `int` | 當日累計成交量 | | `previousClose` | `float` | 昨收價 | | `netChange` | `float` | 漲跌(相對昨收)| | `percentChange` | `float` | 漲跌幅(%),已算好 | `Symbol` 是 dataclass,可用 `dataclasses.asdict()` 轉 dict: ```python from dataclasses import asdict asdict(s['AAPL']) ``` ```text {'timestamp': '20260910160000000', 'open': 316.67, 'high': 326.74, 'low': 316.51, 'close': 326.57, 'volume': 70011913, 'previousClose': 315.34, 'netChange': 11.23, 'percentChange': 3.56} ``` --- ### Example 3:漲跌幅直接讀 台股的 `Stock` 沒有漲跌幅要自己算;美股的 `Symbol` **已經帶好** `netChange` 與 `percentChange`,直接讀即可: ```python d = s['AAPL'] print(f"{d.netChange:+.2f} ({d.percentChange:+.2f}%)") ``` ```text +11.23 (+3.56%) ``` --- ## 注意 - 盤後執行拿到的是最後一筆收盤快照,`timestamp` 停在收盤時間(如上例 `160000000` = 16:00 收盤)。 - 美股 `Symbol` 與台股 `Stock` 欄位不同:**美股沒有五檔(買賣價量)、沒有漲停跌停**, 但多了現成的 `netChange` / `percentChange`。 ==================================================================================================== # 盤中、分K與逐筆明細 > 所屬章節:Data 表格查詢 > 全部以 2026-08-21 **盤中 12:40** 實際執行結果為準(台股交易時段 09:00–13:30) > 23 張表都實跑過,形狀與欄位是真實輸出 ## 先選對工具 `api.MSMP` 只到**前一交易日**。要當下的資料有三條路,用途不同: | 要什麼 | 用 | 特性 | |---|---|---| | 盤中的**歷史過程**(分K、逐筆、分價量) | `api.Data.get(...)` 本頁這 23 張 | 一次性、拿整段 | 非交易時段呼叫這些表拿到的是**最後一個交易日**的資料,不會報錯。 ## 用途界線:哪些能回測、哪些只能看今天 **這 23 張表分兩類,用途完全不同。** | | 「盤中即時」類 | 「歷史分K」類 | |---|---|---| | 有哪些 | `取得即時分K*`、`取得今日即時成交明細*`、`取得零股成交明細`、`分價量`(current)、`批次取得*`、`漲跌家數(盤中)` 等大盤概況、`即時周轉率排行` | `取得歷史1分K(指定起訖日)`、`取得歷史1分K(指定日期前5天)`、`取得歷史3/5分K(指定當日)`、`取得歷史分K(指定日期前)` | | 涵蓋範圍 | **只有當天** | **約 4 年**(實測 2022-08-22 起、968 個交易日) | | 適合 | **最新一日的篩選與觀察** | 回測、盤中行為研究 | | 不適合 | **回測**——只有一天,沒有樣本 | — | 實測 `取得歷史1分K(指定起訖日)` 的回溯能力(2330): ```text 20260801~20260820 3,721 列 14 個交易日 20260501~20260820 20,284 列 77 個交易日 20250801~20260820 67,629 列 255 個交易日 20220801~20260820 257,192 列 968 個交易日 ← 實際從 2022-08-22 開始 ``` 跟日頻一樣是約 1000 個交易日的窗。`api.bt.Tools.get_stock_ohlc()` 底層讀的就是這張表 (抓 1 分 K 再聚合成你要的 `freq`),所以要做分K回測直接用它,見 [backtest-data.md](backtest-data.md)。 > **盤中即時類拿來當「最新一日的篩選條件」是對的用法**—— > 例如「現在漲幅前 20 且內盤外盤比失衡的」「盤中預估量爆的」。 > 但它只有今天這一份,**不能拿去回測**,也沒辦法驗證這個條件過去有沒有效。 > 要驗證就得換成歷史分K 或日頻資料。 --- ## 一、盤中大盤概況(5 張,都不用參數) | 表名 | 形狀 | 欄位 | |---|---|---| | `漲跌家數(盤中)` | (12, 2) | `分級`、`家數` | | `漲跌列表(盤中)` | (12, 2) | `分級`、`股票列表`(該級距的代號 list) | | `漲跌家數分鐘歷史(盤中)` | (220, 13) | `hhmm` + 12 個級距欄 | | `粗產業多(盤中)` | (47, 8) | `市場別`、`名稱`、`漲跌`、`漲跌幅`、`淨比`、`淨流`、`總市值`、`市值漲跌幅` | | `粗產業空(盤中)` | (60, 8) | 同上 | 12 個級距固定是:`-8% -6% -4% -2% -1% -0% +0% +1% +2% +4% +6% +8%`。 #### input ```python api.Data.get('漲跌家數(盤中)') ``` #### output(12:40 實測) ```text 分級 家數 -8% 8 -6% 8 -4% 41 -2% 133 -1% 233 -0% 478 +0% 646 +1% 190 +2% 126 +4% 39 +6% 7 +8% 33 ``` `-0%` / `+0%` 是「跌但不到 1%」與「漲但不到 1%」,不是平盤。 `漲跌列表(盤中)` 是同一份分級但給代號清單: ```text -8%: ['7750', '6715', '4139', '6492', '5701', '2067', '3259', '3026']... ``` `漲跌家數分鐘歷史(盤中)` 把上面那張表**逐分鐘**記錄下來(220 列 = 開盤到現在的分鐘數), 可以看出資金是往上還往下跑。 ### 產業資金流 ```text 市場別 名稱 漲跌 漲跌幅 淨比 淨流 總市值 市值漲跌幅 TSE 航運 6.1900 6.4200 20.91% 72.10億 2041211534150 3.6100 TSE IC-製造 9.7800 0.4200 12.18% 41.71億 64036106221650 0.8300 ``` > `淨比` / `淨流` 是**字串**(帶 `%` 與「億」),不是數值——要運算得自己剝掉單位。 > `粗產業多` 47 列、`粗產業空` 60 列,兩張分開(不是同一張的正負兩半)。 --- ## 二、個股分K(8 張) **參數規則不一致,這是最容易錯的地方**: | 表名 | 參數 | 形狀(2330) | |---|---|---| | `取得即時分K(最後交易日)` | `symbol`, **`minutes`** | (45, 11) | | `取得即時分K-含興櫃` | `symbol` | (220, 10) | | `取得歷史分K(指定日期前)` | `symbol`, `yyyyMMdd`, **`minutes`** | (18, 11) | | `取得歷史3分K(指定當日)` | `symbol`, `yyyyMMdd` | (90, 9) | | `取得歷史5分K(指定當日)` | `symbol`, `yyyyMMdd` | (54, 9) | | `取得歷史1分K(指定起訖日)` | `symbol`, `startDate`, `endDate` | (798, 8) | | `取得歷史1分K(指定日期前5天)` | `symbol`, `yyyyMMdd` | (1330, 8) | | `取得歷史分K(含加權/櫃買指數)` | `symbol`, **`minutes`** | (999, 11) | `minutes` 可選 `1 / 3 / 5 / 15 / 30 / 60`。漏傳會拋 `ValueError` 並印出正確用法: ```text ValueError: 參數輸入錯誤,正確用法: Data.get('取得即時分K(最後交易日)', '2330', 1) # minutes 可選: [1, 3, 5, 15, 30, 60] ``` ### 欄位 三種欄位組合: ```text 最精簡(8 欄) 日期 hhmm 開盤價 最高價 最低價 收盤價 成交量 datetime 帶均線(9 欄) 上面 + MA3 或 MA5(固定當日均線,跟表名的分鐘數對應) 帶累計(11 欄) 上面 + 日成交金額(千) 日成交量 日平均價 ``` > **`日成交金額(千)` / `日成交量` / `日平均價` 是「當日累計到這一根為止」**, > 不是這根的量。這根的量在 `成交量`。 #### input ```python api.Data.get('取得即時分K(最後交易日)', '2330', 5).tail(2) ``` #### output(12:41 實測) ```text 日期 hhmm 開盤價 最高價 最低價 收盤價 成交量 日成交金額(千) 日成交量 日平均價 datetime 43 2026-08-21 1240 2400 2400 2395 2400 77 22503500 9430 2386.3700 2026-08-21 12:40:00 44 2026-08-21 1245 2400 2400 2395 2400 17 22544265 9447 2386.3900 2026-08-21 12:45:00 ``` **K 棒用結束時間標記,最後一根是還在形成中的。** 實測:間隔 25 秒取兩次, ```text 12:43:35 最後一根 1245 量=69 倒數第二根 1240 量=77 12:44:00 最後一根 1245 量=78 倒數第二根 1240 量=77 ``` 最後一根(`1245`,涵蓋 12:40–12:45)的量從 69 漲到 78, 倒數第二根維持 77 不動——**最後一根還在累加**。 它的 `收盤價` 就是當下最新價。做訊號時要**丟掉最後一根**,否則會用到未完成的 bar。 ### 時間欄有兩套 分K表同時給 `日期` + `hhmm`(4 位字串)**和**組合好的 `datetime`。 直接用 `datetime` 就好,不用自己拼: ```python df = api.Data.get('取得歷史1分K(指定起訖日)', '2330', '20260818', '20260820') df = df.set_index('datetime') # 已經是 datetime64 ``` > 只有 `取得即時分K-含興櫃` 這張**沒有** `datetime` 欄(10 欄版),要自己組。 --- ## 三、逐筆明細與五檔(5 張) | 表名 | 參數 | 形狀 | 說明 | |---|---|---|---| | `取得今日即時成交明細(含五檔報價)` | `symbol` | (2906, 28) | 當日逐筆,每筆都帶當下五檔 | | `取得今日即時成交明細(貼標大戶/散戶)` | `symbol` | (2906, 29) | 同上多一欄 `類型` | | `取得最新一筆成交明細(含五檔報價)` | `symbol` | (1, 28) | 只要最新一筆時用這張,省流量 | | `取得零股成交明細` | `symbol` | (2494, 8) | **量的單位是股** | | `取得個股盤中內外盤-含興櫃` | `symbol` | (1, 4) | 內外盤累計量 | ### 28 欄的結構 ```text 成交價 成交量 總成交量 開盤價 datetime 最佳買價 最佳賣價 成交序號 買_1價 買_1量 … 買_5價 買_5量 ← 注意順序:檔案裡是 買_5 到 買_1 賣_1價 賣_1量 … 賣_5價 賣_5量 ``` `買_1` 是最佳買價(最高的買價),`賣_1` 是最佳賣價。實測驗證: ```text 最佳買價 2395.0 == 買_1價 2395.0 最佳賣價 2400.0 == 賣_1價 2400.0 買檔價格由高到低: [2395, 2390, 2385, 2380, 2375] 賣檔價格由低到高: [2400, 2405, 2410, 2415, 2420] ``` 所以 `最佳買價` / `最佳賣價` 兩欄是 `買_1價` / `賣_1價` 的別名,取哪個都一樣。 #### input ```python d = api.Data.get('取得最新一筆成交明細(含五檔報價)', '2330') d[['成交價', '成交量', '總成交量', 'datetime', '買_1價', '買_1量', '賣_1價', '賣_1量']] ``` #### output(12:41 實測) ```text 成交價 成交量 總成交量 datetime 買_1價 買_1量 賣_1價 賣_1量 2400 1 9454 2026-08-21 12:41:12.357 2395 109 2400 1085 ``` `datetime` 有**毫秒**。`成交量` 是這一筆(1 張),`總成交量` 是當日累計(9454 張)。 ### 內外盤的欄名是簡體「内」 ```python api.Data.get('取得個股盤中內外盤-含興櫃', '2330') ``` ```text 股票代號 交易所 内盤 外盤 2330 TWSE 2786 4784 ``` > **欄名是 `内盤` 不是 `內盤`**(簡體「内」)。用 `df['內盤']` 會 `KeyError`。 > 批次版 `批次取得個股盤中內外盤-含興櫃與權證` 也一樣。 --- ## 四、分價量(2 張) | 表名 | 參數 | 形狀 | |---|---|---| | `分價量` | `symbol` | (715, 5) | | `取得指定日期前幾天的分價量歷史資料` | `symbol`, `endDate`, `days` | (21, 4) | `分價量` 一次給**五種累計區間**,用 `類型` 欄區分: ```text 類型值:current / pre2Sum / pre4Sum / pre9Sum / pre19Sum ``` 呼叫時會印一行說明: ```text current: 當日累計分價量 pre{N}Sum: 前{N}日累計分價量(不含今日) ``` ```python d = api.Data.get('分價量', '2330') today = d[d['類型'] == 'current'] # 只要當日 last20 = d[d['類型'] == 'pre19Sum'] # 前 19 日(不含今日) ``` #### output(當日部分) ```text 股票代號 日期 類型 價格 成交量 2330 2026-08-21 current 2400 1037 2330 2026-08-21 current 2395 2652 2330 2026-08-21 current 2390 1357 ``` --- ## 五、批次盤中(4 張,傳 `List[symbol]`) | 表名 | 形狀(2 檔) | 欄位重點 | |---|---|---| | `批次取得個股盤中行情` | (2, 11) | `開盤價`/`最高價`/`最低價`/`收盤價`/`平盤價`/`成交量`/`日平均價`/`成交金額(千)` | | `批次取得個股盤中行情-含興櫃(tick含試搓)` | (2, 16) | 多了 `漲停價`/`跌停價`/`datetime`/`成交價`/`總量`/`買1價量`/`賣1價量` | | `批次取得個股盤中內外盤-含興櫃與權證` | (2, 3) | `内盤`/`外盤` | | `批次取得盤中預估量` | (2, 3) | `datetime`、`成交量`(**收盤預估量**) | #### output(12:41 實測) ```text 股票代號 交易所 平盤價 漲停價 跌停價 datetime 開盤價 最高價 最低價 成交價 成交量 總量 買1量 買1價 賣1價 賣1量 2330 TWSE 2375 2610 2140 2026-08-21 12:41:46 2375 2400 2365 2395 1 9465 107 2395 2400 1077 2317 TWSE 246.5 271 222 2026-08-21 12:41:48 245 247 243 245.5 1 16642 167 245 245.5 446 ``` > 含興櫃那張的五檔只有**第一檔**(`買1價` / `賣1價`),要完整五檔用逐筆明細那張。 > 欄名也不同:這裡是 `買1量` 沒有底線,逐筆明細是 `買_1量` 有底線。 `批次取得盤中預估量` 給的是**收盤預估量**,不是當下累計量: ```text 股票代號 datetime 成交量 2330 2026-08-21 12:41:01 12054.3720 2317 2026-08-21 12:41:01 21176.4960 ``` 12:41 時 2330 當下累計 9465 張,預估收盤 12054 張。 --- ## 六、其他即時 | 表名 | 參數 | 形狀 | 說明 | |---|---|---|---| | `即時周轉率排行` | 無 | (200, 2) | `股票代號`、`周轉率%`,只給前 200 名 | | `收盤20日周轉率` | 無 | (2728, 5) | 全市場 | | `個股上個交易日成交均張(成交量/成交筆數)` | `symbol` | (1, 2) | 判斷散戶/法人參與度 | ```text 即時周轉率排行 前3: 股票代號 周轉率% 3441 98.7300 8039 23.0300 4939 21.7900 ``` --- ## 注意 - **最後一根 K 棒還在形成中**,做訊號要丟掉它。K 棒用**結束時間**標記。 - **`日成交金額(千)` / `日成交量` 是當日累計**,不是那一根的量。 - **內外盤的欄名是簡體 `内盤`**,`df['內盤']` 會 `KeyError`。 - **五檔欄名兩套**:逐筆明細是 `買_1量`(有底線),批次含興櫃是 `買1量`(沒底線)。 - **零股的量單位是股**,整股是張。 - **`淨比` / `淨流` 是字串**(帶 `%` 與「億」),要運算得先剝單位。 - 分K 的 `minutes` 只接受 `1/3/5/15/30/60`,漏傳會 `ValueError` 並印出正確用法。 - **盤中即時類只有今天**,適合做最新一日的篩選,**不能回測**。要回測用 `取得歷史1分K(指定起訖日)`(4 年)或日頻資料。 - 非交易時段呼叫這些表拿到**最後一個交易日**的資料,不會報錯—— 要確認是不是今天的,看回傳的 `日期` 或 `datetime` 欄。 ## 相關頁 - [Data.get 取得表格資料](data-get.md):80 張表按用途分組 - [USData.get_snapshots 美股即時快照](data-get-snapshots.md):美股一次性報價(台股無此方法) - [資料頻率與歷史長度](data-history.md):日頻 1000 筆上限、期貨在哪 ==================================================================================================== # USData 美股表格查詢 > 所屬章節:Data 表格查詢 > 以 2026-08-21 實際執行結果為準(資料日 2026-08-20) > 本頁 25 張表全部實跑過,形狀與欄位是真實輸出 ## Overview `api.USData` 是美股的**表格式**查詢:一次拿一張 `pandas.DataFrame`。 與 `api.USMSMP`(矩陣式,日期 × 股票代號)分工如下: | | `api.USData` | `api.USMSMP` | |---|---|---| | 形狀 | 一張表一個主題,欄位是欄名 | 日期 × 股票代號的矩陣 | | 適合 | 看單一標的的完整財報、分K、明細 | 跨全市場算指標、選股 | | 資料日 | 到前一交易日;盤中表另有即時值 | 到前一交易日 | 三個方法: ```python api.USData.get_table() # 印出所有表名與必填參數(不回傳值) api.USData.get(table, *args) # 取一張表 -> DataFrame api.USData.get_snapshots(symbols) # 即時快照 -> dict[str, Symbol] ``` > `get(table: str, *args) -> pandas.DataFrame`。沒有關鍵字參數, > 全部照位置傳,順序見 `get_table()` 印出的提示。 --- ## 資料表清單 `get_table()` **只印出來、回傳 `None`**(型態是 `NoneType`), 所以不能拿回傳值去列舉表名——要程式化處理請照抄下面的清單。 ### 不需要參數(多檔股票最新時間) | 表名 | 形狀 | 欄位 | |------|------|------| | `美股產業對照表` | (13187, 21) | `股票代號`、`股票名稱`、`粗產業名稱`、`細產業名稱`、`是否為ETF`、`股票名稱(中文)`、`粗產業名稱(中文)`、`細產業名稱(中文)`、`市值(美元)`、`流通股數`、`員工人數`、`股東人數`、`經營概述`、`產業地位` 及其英文/簡中版本 | | `EPS/本益比/殖利率-多檔股票最新時間` | (5796, 7) | `股票代號`、`股票名稱`、`昨日收盤價`、`本益比`、`殖利率`、`公告累計EPS(元)`、`近四季EPS(元)` | | `ROE/ROA-多檔股票最新時間` | (5635, 5) | `股票代號`、`股票名稱`、`年季`、`ROE-稅後權益報酬率(%)`、`ROA-稅後資產報酬率(%)` | | `日K價量資料(個股、ETF)-多檔股票最新時間` | (13167, 10) | `股票代號`、`股票名稱`、`日期`、`開盤價`、`最高價`、`最低價`、`收盤價`、`成交量`、`漲跌`、`漲跌幅(%)` | | `取得美股盤後收盤價-多檔股票最新時間` | (13531, 8) | `股票代號`、`日期`、`開盤價`、`最高價`、`最低價`、`收盤價`、`成交量`、`更新時間` | | `取得當前所有產業資金流` | (145, 6) | `日期`、`產業名稱`、`買入金額`、`賣出金額`、`資金淨流`、`percentChange` | > `美股產業對照表` 有 4 個長文字欄(`經營概述` / `產業地位` 的中英簡三版), > 單筆可達數千字。只要分類的話取 `['股票代號','粗產業名稱','細產業名稱','是否為ETF','市值(美元)']` 就好。 ### 需要 `symbol`(單檔股票多個區間) | 表名 | 形狀(AAPL) | 欄位 | |------|------|------| | `日K價量資料(個股、ETF)-單檔股票多個區間` | (1000, 22) | 日期、代號、名稱、OHLC、`成交量`、`漲跌`、`漲跌幅(%)`,外加 `5/10/20/60/125/250日均價` 與 `5/10/20/60/125/250日均量` | | `週K價量資料(個股、ETF)-單檔股票多個區間` | (235, 13) | 同上但均線只有 `5MA`、`20MA`、`60MA` | | `月K價量資料(個股、ETF)-單檔股票多個區間` | (49, 13) | 同週K | | `個股營收資訊-單檔股票多個區間` | (110, 14) | `年季`、`單季/累計合併營收(千)`、季變動與年成長率、毛利/營益/稅前/稅後/總資產/淨值成長率 | | `個股資本支出-單檔股票多個區間` | (30, 4) | `年度`、`資本支出(千)`、`固定資產(千)` | | `個股股利資訊(年)-單檔股票多個區間` | (30, 4) | `年度`、`股利合計(元)`、`殖利率` | | `季稅後淨利/季稅後EPS-單檔股票多個區間` | (114, 6) | `年季`、`日期`、`公告日`、`稅後純益(千)`、`每股稅後盈餘(元)` | | `季毛利率/季營益率/ROE-單檔股票多個區間` | (114, 7) | `年季`、`日期`、`公告日`、`毛利率(%)`、`營業利益率(%)`、`ROE–稅後權益報酬率(%)` | | `個股季財報資訊-單檔股票多個區間` | (110, **81**) | 完整三表+比率,見下方說明 | | `近四季財報加總-單檔股票多個區間` | (111, 24) | `近四季公告EPS(元)`、近四季營收/毛利/淨利/三大現金流、`最近一季之加權平均流通在外股數(千)` 等 | | `取得個股內外盤-單檔股票多個區間` | (589, 5) | `日期`、`股票代號`、`買量(股)`、`賣量(股)`、`資金淨流` | | `分價量` | (1951, 5) | `股票代號`、`日期`、`類型`、`價格`、`成交量` | | `取得最新一筆成交明細` | (1, 11) | `timestamp`、代號、OHLC、`成交量`(該筆)、`當日成交量`、`上個交易日的收盤價`、`漲跌`、`漲跌幅(%)` | ### 需要多個參數 | 表名 | 參數 | 形狀 | |------|------|------| | `取得指定日期前幾天的分價量歷史資料` | `symbol`、`endDate`(`yyyyMMdd`)、`days` | (62, 4) | | `取得全天含盤前盤後歷史分k(最後交易日)` | `symbol`、`market`(`F`全天/`P`盤前/`M`盤中/`A`盤後) | (946, 8) | | `取得歷史1/3/5/15/30/60分K` | `symbol`、`minutes`(1/3/5/15/30/60) | (999, 8) | 三張分K表的欄位相同:`股票代號`、`日期`、`hhmm`、`開盤價`、`最高價`、`最低價`、`收盤價`、`成交量`。 **日期與時間是分開兩欄**(`日期` 是 date、`hhmm` 是 4 位字串),要合併得自己組。 ### 需要 `List[symbol]`(批次盤中) | 表名 | 形狀(傳 2-3 檔) | 欄位 | |------|------|------| | `批次取得個股盤中多筆分K` | (780, 8) | 同分K表 | | `批次取得個股盤中最新行情` | (3, 10) | `timestamp`、代號、OHLC、`當日成交量`、`上個交易日的收盤價`、`漲跌`、`漲跌幅(%)` | | `批次取得個股盤中內外盤` | (2, 5) | `日期`、`股票代號`、`買量(股)`、`賣量(股)`、`資金淨流` | --- ## Manual Sample Input/Output ### Example 1:日K 價量(單股,含均價與均量) #### input ```python df = api.USData.get('日K價量資料(個股、ETF)-單檔股票多個區間', 'AAPL') print(df.shape) df.head(2) ``` #### output ```text (1000, 22) 日期 股票代號 股票名稱 開盤價 最高價 最低價 收盤價 成交量 漲跌 漲跌幅(%) 5日均價 10日均價 5日均量 0 2022-08-25 AAPL APPLE INC 168.7800 170.1400 168.3500 170.0300 51218209 2.5000 1.4900 168.7760 171.0900 59715988.4000 1 2022-08-26 AAPL APPLE INC 170.5700 171.0500 163.5600 163.6200 78961000 -6.4100 -3.7700 167.1960 170.2420 61438928.4000 ``` 固定給最近 **1000 個交易日**,由舊到新排序。均價/均量欄位已經算好, 不需要自己 rolling。 > **`成交量` 的單位是股,不是張。** 台股 `api.Data` 的成交量是張(1 張 = 1000 股), > 兩邊直接相比會差 1000 倍。 --- ### Example 2:分K(三種取法) #### input ```python # 標準分K:symbol + 分鐘數 df = api.USData.get('取得歷史1/3/5/15/30/60分K', 'NVDA', 5) df.head(2) ``` #### output ```text (999, 8) 股票代號 日期 hhmm 開盤價 最高價 最低價 收盤價 成交量 0 NVDA 2026-08-04 1050 210.1300 211.0399 209.9900 210.9200 1593932 1 NVDA 2026-08-04 1055 210.9025 211.0200 209.3545 209.5950 1982633 ``` #### input ```python # 含盤前盤後:最後一個交易日,market 決定盤別 df = api.USData.get('取得全天含盤前盤後歷史分k(最後交易日)', 'AAPL', 'F') df.head(1) ``` #### output ```text (946, 8) 股票代號 日期 hhmm 開盤價 最高價 最低價 收盤價 成交量 0 AAPL 2026-08-20 0400 316.0315 316.8300 315.5000 315.6000 14553 ``` `hhmm='0400'` 是美東時間 4:00(盤前)。`market` 傳 `'M'` 只會拿到盤中那段,並且會印出一行交易時間提示(`此為美股(紐約)交易時間: M(盤中):9:30 - 16:00`)。 要組成 `DateTime` 索引——`日期` 欄本來就是 `datetime64[ns]`、`hhmm` 是 4 位字串: ```python df['DateTime'] = pd.to_datetime( df['日期'].astype(str) + df['hhmm'].astype(str).str.zfill(4), format='%Y-%m-%d%H%M') ``` --- ### Example 3:財報(三種粒度) `個股季財報資訊-單檔股票多個區間` 是最完整的一張,**81 欄**,一次給三表加比率: - 資產負債:`資產(千)`、`流動資產(千)`、`現金及約當現金(千)`、`存貨(千)`、`負債(千)`、`股東權益(千)` … - 損益:`營業收入(千)`、`營業成本(千)`、`營業毛利(千)`、`研究發展費用(千)`、`稅後純益(千)`、`EBIT(稅前息前淨利)(千)` … - 現金流:`營業活動現金流量(千)`、`投資活動現金流量(千)`、`籌資活動現金流量(千)`、`自由現金流(千)`、`資本支出(千)` - 比率:`毛利率(%)`、`營業利益率(%)`、`稅後權益報酬率(%)`、`負債比率(%)`、`流動比率(%)`、`存貨週轉率單季(次)`、`股價淨值比`、`企業價值對EBITDA比率` … - 另有 `財報發布日`、`股價`、`市值`、`股數(千)`、`本益比`、`每股股息` 只要 EPS 或 ROE 的話用小張的更省: ```python eps = api.USData.get('季稅後淨利/季稅後EPS-單檔股票多個區間', 'AAPL') # (114, 6) roe = api.USData.get('季毛利率/季營益率/ROE-單檔股票多個區間', 'AAPL') # (114, 7) ttm = api.USData.get('近四季財報加總-單檔股票多個區間', 'AAPL') # (111, 24) ``` 三張都用 `年季`(例如 `'2026-Q1'`)當時間軸,並且有 `公告日` 可以避開前視偏誤。 --- ### Example 4:批次盤中行情 #### input ```python df = api.USData.get('批次取得個股盤中最新行情', ['AAPL', 'MSFT', 'NVDA']) df ``` #### output ```text (3, 10) columns: ['timestamp', '股票代號', '開盤價', '最高價', '最低價', '收盤價', '當日成交量', '上個交易日的收盤價', '漲跌', '漲跌幅(%)'] ``` `批次取得個股盤中內外盤` 給買賣量與資金淨流: ```text 日期 股票代號 買量(股) 賣量(股) 資金淨流 0 2026-08-20 AAPL 10428586 13428416 -946373213.6530 1 2026-08-20 MSFT 6953991 4704988 1084683432.1550 ``` 批次表沒有明文的檔數上限,但傳越多回應越慢;要全市場請改用 `api.USMSMP`。 --- ### Example 5:產業資金流 #### input ```python df = api.USData.get('取得當前所有產業資金流') df.head(2) ``` #### output ```text (145, 6) 日期 產業名稱 買入金額 賣出金額 資金淨流 percentChange 0 2026-08-20 Utilities - Regulated Water 157658842.6423 174145998.9061 -16487156.2638 0.1371 1 2026-08-20 Electronic Components 1938664200.2077 2064006536.7922 -125342336.5845 -1.3857 ``` 145 個產業,用的是 `細產業名稱`(英文),可以跟 `美股產業對照表` 的`細產業名稱` 欄對接——實測 **145 個全部對得上**(對照表共 146 個細產業,多的那個當日沒有資金流資料): ```python flow = api.USData.get('取得當前所有產業資金流') ind = api.USData.get('美股產業對照表') m = flow.merge(ind[['股票代號', '細產業名稱', '市值(美元)']], left_on='產業名稱', right_on='細產業名稱') ``` --- ### Example 6:`get_snapshots` 即時快照 #### input ```python snaps = api.USData.get_snapshots(['AAPL', 'MSFT']) s = snaps['AAPL'] {f: getattr(s, f) for f in ('close', 'open', 'high', 'low', 'volume', 'previousClose', 'netChange', 'percentChange', 'timestamp')} ``` #### output ```text {'close': 311.3, 'open': 317.455, 'high': 320.28, 'low': 310.65, 'volume': 40959184, 'previousClose': 316.83, 'netChange': -5.53, 'percentChange': -1.75, 'timestamp': '20260820160000000'} ``` 回傳 `dict[str, Symbol]`,key 是代號。`Symbol` 共 **9 個欄位**: | 欄位 | 說明 | |------|------| | `open` / `high` / `low` / `close` | 當日 OHLC(`close` 是最新價) | | `volume` | 當日累計成交量(**股**) | | `previousClose` | 前一交易日收盤 | | `netChange` / `percentChange` | 漲跌與漲跌幅(%),已經算好 | | `timestamp` | 17 位字串 `yyyyMMddHHmmssSSS`,例如 `'20260820160000000'` | > **台股沒有快照方法**:`api.Data` 不含 `get_snapshots`,只有美股 `api.USData` > 有。美股 `Symbol` 有 9 欄且直接給了 `netChange` / `percentChange`。 > 詳見 `data-get-snapshots.md`。 > > 簽名也不同:美股是 `get_snapshots(*args)`,型別註記比台股鬆。傳 list 是可行的用法。 --- ## 錯誤訊息 表名打錯是 `KeyError`,參數個數不對是 `ValueError`,而且會把正確用法印出來: ```python api.USData.get('不存在的表') # KeyError: '不存在的表' api.USData.get('日K價量資料(個股、ETF)-單檔股票多個區間') # ValueError: 參數輸入錯誤,正確用法: # USData.get('日K價量資料(個股、ETF)-單檔股票多個區間', 'AAPL') api.USData.get('日K價量資料(個股、ETF)-單檔股票多個區間', 'AAPL', 'extra') # 同一個 ValueError —— 多傳也算錯 ``` 表名要**完全一致**,包含全形括號與斜線。常見打錯的是漏掉開頭的「取得」: `'取得個股內外盤-單檔股票多個區間'` 有「取得」, 但 `'個股營收資訊-單檔股票多個區間'` 沒有。 --- ## 注意 - **成交量單位是股**,台股 `api.Data` 是張。跨市場比較前先換算。 - 日K 均線已內含在日K表(`5~250日均價`/`5~250日均量`),不必另取技術指標表。 台股是分開兩張表。 - `年季` 格式是 `'2026-Q1'` 字串,不是日期;要排序或對齊請先轉換。 - 財報表都有 `公告日` / `財報發布日`,做回測時**用它而不是 `年季`** 才不會前視。 - 盤中類表(`分價量`、`取得最新一筆成交明細`、`批次*`)的值會隨盤變動, 非交易時段拿到的是最後一筆。 ==================================================================================================== # MSMP 矩陣資料總覽 > 所屬章節:MSMP 歷史資料 > 以 2026-08-20 實際執行結果為準(台股 25 張表、美股 10 張表) ## Overview `api.MSMP`(台股)與 `api.USMSMP`(美股)提供**矩陣式**歷史資料: 每個欄位都是一張 **日期(index) × 股票代號(columns)** 的 DataFrame。 這是做全市場橫向運算(選股、排名、回測)的資料來源,積木底層用的就是它。 資料放在本地快取,**不需要 token**;登入時會檢查並更新,之後個別欄位延遲載入。 ```python api.MSMP.日_K.Close # 屬性存取 api.MSMP.get('日_K', 'Close') # 字串存取,適合參數化 ``` | 成員 | 型態 | 說明 | |------|------|------| | `<表名>.<欄位>` | `DataFrame` | 日期 × 股票代號 的矩陣 | | `get(table, name)` | `DataFrame` | 同上,用字串指定 | | `get_table()` | 印出 | 列出所有表與欄位 | | `list` | `dict` | 股池,見 [股池](msmp-list.md) | | `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 ```python api.MSMP.日_K.Close.iloc[-3:, :6] ``` #### output ```text 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](data-get.md)。 --- ### Example 2:兩種取法等價 #### input ```python api.MSMP.get('日_K', 'Close').shape == api.MSMP.日_K.Close.shape ``` #### output ```text True ``` 欄位名打錯時: #### input ```python api.MSMP.get('日_K', '沒有這欄') ``` #### output ```text ValueError: 在 '日_K' 中找不到名為 '沒有這欄' 的欄位。 ``` --- ### Example 3:INDEX 各頻率 #### input ```python for k, v in api.MSMP.INDEX.items(): print(f"{k}: len={len(v)} 最後={v[-1]}") ``` #### output ```text 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'` 可能取到未來日期的原因,見 > [執行選股](block-screener.md)。 --- ### Example 4:INFO 全市場基本資料 #### input ```python api.MSMP.INFO.head(3) ``` #### output ```text 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 ``` 常用來把代號轉名稱: ```python name_map = api.MSMP.INFO.set_index('股票代號')['股票名稱'].to_dict() ``` --- ### Example 5:大盤指數是單欄矩陣 #### input ```python api.MSMP.TSE.Close.tail(3) ``` #### output ```text 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` 會自動把它廣播成對方的欄位,所以可以直接寫: ```python # 個股相對大盤的強弱 rel = api.MSMP.日_K.adj_Close / api.MSMP.TSE.adj_Close ``` --- ### Example 6:三張欄位語意特殊的表 這三張表 `msmp-tables.md` 有列欄位,但用法容易踩錯,單獨說明。 #### 其他_大盤 —— columns 是「法人分類」不是股票代號 ```python api.MSMP.其他_大盤.成交金額_百萬.shape # (1000, 29) api.MSMP.其他_大盤.成交金額_百萬.columns ``` ```text ['全體投信', '全體外資', '全體自營', '八大行庫', '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](block-caveats.md) 第 11 節。 > > 要算「個股佔大盤成交比重」請用個股自己加總: > > ```python > 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 日)+ `家數和`。 ```python 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 ```python 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。 --- ## 相關文件 - [MSMP 資料表與欄位完整清單](msmp-tables.md)(台股 25 張、美股 10 張,程式產生) - [MSMP 股池 list](msmp-list.md) - [USMSMP 美股矩陣資料](usmsmp.md) ==================================================================================================== # MSMP 資料表與欄位完整清單 > 所屬章節:MSMP 歷史資料 > 以登入後 `api.MSMP._data_map` / `api.USMSMP._data_map` 實際內容產生(台股 25 張表、美股 10 張表) ## Overview MSMP 的每個欄位都是一張 **日期(index) × 股票代號(columns)** 的矩陣。兩種取法等價: ```python api.MSMP.日_K.Close # 屬性存取 api.MSMP.get('日_K', 'Close') # 字串存取,適合參數化 ``` `api.MSMP.get_table()` 會把下表直接印出來。 --- ## 台股(api.MSMP) ### 日_K(15 欄) `處置股`、`Open`、`High`、`Low`、`Close`、`Volume`、`當沖量`、`成交額_百萬`、`市值_百萬`、`adj_Open`、`adj_High`、`adj_Low`、`adj_Close`、`adj_Volume`、`漲跌幅` ### 日_指標(7 欄) `市值`、`淨利`、`淨值`、`本益比`、`股價淨值比`、`股本_百萬`、`peg` ### 日_融資券(24 欄) `融券使用率`、`融券買進_張`、`融券買進_千`、`融券賣出_張`、`融券賣出_千`、`融資買進_張`、`融資增減_張`、`融資餘額_張`、`融資維持率`、`融資限額`、`融資使用率`、`融資餘額_千`、`融資成本`、`融券增減_張`、`融券餘額_張`、`融券維持率`、`借券賣出_張`、`借券賣出餘額_張`、`借券賣出餘額_千`、`借券賣還券_張`、`借券餘額_張`、`資券互抵`、`資券互抵_當沖比重`、`券資比` ### 日_三大法人(37 欄) `三大法人買賣超金額_千`、`三大法人持股成本`、`外資買進張數`、`外資賣出張數`、`外資買賣超張數`、`外資買進金額_千`、`外資賣出金額_千`、`外資買賣超金額_千`、`外資持股成本`、`投信買進張數`、`投信賣出張數`、`投信買賣超張數`、`投信買進金額_千`、`投信賣出金額_千`、`投信買賣超金額_千`、`投信持股成本`、`自營買進張數`、`自營賣出張數`、`自營買賣超張數`、`自營買進金額_千`、`自營賣出金額_千`、`自營買賣超金額_千`、`自營持股成本`、`自營避險買賣超_張數`、`自營自行買賣超_張數`、`三大法人買賣超_張數`、`主力買賣超張數`、`主力成本_月均`、`主力成本_季均`、`持股張數_董監`、`持股張數_外資`、`持股張數_投信`、`持股張數_自營`、`發行總張數`、`八大行庫_買賣超張數`、`八大行庫_近一年買賣超占比`、`八大行庫_近一年買賣超張數` ### 日_CAPM(9 欄) `Beta一月`、`Beta二月`、`Beta三月`、`Beta六月`、`Beta九月`、`Beta一年`、`Beta二年`、`Beta三年`、`Beta五年` ### 日_技術指標(15 欄) `bulin_sma`、`bulin_std`、`macd_dif`、`macd_dea`、`macd_hist`、`rsi_5`、`rsi_6`、`rsi_10`、`K`、`D`、`bulin_upper`、`bulin_lower`、`plus_di`、`minus_di`、`ADX` ### 週_K(13 欄) `Volume`、`adj_Volume`、`Open`、`High`、`Low`、`Close`、`成交額_百萬`、`市值_百萬`、`adj_Open`、`adj_High`、`adj_Low`、`adj_Close`、`漲跌幅` ### 週_大小股東持股(47 欄) `張數小於1_人數`、`張數小於1_張`、`張數小於1_比例`、`張數1到5_人數`、`張數1到5_張`、`張數1到5_比例`、`張數5到10_人數`、`張數5到10_張`、`張數5到10_比例`、`張數10到15_人數`、`張數10到15_張`、`張數10到15_比例`、`張數15到20_人數`、`張數15到20_張`、`張數15到20_比例`、`張數20到30_人數`、`張數20到30_張`、`張數20到30_比例`、`張數30到40_人數`、`張數30到40_張`、`張數30到40_比例`、`張數40到50_人數`、`張數40到50_張`、`張數40到50_比例`、`張數50到100_人數`、`張數50到100_張`、`張數50到100_比例`、`張數100到200_人數`、`張數100到200_張`、`張數100到200_比例`、`張數200到400_人數`、`張數200到400_張`、`張數200到400_比例`、`張數400到600_人數`、`張數400到600_張`、`張數400到600_比例`、`張數600到800_人數`、`張數600到800_張`、`張數600到800_比例`、`張數800到1000_人數`、`張數800到1000_張`、`張數800到1000_比例`、`張數1000張以上_人數`、`張數1000張以上_張`、`張數1000張以上_比例`、`集保總人數`、`集保總張數` ### 週_技術指標(16 欄) `bulin_sma`、`bulin_std`、`macd_dif`、`macd_dea`、`macd_hist`、`K`、`D`、`rsi_5`、`rsi_6`、`rsi_10`、`rsi_12`、`bulin_upper`、`bulin_lower`、`plus_di`、`minus_di`、`ADX` ### 月_K(13 欄) `Volume`、`adj_Volume`、`Open`、`High`、`Low`、`Close`、`成交額_百萬`、`市值_百萬`、`adj_Open`、`adj_High`、`adj_Low`、`adj_Close`、`漲跌幅` ### 月_營收(7 欄) `金額_千`、`MoM`、`YoY`、`累積金額_千`、`累積YoY`、`營收創歷史新高`、`營收創歷史新低` ### 月_技術指標(16 欄) `bulin_sma`、`bulin_std`、`macd_dif`、`macd_dea`、`macd_hist`、`K`、`D`、`rsi_5`、`rsi_6`、`rsi_10`、`rsi_12`、`bulin_upper`、`bulin_lower`、`plus_di`、`minus_di`、`ADX` ### 季股利資訊(12 欄) `填權息天數`、`填權息天數_季`、`現金股利`、`現金股利_季`、`股票股利`、`股票股利_季`、`股利合計`、`股利合計_季`、`年殖利率`、`季殖利率`、`除息參考價_季`、`除息日_季` ### 季財報_資產負債表_千(22 欄) `資產_非流動`、`資產_有形`、`資產`、`資產_流動`、`現金`、`庫存`、`固定資產`、`使用權資產`、`資產_無形`、`遞延資產合計`、`負債總額`、`負債_流動`、`負債_非流動`、`合約負債`、`股東權益_總額`、`股東權益_母公司`、`金融資產_流動`、`金融資產_非流動`、`總應收帳款`、`總應付帳款`、`所得稅負債`、`股本` ### 季財報_損益表_千(28 欄) `營業費用`、`營業外收入及支出`、`所得稅費用`、`稅前息前折舊前淨利`、`營業收入`、`營業成本`、`營業毛利`、`研究發展費用`、`營業淨利`、`財務成本`、`稅前純益`、`稅前息前淨利`、`稅後純益`、`歸屬母公司淨利`、`eps`、`本益比`、`銷管費用`、`折舊費用`、`推銷費用`、`攤銷費用`、`管理費用`、`損益表_稅前息前折舊前淨利`、`損益表_稅前息前淨利`、`採用權益法認列之關聯企業及合資損益之份額`、`外幣兌換利益`、`外幣兌換損失`、`業外_外幣兌換淨利益_損失`、`預期信用減損_損失_利益_營業費用` ### 季財報_現金流表_千(29 欄) `自由現金流`、`營運現金流`、`投資現金流`、`籌資現金流`、`資本支出`、`匯率變動對現金之影響`、`折舊及攤提費用`、`償還公司債_CFF`、`償還長期借款_CFF`、`出售投資_CFI`、`利息收現_CFO`、`支付利息_CFF`、`支付利息_CFO`、`支付股利_CFO`、`收到利息_CFI`、`收到股利_CFI`、`新增投資_CFI`、`投資性不動產出售_購買_CFI`、`發行公司債_CFF`、`舉借長期借款_CFF`、`處分不動產廠房設備_含預付_CFI`、`購置不動產廠房設備_含預付_CFI`、`退還_支付_所得稅_CFO`、`無形資產_增加_減少_CFI`、`淨現金流_千`、`自由現金流量_D`、`買_賣按攤銷後成本衡量之金融資產_CFI`、`買_賣透過其他綜合損益按公允價值衡量之金融資產_CFI`、`買_賣透過損益按公允價值衡量之金融資產_CFI` ### 季財報_財務指標(31 欄) `營收季變動率`、`EBITDA利潤率`、`每股營業額`、`每股稅前淨利`、`每股稅後淨利`、`負債淨值比率`、`淨值資產比率`、`營業費用率`、`研究發展費率`、`業外收支營收率`、`營收成長率`、`營業毛利成長率`、`營業利益成長率`、`稅前淨利成長率`、`稅後淨利成長率`、`總資產成長率`、`淨值成長率`、`eps成長率`、`ROA_稅後資產報酬率`、`ROE_稅後權益報酬率`、`營業毛利率`、`營業利益率`、`稅前淨利率`、`稅後淨利率`、`每股淨值`、`存貨週轉率_次`、`流動比率`、`速動比率`、`負債比率`、`存貨週轉率累季_次`、`公告累計EPS_元` ### 其他_籌碼集中(37 欄) `籌碼集中度_1日`、`籌碼集中度_2日`、`籌碼集中度_3日`、`籌碼集中度_4日`、`籌碼集中度_5日`、`籌碼集中度_10日`、`籌碼集中度_20日`、`籌碼集中度_60日`、`籌碼集中度_100日`、`籌碼集中度_120日`、`籌碼集中度_180日`、`籌碼集中度_240日`、`家數差_1日`、`家數差_2日`、`家數差_3日`、`家數差_4日`、`家數差_5日`、`家數差_10日`、`家數差_20日`、`家數差_60日`、`家數差_100日`、`家數差_120日`、`家數差_180日`、`家數差_240日`、`家數和`、`主力買賣超張數_1日`、`主力買賣超張數_2日`、`主力買賣超張數_3日`、`主力買賣超張數_4日`、`主力買賣超張數_5日`、`主力買賣超張數_10日`、`主力買賣超張數_20日`、`主力買賣超張數_60日`、`主力買賣超張數_100日`、`主力買賣超張數_120日`、`主力買賣超張數_180日`、`主力買賣超張數_240日` ### 其他_大盤(12 欄) `買入金額_百萬`、`賣出金額_百萬`、`買賣超金額_百萬`、`成交金額_百萬`、`近一週買入金額_百萬`、`近一週賣出金額_百萬`、`近一週買賣超金額_百萬`、`近一週成交金額_百萬`、`近一月買入金額_百萬`、`近一月賣出金額_百萬`、`近一月買賣超金額_百萬`、`近一月成交金額_百萬` ### TSE(24 欄) `bulin_sma`、`bulin_std`、`Close`、`Open`、`High`、`Low`、`Volume`、`adj_Close`、`adj_Open`、`adj_High`、`adj_Low`、`macd_dif`、`macd_dea`、`macd_hist`、`rsi_5`、`rsi_6`、`rsi_10`、`K`、`D`、`bulin_upper`、`bulin_lower`、`plus_di`、`minus_di`、`ADX` ### OTC(24 欄) `bulin_sma`、`bulin_std`、`Close`、`Open`、`High`、`Low`、`Volume`、`adj_Close`、`adj_Open`、`adj_High`、`adj_Low`、`macd_dif`、`macd_dea`、`macd_hist`、`rsi_5`、`rsi_6`、`rsi_10`、`K`、`D`、`bulin_upper`、`bulin_lower`、`plus_di`、`minus_di`、`ADX` ### TSE_週(24 欄) `bulin_sma`、`bulin_std`、`Close`、`Open`、`High`、`Low`、`Volume`、`adj_Close`、`adj_Open`、`adj_High`、`adj_Low`、`macd_dif`、`macd_dea`、`macd_hist`、`rsi_5`、`rsi_6`、`rsi_10`、`K`、`D`、`bulin_upper`、`bulin_lower`、`plus_di`、`minus_di`、`ADX` ### OTC_週(24 欄) `bulin_sma`、`bulin_std`、`Close`、`Open`、`High`、`Low`、`Volume`、`adj_Close`、`adj_Open`、`adj_High`、`adj_Low`、`macd_dif`、`macd_dea`、`macd_hist`、`rsi_5`、`rsi_6`、`rsi_10`、`K`、`D`、`bulin_upper`、`bulin_lower`、`plus_di`、`minus_di`、`ADX` ### TSE_月(24 欄) `bulin_sma`、`bulin_std`、`Close`、`Open`、`High`、`Low`、`Volume`、`adj_Close`、`adj_Open`、`adj_High`、`adj_Low`、`macd_dif`、`macd_dea`、`macd_hist`、`rsi_5`、`rsi_6`、`rsi_10`、`K`、`D`、`bulin_upper`、`bulin_lower`、`plus_di`、`minus_di`、`ADX` ### OTC_月(24 欄) `bulin_sma`、`bulin_std`、`Close`、`Open`、`High`、`Low`、`Volume`、`adj_Close`、`adj_Open`、`adj_High`、`adj_Low`、`macd_dif`、`macd_dea`、`macd_hist`、`rsi_5`、`rsi_6`、`rsi_10`、`K`、`D`、`bulin_upper`、`bulin_lower`、`plus_di`、`minus_di`、`ADX` --- ## 期貨:`api.MSMP._fut_TXF` **底線開頭、不在上面的 25 張表裡,但這是 SnowyOwl 唯一的期貨資料。** `api.bt.Tools.get_fut_ohlc('TXF', ...)` 底層讀的就是它。 ```python f = api.MSMP._fut_TXF # DataFrame (2570820, 7) ``` | 欄 | 說明 | |---|---| | `DateTime` | 1 分 K 時間。**零重複**——單一「近月連續序列」,不是多合約併排 | | `Open` / `High` / `Low` / `Close` | 點數 | | `TotalVolume` | 口數 | | `settlement` | 這根 K 所屬合約的結算日。共 113 個不同值 | 實測 **2,570,820 列,2017-05-15 08:46 ~ 2026-08-20 13:45(約 9.3 年)**, 含日盤與夜盤。第一次存取會印 `【快取成功】成功讀取 Parquet 並載入記憶體。` 聚合成近月合約日線: ```python g = api.MSMP._fut_TXF.set_index('DateTime') daily = g.resample('D').agg(開盤=('Open','first'), 最高=('High','max'), 最低=('Low','min'), 收盤=('Close','last'), 成交量=('TotalVolume','sum'), 結算日=('settlement','last')).dropna(subset=['開盤']) ``` > 只有台指期 TXF。其他期貨商品、選擇權、海外期貨都**沒有**。 > 各頻率的歷史長度對照見 [data-history.md](data-history.md)。 --- ## 美股(api.USMSMP) 美股沒有 `list`(股池),也沒有大盤指數表。 ### 日_K(8 欄) `Open`、`High`、`Low`、`Close`、`Volume`、`買量`、`賣量`、`資金淨流` ### 週_K(5 欄) `Open`、`High`、`Low`、`Close`、`Volume` ### 月_K(5 欄) `Open`、`High`、`Low`、`Close`、`Volume` ### 季營收(5 欄) `金額_千`、`累計金額_千`、`QoQ`、`累計YoY`、`YoY` ### 季股利資訊(4 欄) `股利合計`、`殖利率`、`股利`、`股利發放率` ### 季財報_資產負債表_千(21 欄) `資產總額`、`資產_流動`、`資產_非流動`、`現金`、`總應收帳款`、`庫存`、`金融資產_流動`、`金融資產_非流動`、`固定資產`、`無形資產合計`、`有形資產合計`、`負債總額`、`負債_流動`、`負債_非流動`、`金融負債_流動`、`金融負債_非流動`、`當期所得稅負債`、`總應付帳款`、`股東權益_總額`、`保留盈餘`、`股東權益_母公司` ### 季財報_損益表_千(15 欄) `稅後純益`、`營業成本`、`營業毛利`、`營業費用`、`銷管費用`、`研發費用`、`營業淨利`、`財務成本`、`營業外收入及支出`、`稅前純益`、`所得稅費用`、`稅後淨利`、`稅前息前淨利`、`稅前息前折舊前淨利`、`營業收入` ### 季財報_現金流表_千(9 欄) `營運現金流`、`投資現金流`、`籌資現金流`、`淨現金流`、`匯率變動對現金之影響`、`淨現金流含匯率變動`、`折舊及攤提費用`、`資本支出`、`自由現金流` ### 季財報_財務指標(30 欄) `本益比`、`營業毛利成長率`、`營業利益成長率`、`稅前淨利成長率`、`稅後淨利成長率`、`總資產成長率`、`淨值成長率`、`營業利益率`、`稅前純益率`、`稅後資產報酬率`、`毛利率`、`研究發展費用率`、`稅後純益率`、`營業費用率`、`稅後權益報酬率`、`股價營收比`、`股價淨值比`、`企業價值對EBIT比率`、`企業價值對EBITDA比率`、`每股銷售額`、`累計存貨週轉率_次`、`存貨週轉率_次`、`每股淨值`、`淨值資產比率`、`速動比率`、`流動比率`、`負債比率`、`每股稅後盈餘`、`EPS成長率`、`營收季變動率` ### 季財報_其他(9 欄) `公告EPS`、`公告累計EPS`、`投資人投入資本`、`營運資金`、`財報發布日`、`股價`、`市值`、`股數_千`、`EV企業價值` ==================================================================================================== # MSMP.list 股池 > 所屬章節:MSMP 歷史資料 > 以 2026-08-20 實際執行結果為準 ## Overview `api.MSMP.list` 是股票分群的 dict,value 是股票代號 list。 `api.Block.screener_tw(pool=...)` 的股池名稱就是這裡的 key。 ```python api.MSMP.list['tse'] api.MSMP.get('list', 'tse') # 等價 ``` ## Manual Sample Input/Output ### Example 1:所有股池與檔數 #### input ```python {k: len(v) for k, v in api.MSMP.list.items()} ``` #### output ```text {'all': 2873, 'tse': 1125, 'otc': 923, 'esm': 412, 'etf': 382, 'KY': 143, 'DR': 14, 'delist': 145} ``` | key | 說明 | |-----|------| | `all` | 全市場(含已下市) | | `tse` | 上市 | | `otc` | 上櫃 | | `esm` | 興櫃 | | `etf` | ETF | | `KY` | KY 股(外國企業來台上市) | | `DR` | 存託憑證 | | `delist` | 已下市 | --- ### Example 2:成員內容 #### input ```python api.MSMP.list['etf'][:5] ``` #### output ```text ['00400A', '00401A', '00402A', '00403A', '00404A'] ``` --- ### Example 3:搭配矩陣做篩選 `list` 的值可以直接拿去切矩陣的 columns: ```python close = api.MSMP.日_K.adj_Close tse_only = close.loc[:, close.columns.isin(api.MSMP.list['tse'])] ``` 要「全市場排除 ETF」: ```python mask = ~close.columns.isin(api.MSMP.list['etf']) no_etf = close.loc[:, mask] ``` 積木的 `pool=['all', '~etf']` 做的就是這件事,見 [Block 股池](block-pool.md)。 --- ## 注意 `all` 目前含**一個重複代號**:2873 筆但只有 2872 個不同代號,`'7834'` 出現兩次。 #### input ```python lst = api.MSMP.list['all'] len(lst), len(set(lst)) ``` #### output ```text (2873, 2872) ``` 用 `isin()` 篩選不受影響(重複不改變集合語意),但**不要直接拿它當 DataFrame 的 columns**,否則後續任何 reindex 都會拋錯: ```text InvalidIndexError: Reindexing only valid with uniquely valued Index objects ``` 需要當 columns 用時先去重(保持原順序): ```python symbols = list(dict.fromkeys(api.MSMP.list['all'])) ``` 美股沒有 `list`: #### input ```python hasattr(api.USMSMP, 'list') ``` #### output ```text False ``` ==================================================================================================== # USMSMP 美股矩陣資料 > 所屬章節:MSMP 歷史資料 > 以 2026-08-21 實際執行結果為準(台股資料日 2026-08-20、美股 2026-08-19) > 10 張表的形狀與期間都是實測值 ## Overview `api.USMSMP` 與 `api.MSMP` 是同一個類別(`_MSMP`),用法完全相同, 但**表格較少、沒有股池與大盤指數,而且各頻率的歷史長度規則和台股不一樣**。 ```python api.USMSMP.日_K.Close api.USMSMP.get('日_K', 'Close') ``` ## 與台股 MSMP 的差異 | 成員 | `api.MSMP`(台股) | `api.USMSMP`(美股) | |---|---|---| | 資料表數 | 25 | 10 | | `list`(股池) | 有(8 個) | **沒有** | | `INFO` | 有 | **沒有** | | `INDEX` | 有(D / M / Q) | **沒有** | | 大盤指數 `TSE` / `OTC` | 有 | **沒有** | | 期貨 `_fut_TXF` | 有 | **沒有** | | `get` / `get_table` / `DataFrame` / `msmp_to_dic` | 有 | 有 | --- ## 10 張表:欄位、形狀與期間 | 表 | 欄數 | 形狀 | 期間 | 約幾年 | |---|---|---|---|---| | `日_K` | 8 | (1000, 13174) | 2022-08-24 ~ 2026-08-19 | 4.0 | | `週_K` | 5 | (235, 13175) | 2022-02-21 ~ 2026-08-17 | **4.5** | | `月_K` | 5 | (49, 13174) | 2022-08-01 ~ 2026-08-01 | **4.0** | | `季營收` | 5 | (111, 5801) | 1998-Q4 ~ 2026-Q2 | **27.8** | | `季股利資訊` | 4 | (34, 5809) | 1993-Y ~ 2026-Y | **34** | | `季財報_資產負債表_千` | 21 | (111, 5801) | 1998-Q4 ~ 2026-Q2 | 27.8 | | `季財報_損益表_千` | 15 | (111, 5801) | 同上 | 27.8 | | `季財報_現金流表_千` | 9 | (111, 5801) | 同上 | 27.8 | | `季財報_財務指標` | 30 | (111, 5801) | 同上 | 27.8 | | `季財報_其他` | 9 | (111, 5801) | 同上 | 27.8 | ### 台股的「降頻拿長歷史」在美股不成立 台股的週/月 K 回溯 11.7 年,比日 K 的 4.1 年長得多,所以問「近十年」可以降頻。 **美股不行**——週 K 只有 4.5 年、月 K 只有 4 年,跟日 K 差不多。 | 問「近 N 年」 | 台股 | 美股 | |---|---|---| | 四年內 | 日頻 | 日頻 | | 五 ~ 十年 | 週/月頻(11.7 年) | **只能用季財報**(27.8 年);價格資料沒有 | | 十年以上 | 月營收(16.6 年) | 季財報(27.8 年)、年股利(34 年) | > **美股要長期股價就沒辦法。** 價格類(日/週/月 K)最多 4.5 年。 > 長歷史只存在於**財報與股利**這兩塊。台股版的對照見 [data-history.md](data-history.md)。 ### 覆蓋的股票數也不同 價格類 **13174 檔**,財報類只有 **5801 檔**(股利 5809)。 跨表運算後一定要 `.dropna()`,否則會拿到一堆 NaN: ```python U = api.USMSMP per = U.季財報_財務指標.本益比 # (111, 5801) close = U.日_K.Close # (1000, 13174) # 兩者頻率與欄位都不同,不能直接相除 ``` --- ## 各表的欄位 ```text 日_K Open High Low Close Volume 買量 賣量 資金淨流 週_K / 月_K Open High Low Close Volume 季營收 金額_千 累計金額_千 QoQ YoY 累計YoY 季股利資訊 股利 股利合計 股利發放率 殖利率 季財報_損益表_千 營業收入 營業成本 營業毛利 營業費用 銷管費用 研發費用 營業淨利 營業外收入及支出 財務成本 稅前純益 稅前息前淨利 稅前息前折舊前淨利 所得稅費用 稅後純益 稅後淨利 季財報_現金流表_千 營運現金流 投資現金流 籌資現金流 自由現金流 淨現金流 淨現金流含匯率變動 匯率變動對現金之影響 折舊及攤提費用 資本支出 季財報_其他 股價 市值 股數_千 公告EPS 公告累計EPS 財報發布日 EV企業價值 營運資金 投資人投入資本 季財報_財務指標(30) 本益比 股價淨值比 股價營收比 每股淨值 每股稅後盈餘 每股銷售額 毛利率 營業利益率 稅前純益率 稅後純益率 稅後權益報酬率 稅後資產報酬率 負債比率 流動比率 速動比率 淨值資產比率 營業費用率 研究發展費用率 存貨週轉率_次 累計存貨週轉率_次 企業價值對EBIT比率 企業價值對EBITDA比率 EPS成長率 營收季變動率 營業毛利成長率 營業利益成長率 稅前淨利成長率 稅後淨利成長率 總資產成長率 淨值成長率 ``` `季財報_資產負債表_千` 的 21 欄見 [msmp-tables.md](msmp-tables.md) 的美股段落。 --- ## Manual Sample Input/Output ### Example 1:公開成員 #### input ```python [n for n in dir(api.USMSMP) if not n.startswith('_')] ``` #### output ```text ['DataFrame', 'get', 'get_table', 'msmp_to_dic', '季營收', '季股利資訊', '季財報_其他', '季財報_損益表_千', '季財報_現金流表_千', '季財報_財務指標', '季財報_資產負債表_千', '日_K', '月_K', '週_K'] ``` 台股獨有的 `INFO`、`INDEX`、`list`、`TSE`、`OTC`、`_fut_TXF` 都不在這裡。 --- ### Example 2:矩陣長相 #### input ```python api.USMSMP.日_K.Close.iloc[-3:, :6] ``` #### output ```text DataFrame shape: (1000, 13174) A AA AAA AAAA AAAC AAAD date 2026-08-14 148.5300 49.9800 24.9600 30.9670 20.0950 49.5900 2026-08-17 148.4500 51.7100 24.9500 30.9550 20.0900 49.4950 2026-08-18 148.4400 50.0200 24.9500 30.7000 20.0950 49.4653 ``` 美股矩陣寬 13174 檔(台股 2866)。`日_K` 比台股多了 `買量` / `賣量` / `資金淨流` 三欄, 但沒有台股的 `adj_*` 還原價、`成交額_百萬`、`市值_百萬`、`漲跌幅`。 > **美股沒有 `漲跌幅` 欄**,要自己算:`U.日_K.Close.pct_change() * 100`。 --- ### Example 3:財報(美股最有價值的一塊) `年季` 是字串(`'2026-Q2'`),不是日期——排序與篩選用字串比較。 #### input ```python U = api.USMSMP rev = U.季財報_損益表_千.營業收入['AAPL'].dropna() {i: f'{v / 1e6:.1f} 十億' for i, v in rev.tail(4).items()} ``` #### output ```text {'2025-Q3': '102.5 十億', '2025-Q4': '143.8 十億', '2026-Q1': '111.2 十億', '2026-Q2': '109.4 十億'} ``` > **單位是千(美元)**,`÷ 1e6` 得十億美元。所有 `_千` 結尾的表都一樣。 常用組合: ```python U.季財報_財務指標.本益比['AAPL'] # PER 時間序列,回溯到 1998 U.季財報_財務指標.稅後權益報酬率['AAPL'] # ROE U.季財報_現金流表_千.自由現金流['AAPL'] # FCF U.季財報_其他.財報發布日['AAPL'] # 做回測時用它避開前視偏誤 U.季股利資訊.殖利率['AAPL'] # 年頻,回溯到 1993 ``` **做回測要用 `財報發布日` 而不是 `年季`**——`2026-Q2` 的財報不是 Q2 結束當天就知道的。 --- ### Example 4:沒有股池的後果 因為沒有 `list`,積木的美股 screener 不開放 `pool`: #### input ```python api.Block.screener_us(block_list, pool=['all']) ``` #### output ```text TypeError: Block.screener_us() got an unexpected keyword argument 'pool' ``` 要限定範圍請自己切 columns: ```python r = api.Block.screener_us([b]) watch = ['AAPL', 'MSFT', 'NVDA'] sub = r['sig'].loc[:, r['sig'].columns.isin(watch)] ``` 要按產業或市值篩,用 `api.USData.get('美股產業對照表')`(13187 列, 含 `粗產業名稱` / `細產業名稱` / `是否為ETF` / `市值(美元)`)先取代號清單。 見 [usdata.md](usdata.md)。 --- ### Example 5:資料日期比台股晚一天 實測(2026-08-21 執行): ```text api.MSMP 最後日期 = 2026-08-20 api.USMSMP 最後日期 = 2026-08-19 ``` 時區與結算的差異造成的。所以 `screener_tw` 與 `screener_us` 的 `date` **不會相同**, 不要假設一致——跨市場比較前先各自取 `index[-1]` 對齊。 --- ## 注意 - **沒有 `漲跌幅` 欄**,自己用 `Close.pct_change() * 100` 算。 - **價格類最多 4.5 年**,長歷史只有財報(27.8 年)與股利(34 年)。 - **財報覆蓋 5801 檔、價格覆蓋 13174 檔**,跨表運算後要 `.dropna()`。 - `_千` 結尾的欄位單位是千美元,`÷ 1e6` 得十億。 - 成交量 `Volume` 的單位是**股**(美股沒有「張」的概念)。 - 表格式查詢(單檔完整財報、分K、明細)用 [api.USData](usdata.md),25 張表。 ==================================================================================================== # 回測 api.bt(backtest_plus) > 所屬章節:回測 > 以 2026-08-20 實際執行結果為準 ## Overview `api.bt` 是 backtest_plus,在登入時綁定(`main.py` 的 `self.bt = _bt(self)`)。 ```python api.bt.Core() # 策略類別 api.bt.Tools # 工具集 api.bt.config(...) # 商品/成本設定 api.bt.generate_report(...) # 產生績效報告 ``` 回測的完整說明分五頁: | 頁 | 內容 | |---|---| | 本頁 | `api.bt` 的綁定方式、**用積木訊號回測**(單檔與組合) | | [事件模型與策略撰寫](backtest-strategy.md) | 標準骨架、一根 bar 內的執行順序、`row` 完整欄位、`Position` / `Order`、狀態屬性與 `stats`、檢查清單、會出錯的事 | | [委託、成交價與風控](backtest-order.md) | `Condition.Global`、五種委託型別、**成交價規則實測表**、四個停損停利方法 | | [資料與週期](backtest-data.md) | `feed_data` / `feed_tick_df` / `feed_tick`、`freq` 聚合、`bt.Tools` 取歷史資料、時序管控 | | [商品規格與績效報告](backtest-report.md) | `bt.config` 的成本設定(含 `tax_long`/`tax_short` 的陷阱)、`generate_report`、四張報表的欄位定義 | | [技術指標與參數尋優](backtest-tools.md) | `self.Ind` 25 個增量指標、`bt.Tools.optimize` | 這頁只記 `api.bt` 的綁定方式,以及積木訊號怎麼餵進回測。 ## Manual Sample Input/Output ### Example 1:公開成員 #### input ```python [n for n in dir(api.bt) if not n.startswith('_')] ``` #### output(回測會用到的四個) ```text ['Core', 'Tools', 'config', 'generate_report'] ``` #### input ```python import inspect print(inspect.signature(api.bt.config)) print(inspect.signature(api.bt.generate_report)) ``` #### output ```text (name: str = 'strategy', symbol: str = 'symbol', tax_long: float = 0, tax_short: float = 0, daytrade_discount: float = 1, fee: float = 0, unit: int = 1, margin_long: float = 1, margin_short: float = 1, lot_size: str = 'inf,0,floor,1') -> None (core_dic: dict, margin_call: bool = False, capital=1000000, benchmark=None) ``` --- ### Example 2:api.bt 的型態 #### input ```python type(api.bt).__name__ ``` #### output ```text SecureMain ``` `backtest_plus` 這個套件用了一個技巧:它在 `__init__.py` 裡把模組物件換成一個 繼承 `SecureMain` 的 `CallableModule` 實例並塞回 `sys.modules`, 所以 `backtest_plus(api)` 這種「呼叫模組」的寫法可行,同時 `.core`、`.generate_report`、`.other` 等子模組屬性照樣存取得到(2026-10 起套件分成 `core/` 回測引擎、`generate_report/` 帳務與報表、`other/` 工具三塊;舊的 `utils` 已拆掉)。`api.bt` 就是 `backtest_plus(api)` 的結果。 這代表:如果你在 SnowyOwl 之外自己 `import backtest_plus`,拿到的不是普通模組, 而是那個 callable 代理物件。 --- ### Example 3:積木 sig 餵進 Core(單檔) **日 K 也從 MSMP 取,不要用 `bt.Tools.get_stock_ohlc`。** `sig` 是日頻矩陣(來自 MSMP 日_K),而 `get_stock_ohlc` 是下載約 4 年 1 分 K 再 resample。 頻率對不上,還多一次大量下載。兩邊都取 MSMP 日頻時日期 index 天然完全對齊, 不需要 reindex/ffill。 #### input ```python import pandas as pd def daily_bars(api, symbol): k = api.MSMP.日_K zh2en = {'開盤價':'Open','最高價':'High','最低價':'Low','收盤價':'Close','成交量':'Volume'} df = pd.DataFrame({zh: getattr(k, en)[symbol] for zh, en in zh2en.items()}) df.index.name = 'DateTime' return df.reset_index() SYM = '2330' r = api.Block.screener_tw([api.Block.con_tw('今日收盤價<>D日(周月)均線', period=20, table='日_K')]) bars = daily_bars(api, SYM) bars['sig'] = bars['DateTime'].map(r['sig'][SYM]).fillna(False) class BlockStrategy(api.bt.Core): def on_bar(self, row): if row['sig'] and self.global_qty == 0: self.Condition.Global(True, 1, 0, self.PriceType.market_ioc, None, 'bk') elif not row['sig'] and self.global_qty > 0: self.Condition.Global(True, -self.global_qty, 0, self.PriceType.market_ioc, None, 'bp') core = BlockStrategy() core.feed_data(bars, ['DateTime','開盤價','最高價','最低價','收盤價','成交量'], columns=['sig']) # 額外欄位一定要宣告,否則 row 裡沒有 cfg = api.bt.config(name=f'block_{SYM}', symbol=SYM, fee=0.001425, tax_long=0, tax_short=0.003, unit=1000) rp = api.bt.generate_report({cfg: core}, capital=1_000_000) print(rp.report.to_string()) ``` #### output ```text Strategy StartDate 2022-08-29 EndDate 2026-08-20 BacktestDate 2026-08-21 TotalReturns -0.1131 CAGR -0.0309 AAR -0.0296 MaxDrawdown -0.1955 MddDuration 1149 CalmarRatio -0.1580 SharpeRatio -0.7078 SortinoRatio -0.9197 AnnualisedVolatility 0.0655 WinRate 0.3300 ProfitLossRatio 0.3900 Invest 2682802 NetProfit -303378 MaxPosition 2443477 TotalTrades 51 ProfitTimes 17 LossTimes 34 TradeCost 325378 AvgProfitPerTrade -5949 AvgCashUtilizationRate 0.0502 WeeklyReturn 0.00% MonthlyReturn -3.39% QuarterlyReturn -3.94% AnnualReturn -6.26% ``` > 上面的輸出是 2026-08-20 版本。2026-10 起 `MaxDrawdown` 改名 **`MddRatio`**,並在它下面新增 **`MddAmount`**(最大回撤金額),KPI 共 28 項,定義見 [backtest-report.md](backtest-report.md)。 `sig` 與 bars 的 index 完全對齊(`bars['sig'].notna().all()` 為 `True`), 1000 個交易日中訊號成立 52 天。 #### 報表產出 | 屬性 | 型態 | 內容 | |------|------|------| | `rp.report` | DataFrame | 28 項績效。`Strategy` 欄是合併視角;多策略時每個 `config.name` 再各一欄 | | `rp.trade_detail` | DataFrame | 逐筆交易,21 欄,含 `name`/`symbol`/`direction`/`pnl`/`cost` | | `rp.trade_main` | DataFrame | 委託層級,進出各一列 | | `rp.position` | DataFrame | 部位變化 | | `rp.daily` | DataFrame | 每日權益曲線,13 欄(含 `dd` 每日回撤金額) | | `rp.daily_close` | DataFrame | 每日收盤價 | | `rp.dashboard()` | method | 產出互動 HTML 報表(總覽/績效分析/交易明細/個股分析四頁) | | `rp.save(path=None)` | method | 存成一個 xlsx,六個 sheet(report / daily / trade_main / trade_detail / 個股績效 / 進出場規則績效) | | `rp.set_benchmark(series)` | method | 設對照基準 | **沒有 `rp.trade`**——逐筆交易在 `rp.trade_detail`。 --- ### Example 4:組合回測(多檔共用一份資金池) `Core` 是單商品設計(沒有多商品餵入的方法), 組合是在**報表層**組起來的:N 檔就開 N 個 core,`generate_report` 收一個 `{config: core}` 的 dict。 **但關鍵是下單方式**:`generate_report/pnl.py` 的 `_make_tradeX` 在「所有交易都是固定口數」時會走 向量化路徑,`capital` 完全不參與計算。也就是說用 `qty=1` 跑組合時 `capital` 是惰性參數,`TotalReturns` 其實是 `NetProfit / Invest`, `MaxPosition` 可以是 `capital` 的數倍——那不是組合報酬。 要讓 `capital` 真的生效,必須用**百分比下單**(`qty < 1`,代表佔資金池的比例): ``` raw = capital * qty / margin # generate_report/pnl.py 的 _make_tradeX_loop capital = 起始資金 + entry_time 之前已實現的損益 ``` #### input ```python import sys; sys.path.insert(0, 'mcp') # snowyowl/mcp from snowyowl_mcp import backtest as BT con = api.Block.con_tw('今日收盤價<>D日(周月)均線', period=20, table='日_K') rp = BT.run(api, [con], ['2330','2317','2454','1301','2882'], capital=10_000_000) print(rp.snowyowl_weight) # 沒指定 weight 時自動 = 1/檔數 print(rp.report.to_string()) ``` #### output ```text Strategy 2882 2454 2330 2317 1301 StartDate 2022-08-08 2022-08-08 2022-08-16 2022-08-29 2022-08-29 2022-10-05 EndDate 2026-08-20 2026-08-20 2026-08-20 2026-08-20 2026-08-20 2026-08-20 TotalReturns -0.3831 -0.2057 -0.2593 -0.1108 -0.1673 -0.2984 CAGR -0.1169 -0.0576 -0.0748 -0.0302 -0.0467 -0.0908 MaxDrawdown -0.4224 -0.2494 -0.4092 -0.1527 -0.2665 -0.3905 SharpeRatio -2.2134 -1.3462 -1.1726 -0.6771 -0.8080 -1.1268 WinRate 0.2900 0.3200 0.2700 0.2700 0.3300 0.2600 TotalTrades 275 50 55 51 58 61 Invest 6313784 2345697 2425945 2177725 2443720 2693857 NetProfit -2418864 -482478 -628932 -241332 -408770 -803958 TradeCost 2467914 568428 439932 408332 639270 677058 MaxPosition 5503431 2013065 1874668 1990833 1978816 1997242 AvgCashUtilizationRate 0.0779 0.0468 0.0386 0.0362 0.0512 0.0547 (27 項只截這幾項,完整同 Example 3。這是 2026-08-20 版本的輸出,現在 `MaxDrawdown` 叫 `MddRatio`,另有 `MddAmount`) ``` **`Strategy` 欄才是組合**——把所有 name 的交易按時序合併、共用一份 `capital` 重算。 其餘各欄是「該檔獨佔全部資金」的單獨視角,所以**逐檔加總不等於 `Strategy`** (實測逐檔 `Invest` 加總 12,086,944 vs `Strategy` 的 6,313,784)。 > **先看成本再看報酬。** 這組 MA20 訊號的組合,扣成本前的毛損益是 **+49,050**, > 交易成本 **2,467,914**(275 筆,佔投入資金 39%)。也就是說 -38.3% 這個數字 > 幾乎完全是成本,不是策略判斷錯誤——日頻訊號進出太頻繁。 > 單檔 2330 也一樣:毛損益 +22,000、成本 325,378。 --- ### Example 5:三個會咬人的地方 #### 1. `tax_long` / `tax_short` 其實是「進場稅」與「出場稅」 `generate_report/pnl.py` 的 `_make_tradeX` 成本公式: ```python cost = qty * unit * ( entry_price*(tax_long+fee) + exit_price*(tax_short+fee) ) ``` `tax_long` 乘的是**進場價**、`tax_short` 乘的是**出場價**,**與多空方向無關**。 台股證交稅只在賣出收,所以正確設法是 `tax_long=0, tax_short=0.003` ,也就是**台股只要填 `tax_short`**,`tax_long` 保持預設的 0。完整的成本設定對照見 [backtest-report.md](backtest-report.md)。 | 標的 | 設法 | |---|---| | 台股個股 | `fee=0.001425, tax_long=0, tax_short=0.003, unit=1000` | | 台股 ETF | 同上但 `tax_short=0.001` | | 台指期 | `fee=500, tax_long=0.00002, tax_short=0.00002, unit=200` | | 美股 | `fee=0, tax_long=0, tax_short=0, unit=1` | #### 2. `capital` 不扣未平倉部位佔用的資金 `capital` 只累加**已實現**損益(`Capital[exit_time] += pnl`), 當前開著的部位不會從可用資金裡扣掉。所以 N 檔同時進場時, 每一檔都拿「同一份 capital」的 `weight` 去算口數, `weight × 同時持有檔數` 若 > 1 就是**隱性槓桿**。 `BT.run` 預設 `weight = 1/檔數` 就是為了避開這件事。 #### 3. 部位被夾成 0 張時,錯誤訊息會誤導 `lot_size` 預設 `'inf,0,floor,1'`,`capital × weight` 買不起一張時 `floor` 會把口數變 0。**全部**被夾掉時每日損益全為 0, `make_daily` 會拋: ```text RuntimeError: make_daily: 每日損益全為 0,無法產生報表。 常見原因是 pandas / numpy 版本不相容導致索引對不起來,... ``` 實務上最常見的原因不是版本,而是資金不夠買一張(台股一張 1000 股)。 `BT.run` 已攔下這個例外改成正確說明。 --- ## 注意 - `api.bt` 需要有效 token(登入時印 `Token無效` 就不會掛上)。 - 回測用的 dashboard 資產(plotly、CSS、JS)在 `snowyowl/backtest_plus/generate_report/dashboard/assets/`, `DASHBOARD_VERSION = "2.0.0"`。 ==================================================================================================== # 回測:事件模型與策略撰寫 > 所屬章節:回測 > 事件順序、`row` 欄位、`on_init` 下單的錯誤、完全平倉的行為皆以合成資料實測驗證(2026-08-21) 理解執行順序是寫策略的前提——它決定了送出的委託何時成交。 ## 標準骨架 ```python import numpy as np import snowyowl as so api = so.login('user@x.com', 'pwd') bt = api.bt df = bt.Tools.get_stock_ohlc('2330', freq=60, adj=False) class MyStrategy(bt.Core): def on_init(self): # 1) 參數:要被 optimize 尋優的都放這裡,命名成 self.xxx self.n_fast, self.n_slow = 5, 20 self.stl, self.pft = 1.0, 2.0 # 2) 狀態容器 self.close_list = [] # 3) 期貨要改最小跳動單位(預設是股票規格) # self.tick_map = [(np.inf, 1)] def my_indicators(self, row): self.close_list.append(row['Close']) fast = self.Ind.rolling_mean(self.close_list, self.n_fast) slow = self.Ind.rolling_mean(self.close_list, self.n_slow) self.char['fast'] = fast[-1] # 存進 char 才會畫在 show_monitor 與 dashboard 的 K 線 self.char['slow'] = slow[-1] if len(self.close_list) < self.n_slow: return False, False # 暖身期不下單 return fast[-1] > slow[-1], fast[-1] < slow[-1] def on_bar(self, row): long_sig, short_sig = self.my_indicators(row) self.Condition.Global(long_sig and self.global_qty == 0, 1, 0, self.PriceType.market_ioc, None, 'bk') self.Condition.Global(short_sig and self.global_qty > 0, -self.global_qty, 0, self.PriceType.market_ioc, None, 'bp') # 風控:每根都要重掛,不要包在 if 裡 self.Condition.set_STL('bk', self.stl) self.Condition.set_PFT('bk', self.pft) core = MyStrategy() core.feed_data(df) cfg = bt.config(symbol='2330', fee=0.001425, tax_long=0, tax_short=0.003, unit=1000) rp = bt.generate_report({cfg: core}) print(rp.report) ``` --- ## 事件方法 ```python class MyStrategy(bt.Core): def on_init(self): """策略建立時呼叫一次。只初始化參數與狀態,不能下單。""" def on_bar(self, row): """主商品 base 週期(freq[0])K 棒收盤時觸發。主要下單邏輯寫這裡。 row 是當根收盤 K 棒的 dict,等同 self.row_list[-1]。""" def on_bar2(self, row): """主商品第 2 週期(freq[1])收盤時觸發,純訊號、不觸發撮合。 通常算高週期指標存成 self.xxx,下單邏輯仍寫在 on_bar。 有第 3 個週期就是 on_bar3,依此類推。""" def on_intrabar(self, row): """K 棒收盤前、盤中價格變動時觸發(每筆 tick 一次)。 row 是正在形成中、尚未收盤的那根 bar。""" def on_position(self, P): """倉位變動時觸發:開倉、加倉、部分平倉。 完全平倉「不會」觸發。常見用法:以 match_uid=P.uid 為每筆持倉掛專屬出場單。""" def on_other(self, row): """對標商品 base 週期收盤時觸發,純訊號。多週期依序觸發 on_other2 / on_other3。""" ``` `on_bar2` / `on_bar3` / `on_other*` **只有走 `set_tick_period` + `feed_tick_df` 才會觸發**, `feed_data` 不經過週期聚合系統。詳見 [資料與週期](backtest-data.md)。 --- ## 一根 bar 內的執行順序 引擎處理每根 bar 的固定順序: ```text 1. 更新未實現損益 (重算 global_unrealized_point、每筆持倉的 max_earn / max_loss) 2. 撮合既有掛單 (用「這一根」的 OHLC 判斷上一根掛出去的單有沒有成交) └─ 有成交 → 觸發 on_position 3. on_bar(row) (你的下單邏輯;這裡送出的委託要等下一根才會被撮合) 4. 依 Condition.Global 的呼叫順序排定委託優先序 5. on_intrabar(row) ``` 實測(bar 0 下市價買單,三根日線): ```text on_bar(index=0) → on_intrabar(index=0) → on_position(rule=bk, index=1) ← 在 index 1 的開盤價成交 → on_bar(index=1) → on_intrabar(index=1) → on_bar(index=2) → on_intrabar(index=2) ``` 由此得到三條**設計策略時一定要知道**的規則: | 規則 | 意義 | |---|---| | **在 `on_bar` 下的單,最快在「下一根」成交** | 沒有「當根收盤價成交」這回事。`market_ioc` 以**下一根開盤價**成交 | | **`on_position` 在 `on_bar` 之前觸發** | 成交發生在撮合階段(步驟 2),所以同一根裡 `on_position` 先跑、`on_bar` 後跑 | | **停損停利要每根重掛** | `set_STL` 等是「依當前持倉重算出場價、更新掛單」,不呼叫就不會更新 | 多週期時同一筆資料的觸發順序:**先所有子週期訊號(`on_bar2` / `on_bar3`…), 最後才是 base 週期**(走帳務的 `on_bar`)。對標商品(`on_other`)在同一時點**先於**主商品。 --- ## `row` 的完整欄位 實測 `feed_data` 的 `row` key(含一個自訂欄位 `mysig`): ```text ['DateTime', 'Open', 'High', 'Low', 'Close', 'Volume', 'mysig', 'time', 'ts', 'char', 'char1', 'index'] ``` | key | 說明 | |---|---| | `DateTime` | 這根 K 棒的**收盤時間**(`pd.Timestamp`) | | `Open` / `High` / `Low` / `Close` / `Volume` | 開高低收量。**注意 key 是英文**,即使 `feed_data` 傳的是中文欄名 | | `index` | bar 序號,從 0 開始,等同在 `row_list` 中的位置 | | `ts` | `DateTime` 的 epoch 秒(float),內部彙總用 | | `time` | 14 碼字串 `'YYYYMMDDHHMMSS'` | | `char` / `char1` | 主圖/副圖指標暫存 dict,等同 `self.char` / `self.char1` | | `Settlement` | 該筆所屬的結算日。`feed_tick_df` 且 `need_settlement=True` 時有;`feed_data` 要靠 `columns=['Settlement']` 帶入 | | 你自訂的欄位 | 由 `columns=[...]` 指定帶入(例如外部算好的訊號欄) | > **`feed_data(df, args=[...中文欄名...])` 只是告訴引擎哪一欄是哪一個角色, > `row` 裡的 key 一律是英文** `Open`/`High`/`Low`/`Close`/`Volume`。 > 額外欄位(`columns=[...]`)則保留原本的欄名。 `feed_tick_df` 的 key 順序略有不同: `['time','Open','High','Low','Close','Volume', , 'DateTime','Settlement','index','ts','char','char1']` > 判斷是否為結算日的標準寫法:`row['DateTime'] == row['Settlement']` --- ## 資料結構 ### Position(`on_position` 的 `P`、`core.positions` 的 value) | 欄位 | 說明 | |---|---| | `index` | 進場的 bar 索引 | | `entry_time` | 進場時間 | | `entry_qty` | 原始進場數量 | | `entry_price` | 進場價格 | | `max_earn` | 這筆持倉期間的最高獲利(點數) | | `max_loss` | 這筆持倉期間的最大虧損(點數) | | `rule` | 造成進場的規則名稱 | | `unrealized_pnl` | 當前未實現損益 | | `current_qty` | 當前剩餘數量(部分平倉後小於 `entry_qty`) | | `uid` | 這筆持倉的唯一識別碼,出場單用 `match_uid=P.uid` 綁定 | ### Order(`core.orders` 的 value) `index`、`rule`、`datetime`、`add_qty`、`trade_price`、`trade_type`、`uid`、`match_uid`。 `core.orders` 的 key 是 `(rule, match_uid)`。 --- ## 狀態屬性 策略內可直接讀。**損益以點數計、未含稅費**;要真實金額請看 `generate_report` 的報表。 | 屬性 | 說明 | |---|---| | `self.global_qty` | 全域總持倉。正=多、負=空、`0`=空手 | | `self.global_realized_point` | 全域已實現損益(點數,不含稅費) | | `self.global_unrealized_point` | 全域未實現損益(隨行情浮動) | | `self.positions` | 持倉字典,key = `uid`,value = `Position` | | `self.orders` | 未成交/未取消的委託,key = `(rule, match_uid)` | | `self.row_list` | 所有已收盤 K 棒的 dict 列表;`row_list[-1]` 即當根 | | `self.row` | 當前 bar 的 dict(永遠等於 `row_list[-1]`) | | `self.stats` | 依規則名累計的統計,見下 | | `self.char` / `self.char1` | 主圖/副圖指標暫存 dict。寫進去的數值會畫在 `show_monitor()` 與 `rp.dashboard()` 個股分析的 K 線上(`char` 疊在主圖、`char1` 畫在副圖;名稱含 `hist` 的畫柱狀) | | `self.tick_map` | 最小跳動單位表 `[(價格上限, tick), ...]`。預設是股票規格 `[(10,0.01),(50,0.05),(100,0.1),(500,0.5),(1000,1.0),(inf,5.0)]`;台指期要在 `on_init` 設 `[(np.inf, 1)]` | | `self.PriceType` | 委託類型常數 | | `self.Condition` | 條件式下單入口 | | `self.Ind` | 技術指標工具箱(類別屬性,所有策略共用同一份) | | `core.log` | 委託生命週期 DataFrame,`type` 欄是 `new` / `update` / `cancel` / `deal` | ### self.stats `self.stats['規則名']` 會自動建立一個統計盒: | 欄位 | 說明 | |---|---| | `open_count` | 進場次數 | | `open_qty` | 累計進場口數 | | `close_count` | 平倉次數 | | `current_qty` | 目前剩餘口數 | | `realized_pnl` | 該規則累計已實現損益(點數) | | `continue_wins` | 連勝/連敗:正數=連勝、負數=連敗,勝敗切換時歸 ±1 | | `records` | `{出場規則名: [次數, 口數, pnl]}` | **常態用法是在策略內部讀 `self.stats`**,依戰績調整下一筆的口數: ```python class WinStreak(bt.Core): def on_init(self): self.base_qty = 1 def on_bar(self, row): wins = self.stats.get('bk', {}).get('continue_wins', 0) qty = self.base_qty * 2 if wins >= 2 else self.base_qty # 連勝 2 次就加倍 if row['sig'] and self.global_qty == 0: self.Condition.Global(True, qty, 0, self.PriceType.market_ioc, None, 'bk') ``` 實測(2330、MA20 訊號、1000 個交易日):52 次進場中有 **13 次**因連勝被放大到 2 張, `rp.trade_detail` 的 `qty` 分布是 `{1: 38, 2: 13}`,對得起來。 `continue_wins` 的正負轉換也符合定義——連勝到 3 之後輸一次直接變 `-1`: ```text 2023-01-09 wins=2 qty=2 2023-03-17 wins=3 qty=2 2023-03-21 wins=-1 qty=1 ← 勝敗切換,歸 -1 ``` > `core.stats` 與 `self.stats` **是同一個物件**(實測 `core.stats is self.stats` 為 `True`), > 跑完之後從外面讀 `core.stats` 拿到的是同一份累計結果。 --- ## 從零寫一支策略的檢查清單 1. **選餵資料方式**:單一週期 → `feed_data(df)`;需要 `on_bar2` 多週期訊號、 或要用小 K 模擬盤中讓停損觸發順序更準 → `set_tick_period` + `feed_tick_df`。 2. **`on_init` 放參數**:想尋優的都存成 `self.xxx`,`optimize` 才能從外面覆寫。 3. **期貨記得設 `tick_map`**:`self.tick_map = [(np.inf, 1)]`,否則套用股票的跳動單位。 4. **暖身期回傳假訊號**:指標資料不足時(`len(close_list) < window`)不要下單。 5. **每個 `Global` 給獨立的 `rule` 名**:同名會被視為「更新同一張單」。 避開內建的 `STL` / `PFT` / `DS` / `TGT`。 6. **進場條件要含部位檢查**:`self.global_qty == 0`(只進一次)或 `< 1`(可反手), 否則每根都會重下。 7. **風控每根重掛**:四個 `set_*` 方法必須無條件呼叫,不要包在 `if` 裡。 8. **設對 `config`**:`unit`、`fee`、`tax_short`、`margin`。設錯不會報錯但整份報表失真, 見 [績效報告](backtest-report.md)。 9. **檢查報表**:`rp.report` 看 KPI、`rp.trade_detail` 逐筆對答案、`rp.dashboard()` 看圖。 10. **尋優**:把策略包成一個回傳 `generate_report(...)` 的函式丟給 `bt.Tools.optimize`。 --- ## 會出錯的事(實測) ### 在 `on_init` 裡下單 → RuntimeError ```python class S(bt.Core): def on_init(self): self.Condition.Global(True, 1, 0, self.PriceType.market_ioc, None, 'x') ``` ```text RuntimeError: 還沒有任何 K 棒就下單了 (self.row 是空的)。 Condition.Global 只能在 on_bar / on_intrabar / on_position 裡呼叫, on_init 只用來初始化參數。 ``` ### 完全平倉不觸發 `on_position` 實測:`index=0` 買 2 口 → `index=2` 賣 1 口(部分平倉)→ `index=4` 賣掉剩下的。 `on_position` 只觸發 **2 次**(開倉、部分平倉),最後那次完全平倉**沒有觸發**: ```text on_position 觸發 2 次: [(1, 'bk', 2, 2), (1, 'bk', 1, 2)] 期末 global_qty = 0 ``` 要在部位結清後做事,改在 `on_bar` 讀 `self.stats[rule]`(`close_count` / `realized_pnl` / `continue_wins`)或事後看 `rp.trade_detail`。 ### 其他陷阱 | 陷阱 | 說明 | |---|---| | 期待 `market_ioc` 以當根收盤價成交 | 不會。在 `on_bar` 下的單是**下一根開盤價** | | 在 `on_bar` 讀剛成交新倉的 `global_unrealized_point` | 該筆的浮動損益要下一根才會計入 | | 對 `rp.trade_detail` 的時間欄直接用 `.dt` | 那是**字串**不是 `datetime64`,要先 `pd.to_datetime` | | K 棒的 `DateTime` 是**收盤時間** | 自備資料時 `DateTime` 要用 bar 的**結束**時間,不是開始時間。用 `feed_tick_df` 聚合時,標記 `09:00` 的 K 棒在 `period=[['0900','1330']]` 下會被歸進 `10:00` 那個桶 | | 餵入交易時段外的資料 | 落在 `period` 之外的 tick 會被忽略並印警告,不進任何 bar | | 分段餵入時區間重疊 | 重疊那段被時序守門整段丟棄並印警告 | | 多筆持倉互相干擾 | 出場單沒帶 `match_uid=P.uid` 會依序沖銷。要獨立出場請在 `on_position` 用 `P.uid` 綁 | | 重複下單 vs 更新委託 | 同一組 `(rule, match_uid)` 重複呼叫 `Global` 是**更新**,不是再下一張 | | `feed_data` 不觸發多週期 | 需要 `on_bar2` / `on_other*` 一定要改用 `set_tick_period` + `feed_tick_df` | | 拿 `self.row` 存自己的東西 | `self.row` 是保留屬性,框架每根 K 棒都會把它換成當根 bar,存進去的東西會**默默消失**。自訂狀態請另取名(例如 `self.my_feat`)。同理不要覆寫 `row_list`、`char`、`positions`、`orders`、`global_qty`、`stats`、`Condition`、`PriceType`、`Ind` | | 有內建停損停利或反手時,自己再寫 `-self.global_qty` 平倉 | 這張單下一根才撮合;持倉若已被 STL/反手先平掉,它照樣成交,**反向開出一筆新倉**(`trade_detail.entry_rule` 會出現你的出場規則名)。改成逐筆 `match_uid=P.uid` 綁定,持倉不在了框架會自動撤單,見 [backtest-order.md](backtest-order.md) | | 期待 `NetProfit` 等於 `pnl` 加總 | `NetProfit` 取自 `daily` 曲線末值並四捨五入;期末有未平倉部位時兩者會差一點 | | `lot_size` 只對百分比下單有效 | `add_qty >= 1`(固定口數)不受 `lot_size` 影響 | | 浮點殘量 | 百分比下單沖銷持倉會有 ~1e-17 殘量,框架用 `_QTY_min = 1e-9` 容差處理。**不要自己用 `== 0` 比較口數** | | 即時 tick 重複計算 | callback 要過濾 `data.total_volume == 0` 的快照,避免重複餵入 | --- ## 框架印出的訊息對照 | 訊息 | 意義 | |---|---| | `[設定on_bar] :freq= 60` | `set_tick_period` 設定成功,base 週期 60 分 | | `[加載] feed_tick` / `feed_tick_df` / `feed_other` | 對應的餵資料方法已掛上 | | `[警告] 主商品第2周期 D 但沒定義 on_bar2, 略過` | 設了多週期但沒實作對應的 `on_barN` | | `[警告] 對標第1周期 60 但沒定義 on_other, 略過` | 設了 `set_other_period` 但沒實作 `on_other` | | `[警告] tick ... 落在 period 交易時段之外,已忽略` | 資料時間不在 `period` 宣告的時段內 | | `[警告] 主商品資料時間 ... 早於前一筆 ...,已忽略` | 時序守門擋掉倒退的資料 | | `[警告] ...: DateTime 沒有依時間遞增,已自動排序後才餵入` | df 沒排序,框架代為排序;**回頭查資料來源** | | `【'開始下載':XXX ,freq=1】` / `【下載完成】` | `bt.Tools.get_*_ohlc` 正在下載(同商品只下載一次) | --- ## 相關頁 - [委託、成交價與風控](backtest-order.md):`Condition.Global`、五種委託型別、成交價實測表 - [資料與週期](backtest-data.md):`feed_data` / `feed_tick_df`、`freq`、時序管控 - [績效報告](backtest-report.md):`config` 與四張報表的欄位定義 - [指標與參數尋優](backtest-tools.md):`self.Ind`、`bt.Tools.optimize` - [回測總覽](backtest.md):`api.bt` 綁定、用積木訊號回測 ==================================================================================================== # 回測:委託、成交價與風控 > 所屬章節:回測 > 成交價規則表 12 個案例全部以合成資料實測驗證(2026-08-21) 所有下單都經由 `self.Condition`。本頁說明怎麼描述一張委託、五種委託型別的差異、 各型別在跳空與盤中觸價時的**實際成交價**,以及四個停損停利方法。 ## Condition.Global ```python self.Condition.Global(triggered, add_qty, trade_price, trade_type, cancel_triggered, rule, match_uid='') ``` 描述「什麼條件下送出什麼單」。掛單、更新、取消與撮合都由引擎處理。 | 參數 | 說明 | |---|---| | `triggered` | 觸發條件。`True` 時送出/更新委託 | | `add_qty` | 數量。正=買進/建多,負=賣出/建空。**小於 1 的小數代表「佔資金池的比例」**,實際口數由 `config.lot_size` 換算 | | `trade_price` | 委託價。`0` 代表市價 | | `trade_type` | 委託型別,見下節 | | `cancel_triggered` | `True` 時取消此委託(依 `rule` / `match_uid` 定位)。不需要時傳 `None` 或 `False` | | `rule` | 規則名稱。用於識別委託、對應 `Position.rule`,也是 `set_STL` 等出場條件的比對依據 | | `match_uid` | 要平掉哪一筆持倉的 `uid`。預設 `''` 視為新倉,有部位時依序沖銷 | > **同一組 `(rule, match_uid)` 重複呼叫是「更新既有委託」,不是再送一張新單。** > 要同時掛兩張不同的單,必須用不同的 `rule`。 ```python # 進場:空手時送市價買單 self.Condition.Global(self.global_qty == 0, 1, 0, self.PriceType.market_ioc, None, 'bk') # 反手:多單訊號成立時一次補齊到 +qty,並以空單訊號作為取消條件 self.Condition.Global(long and self.global_qty < 1, -self.global_qty + qty, 0, self.PriceType.market_ioc, short, 'long') ``` ### 綁定特定持倉出場 多筆持倉時,出場單不帶 `match_uid` 會依序沖銷,容易互相干擾。 要每筆獨立出場就在 `on_position` 用 `P.uid` 綁: ```python def on_position(self, P): if P.rule == 'bk': self.Condition.Global(True, -1, P.entry_price + 5, self.PriceType.limit_rod, None, 'exit', P.uid) ``` --- ## PriceType — 五種委託型別 `self.PriceType.xxx`,傳給 `trade_type`。 | 值 | 說明 | 沒成交時 | |---|---|---| | `market_ioc` | 市價單,**一定成交** | — | | `limit_ioc` | 限價單,只看下一根 | **當場取消**,不留單 | | `limit_rod` | 限價單(追求更好的價:買在低點、賣在高點) | 留單到之後的 bar | | `stop_rod` | 觸價/突破單(追價:買在突破、賣在跌破,停損用) | 留單到之後的 bar | | `compel_now` | 強制立即成交,不經撮合判斷,直接以指定 `trade_price` 成交。**價格不能給 0**(會以 0 元成交),結算時帶 `row['Close']` | — | --- ## 成交價規則(實測) 在 `on_bar` 下的單要等**下一根**才撮合,所以所有規則都是拿「下一根的 OHLC」判斷。 下表以 **bar0 全部 100(在這裡下單)、bar1 = O100 H110 L90 C100(用它撮合)** 實測: | 委託 | 成交價 | 為什麼 | |---|---|---| | `market_ioc` 買 | **100** | 下一根**開盤價** | | `market_ioc` 賣 | **100** | 同上 | | `limit_ioc` 買 @95 | **未成交** | 開盤 100 > 限價 95,IOC 不留單直接取消 | | `limit_ioc` 買 @105 | **100** | 開盤就優於限價 → 用開盤價(對你有利) | | `limit_rod` 買 @105 | **100** | 同上 | | `limit_rod` 買 @95 | **95** | 開盤沒滿足、盤中最低 90 觸及 → 用**限價** | | `limit_rod` 買 @80 | **未成交**(留單) | 最低只到 90,沒碰到 80 | | `stop_rod` 買 @95 | **100** | 開盤 100 已越過觸價 → 用**開盤價**(跳空滑價) | | `stop_rod` 買 @105 | **105** | 開盤未觸發、盤中最高 110 穿越 → 用**觸價** | | `stop_rod` 買 @120 | **未成交**(留單) | 最高只到 110 | | `limit_rod` 賣 @105 | **105** | 盤中最高 110 觸及 | | `stop_rod` 賣 @95 | **95** | 盤中最低 90 跌破 | 歸納成兩句話: - **限價單(`limit_*`)**:開盤價若已優於你的限價 → 用**開盤價**成交(多賺); 否則盤中觸價 → 用**限價**成交。 - **觸價單(`stop_rod`)**:開盤價若已越過觸價 → 用**開盤價**成交 (跳空滑價,這是刻意模擬真實情況,不是 bug);否則盤中穿越 → 用**觸價**成交。 > `stop_rod` 的跳空行為是回測比實盤樂觀/悲觀的關鍵。用它做停損時, > 大跳空的那幾根會以開盤價出場,損失可能遠大於你設定的停損點——這是對的,實盤就是這樣。 ### 什麼時候會「同一根內」成交 只有 tick 路徑(`feed_tick` / `feed_tick_df`)才可能,因為那時 bar 還在形成中: | 情境 | `market_ioc` 成交價 | |---|---| | 在 `on_bar` 下單 | 下一根的**開盤價** | | 在 `on_intrabar` / `on_position` 下單,且 bar 還在形成中 | 下一筆 tick 進來時的**當時價格**(同一根內) | 用 `feed_data` 時每列就是一根完整 K 棒、沒有盤中過程,所以**一定**是下一根開盤價。 --- ## 四個停損停利方法 | 方法 | 說明 | |---|---| | `self.Condition.set_STL(name, STL)` | 固定停損:進場價往不利方向移動 `STL`%(例 `2.0`)時出場 | | `self.Condition.set_PFT(name, PFT)` | 固定停利:進場價往有利方向移動 `PFT`%(例 `5.0`)時出場 | | `self.Condition.set_MoveLoss(name, DS)` | 移動停損:自持倉期間的極值**價格**回撤 `DS`% 時出場 | | `self.Condition.set_TGT_PFT(name, TGT, PFT)` | 目標追蹤:獲利先達進場價的 `TGT`% 後啟動,再從最高獲利**點數**回吐 `PFT`% 時出場 | > **四個都必須在 `on_bar` 裡無條件、每根 bar 呼叫一次。** > 它們的作用是「依當前持倉重算出場價並更新掛單」——不呼叫,出場價就不會更新。 > 不要包在 `if` 裡。 `name` 要與下單時 `Condition.Global` 的 `rule` 一致。 ### 出場價公式 以**多單**為例(`極值價 = entry_price + P.max_earn`)。空單方向相反。 | 方法 | 出場價公式 | 委託型別 | 內部 rule 名稱 | |---|---|---|---| | `set_STL(name, STL)` | `entry_price × (1 − STL/100)` | `stop_rod` | `STL` / `STLs` | | `set_PFT(name, PFT)` | `entry_price × (1 + PFT/100)` | `limit_rod` | `PFT` / `PFTs` | | `set_MoveLoss(name, DS)` | `極值價 × (1 − DS/100)` ← **價格**的 % | `stop_rod` | `DS` / `DSs` | | `set_TGT_PFT(name, TGT, PFT)` | `極值價 − max_earn × PFT/100` ← **獲利點數**的 %
且需先滿足 `極值價 ≥ entry_price × (1 + TGT/100)` 才啟動 | `stop_rod` | `TGT` / `TGTs` | 實測(進場價 100,價格最高到 120,即 `max_earn = 20`): ```text set_STL('bk', 5) → stop_rod @ 95.0 = 100 × 0.95 set_MoveLoss('bk', 5) → stop_rod @ 114.0 = 120 × 0.95 ← 極值「價格」的 5% set_TGT_PFT('bk', 1, 30) → stop_rod @ 114.0 = 120 − 20 × 0.30 ← 獲利「點數」的 30% ``` > `set_MoveLoss` 的 `DS` 是**極值價格**的百分比,`set_TGT_PFT` 的 `PFT` 是**獲利點數**的百分比。 > 基準不同,數值不能互相套用(上例剛好都是 114 是巧合)。 ### 內部 rule 名稱是保留字 出場單用 `match_uid=P.uid` 綁在**個別持倉**上,並且會佔用上表的內部 rule 名稱。 **你自己下單不要用 `STL` / `PFT` / `DS` / `TGT` 這幾個名字**(含 `s` 結尾的空單版)。 ```python self.Condition.Global(con1, 1, 0, self.PriceType.market_ioc, None, 'long') self.Condition.set_STL('long', 2.0) self.Condition.set_PFT('long', 5.0) self.Condition.set_TGT_PFT('long', 2.7, 32.0) self.Condition.set_MoveLoss('long', 5.0) ``` > 這四個在原始碼裡是底線開頭的方法(`_set_STL`、`_set_PFT`、`_set_TGT_PFT`、`_set_moveloss`), > 對外一律透過 `self.Condition.set_XXX(...)` 別名呼叫。 --- ### 委託價會依 tick_map 四捨五入(期貨要改) 所有非 0 的委託價(限價、停損觸發價、`compel_now` 的價格、`set_STL` 等算出的出場價)都會依 `self.tick_map` 四捨五入到合法跳動單位。**預設是台股現股的規則**,價格 ≥ 1000 時以 5 為單位, 所以台指期 18000 點附近的價格會被修到 5 點的倍數。期貨策略要在 `on_init` 改掉: ```python def on_init(self): self.tick_map = [(float('inf'), 1)] # 台指期、小台:1 點 ``` 實測一支台指期 MA 策略(2017~2026,62 次結算):沒設時結算的 `compel_now` 價格 100% 是 5 的倍數, 每次最多偏 2 點、累計 9 點。只用市價單影響很小;用限價/停損單的策略每一筆都會被修。 ## 常用寫法對照 | 你想做的事 | 寫法 | |---|---| | 空手時進場做多 1 口 | `Global(sig and self.global_qty == 0, 1, 0, PriceType.market_ioc, None, 'bk')` | | 有多單就全部平掉 | `Global(sig and self.global_qty > 0, -self.global_qty, 0, PriceType.market_ioc, None, 'bp')` | | 多空反手(一次平舊倉+開新倉) | `Global(long and self.global_qty < 1, -self.global_qty + qty, 0, PriceType.market_ioc, short, 'long')` | | 加碼(不管現有部位再加 1 口) | `Global(sig, 1, 0, PriceType.market_ioc, None, 'add')` | | 用資金的 30% 進場 | `Global(sig, 0.3, ...)`,並在 `config` 設 `lot_size` | | 掛低接(限價買在現價下方) | `Global(sig, 1, row['Close'] * 0.99, PriceType.limit_rod, None, 'bk')` | | 突破買進(觸價單) | `Global(sig, 1, self.H, PriceType.stop_rod, None, 'bk')` | | 每筆持倉獨立出場 | 在 `on_position` 裡用 `match_uid=P.uid` | | 條件不成立時撤單 | `Global(..., cancel_triggered=撤單條件, ...)` | | 結算日強制平倉 | `Global(row['DateTime'] == row['Settlement'], -self.global_qty, row['Close'], PriceType.compel_now, False, '結算')` | | 收盤前平倉(不留倉) | 判斷 `row['DateTime'].strftime('%H%M') == '1345'` 再用 `market_ioc` 或 `compel_now` | | 連勝後加碼 | 在 `on_bar` 裡讀 `self.stats.get('bk', {}).get('continue_wins', 0)` | | 只在特定時段交易 | `hm = row['DateTime'].strftime('%H%M')`,再用 `'0900' <= hm <= '1100'` 當條件 | --- ## 相關頁 - [事件模型與策略撰寫](backtest-strategy.md):一根 bar 內的執行順序、`row` 欄位、狀態屬性 - [資料與週期](backtest-data.md):`feed_data` / `feed_tick_df` 與 `freq` - [績效報告](backtest-report.md):`config` 的成本設定與報表欄位 ==================================================================================================== # 回測:資料與週期 > 所屬章節:回測 資料怎麼進引擎:從哪裡取歷史 K 線、有哪幾種餵入方式、框架對時序的要求。 ## 三種餵入方式 | 方式 | 呼叫 | 觸發事件 | 適用 | |---|---|---|---| | 一、整份 K 棒 | `core.feed_data(df)` | `on_bar`、`on_intrabar`、`on_position` | 最快;單一頻率、不需多週期訊號 | | 二、週期聚合 | `core.set_tick_period(...)` + `core.feed_tick_df(df)` | 上述 + `on_bar2` / `on_bar3`、`on_other*` | 多週期訊號;用小 K 模擬盤中,停損觸發順序最準 | | 三、單筆 tick | `core.set_tick_period(...)` + `core.feed_tick(row)` | 同上 | live 即時行情 | > **`feed_data` 不走週期聚合系統,所以不會觸發 `on_bar2` / `on_bar3` / `on_other*`。** > `feed_tick` / `feed_tick_df` 是呼叫 `set_tick_period` 之後才動態掛上的方法 > (會印出 `[加載] feed_tick`)。 ### feed_data ```python core.feed_data(df, args=['DateTime', '開盤價', '最高價', '最低價', '收盤價', '成交量'], columns=['Settlement']) ``` | 參數 | 說明 | |---|---| | `df` | K 棒 DataFrame,欄位由 `args` / `columns` 對應 | | `args` | `[DateTime欄, Open欄, High欄, Low欄, Close欄, Volume欄]` 六個欄名,**依序對應** | | `columns` | 要一併帶進每根 bar 的額外欄位(例如積木訊號欄、`['Settlement']`) | `args` 只是告訴引擎哪一欄扮演哪個角色;**`row` 裡的 key 一律是英文** `Open`/`High`/`Low`/`Close`/`Volume`。`columns` 帶進去的則保留原欄名。 ```python # 積木訊號當進出場:sig 欄一定要在 columns 宣告,否則 row 裡沒有 bars['sig'] = bars['DateTime'].map(sig_series).fillna(False) core.feed_data(bars, ['DateTime','開盤價','最高價','最低價','收盤價','成交量'], columns=['sig']) ``` ### set_tick_period ```python core.set_tick_period(freq=60, period=[['0845','1345'], ['1500','0500']], need_settlement=True, args=['DateTime','開盤價','最高價','最低價','收盤價','成交量'], columns=[]) ``` | 參數 | 說明 | 預設 | |---|---|---| | `freq` | 聚合頻率。`int`(分鐘)為單一週期;`list` 為多週期,例如 `[60, 'D']` 代表 base=60 分(觸發 `on_bar`)+ 日線(觸發 `on_bar2`,純訊號不進帳務)。`'D'` 代表日線,日盤 + 前一夜盤視為同一交易日 | `60` | | `period` | 交易時段區間列表。期貨預設日盤 `08:45–13:45` + 夜盤 `15:00–隔日 05:00`;股票常用 `[['0900','1330']]` | 期貨日夜盤 | | `need_settlement` | 是否計算結算日(期貨適用) | `True` | | `args` / `columns` | 同 `feed_data` | — | `freq` 是 list 時:`freq[0]` → `on_bar`(走帳務),`freq[1]` → `on_bar2`, `freq[2]` → `on_bar3`,以此類推(純訊號)。 設了第 N 週期卻沒實作對應的 `on_barN`,框架會印警告並略過。 ### set_other_period(對標商品) ```python core.set_other_period(freq=60, period=..., need_settlement=True, args=..., columns=[]) ``` 對標商品**只供訊號參考、完全不進帳務**,觸發 `on_other` / `on_other2` / `on_other3`。 ### feed_tick_df ```python core.feed_tick_df(df1) # 只餵主商品 core.feed_tick_df(None, df2) # 只餵對標 core.feed_tick_df(df1, df2) # 主 + 對標,依時間交錯(同一時點對標先行) ``` ### feed_tick(單筆,live 用) ```python core.feed_tick({'time': '20260821101500', 'price': 18500.0, 'vol': 3}) ``` | key | 說明 | |---|---| | `time` | 該筆 tick 的時間,字串 `'YYYYMMDDHHMMSS'` | | `price` | 成交價 | | `vol` | 成交量 | --- ## 聚合週期 freq `get_*_ohlc` 的 `freq` 與 `set_tick_period` 的 `freq` **用同一套轉換邏輯**, 所以「先轉好再餵」與「餵小週期讓引擎聚合」兩條路徑產生的 K 棒逐根相同(已逐欄驗證 OHLCV): ```python # 路徑 A:先轉好再餵 dfD = bt.Tools.get_fut_ohlc('TXF', freq='D') core.feed_data(dfD) # 路徑 B:餵小週期,讓引擎自己聚合 df60 = bt.Tools.get_fut_ohlc('TXF', freq=60) core.set_tick_period(freq='D') core.feed_tick_df(df60) # 餵 1 分 K 也可以,結果一樣 ``` `freq` 可傳分鐘數(`int`)或日線(`'D'`)。日線的規則:日盤 + **前一夜盤**視為同一交易日。 --- ## 取得歷史資料 `bt.Tools` 提供個股與期貨的歷史 K 線下載,內部依 `symbol` 分兩段快取: 原始資料只下載一次,之後不同 `freq` / `period` 組合各自快取聚合結果, 重複呼叫不會重複下載或重算。 ### get_stock_ohlc ```python bt.Tools.get_stock_ohlc(symbol, freq=1, adj=True, period=[['0900', '1330']]) ``` 取個股/ETF 歷史 K 線。內部固定抓「回溯約 4 年、到昨日為止」的 **1 分 K 原始資料**再聚合。 | 參數 | 說明 | 預設 | |---|---|---| | `symbol` | 個股/ETF 代號,例如 `'0050'`、`'2330'` | 必填 | | `freq` | 聚合頻率(分鐘) | `1` | | `adj` | 是否還原權息。`True` 時用「還原日 K 價量資料」的 `收盤價/次日開盤參考價` 比例,依交易日往前填補後調整開高低收(乘)與成交量(除) | `True` | | `period` | 交易時段區間列表 | `[['0900','1330']]` | 回傳欄位:`DateTime`(K 棒**結束**時間)、`dt_period`(原始 tick 涵蓋的起訖時間字串)、 `開盤價` / `最高價` / `最低價` / `收盤價` / `成交量`。 `adj=True` 時多一欄 `ratio`(還原比例係數,供除錯驗證)。 ### get_fut_ohlc ```python bt.Tools.get_fut_ohlc(symbol='TXF', freq=1, period=[['0845', '1345'], ['1500', '0500']]) ``` 取期貨歷史 K 線(日盤+夜盤合併)。`symbol` 省略或 `None` 視為 `'TXF'`, 而 `'TXF'` 直接讀預先快取好的近期資料(不用另外下載),其他商品才會即時下載。 內部固定抓「回溯約 2 年、到昨日為止」的 1 分 K。 回傳欄位:`DateTime`、`dt_period`、`開盤價` / `最高價` / `最低價` / `收盤價` / `成交量`、 `Settlement`(該筆所屬的結算日)、`結算`(布林,標記結算日 13:30 強制切斷的那根 K 棒)。 ```python df = bt.Tools.get_stock_ohlc('0050', freq=60, adj=False) df_fut = bt.Tools.get_fut_ohlc('TXF', freq=60) ``` --- ## 要跟積木訊號對齊時:不要用 get_stock_ohlc 積木的 `sig` 是**日頻矩陣**(來自 `api.MSMP.日_K`),而 `get_stock_ohlc` 是 1 分 K 聚合的結果。頻率對不上,還要多下載一份 1 分 K。 **兩邊都取 MSMP 日頻時,日期 index 天然完全對齊**,不需要 reindex/ffill: ```python import pandas as pd def daily_bars(api, symbol): k = api.MSMP.日_K zh2en = {'開盤價':'Open','最高價':'High','最低價':'Low','收盤價':'Close','成交量':'Volume'} df = pd.DataFrame({zh: getattr(k, en)[symbol] for zh, en in zh2en.items()}) df.index.name = 'DateTime' return df.reset_index() ``` 完整範例見 [回測總覽](backtest.md)。 --- ## 時序管控 `feed_data` / `feed_tick` / `feed_tick_df` / `feed_other` 四個入口都有時序管控。 時間倒退的資料若不擋,會被當成新的一根接在後面,造成 `row_list` 時序錯亂、 `self.row` 變成舊價、停損停利以錯誤價位判斷,**而且不會產生任何錯誤訊息**。 處理分兩道: | 道 | 處理對象 | 做法 | |---|---|---| | 排序 | 同一批資料內部亂序 | 餵入前檢查是否遞增,否則自動穩定排序並提示。已排序時零成本 | | 守門 | 與先前已餵入的資料重疊 | 重疊區段整段丟棄,並輸出一行總結 | | 情況 | 行為 | |---|---| | 同一批資料內部時間亂序 | 自動穩定排序後餵入 | | 同一份 df 內同一時間多列 | 收下,維持原相對順序 | | 時間與前一筆相同(單筆 `feed_tick`) | 收下(逐筆行情同秒多筆成交屬正常) | | 與先前已餵資料重疊的區段 | 整段丟棄 | | 邊界上時間完全相同的一列 | `feed_tick_df` 丟棄(增量累加,重複會重計成交量)
`feed_data` 保留(整根覆蓋,且需支援重餵更新當前 K 棒) | 主商品與對標各自維護水位線,互不影響。重疊區段在進入迴圈前就向量化濾除, 整段重疊時不做 K 棒轉換(20 萬列實測 1.98 秒 → 0.004 秒)。 會看到的警告: ```text [警告] 主商品資料時間 20240102103000 早於前一筆 20240102120000,已忽略(時序守門) [警告] feed_tick_df 主商品: DateTime 沒有依時間遞增,已自動排序後才餵入 [警告] feed_data: 有 2 列時間早於已餵入的前一筆,已忽略(時序守門) ``` > 框架會幫你排序,但**看到排序警告就該回頭查資料來源**——那代表你的 df 本來就是亂的。 --- ## 相關頁 - [事件模型與策略撰寫](backtest-strategy.md):`row` 的完整欄位、事件觸發順序 - [委託、成交價與風控](backtest-order.md):成交價規則 - [績效報告](backtest-report.md):`config` 與報表欄位 ==================================================================================================== # 回測:商品規格與績效報告 > 所屬章節:回測 > `tax_long` / `tax_short` 的語意與 `capital` 的生效條件皆以實測驗證(2026-08-21) `config` 決定帳務怎麼算,`generate_report` 把跑完的策略彙整成報表。 ## bt.config — 商品規格 ```python bt.config(name='strategy', symbol='symbol', tax_long=0, tax_short=0, daytrade_discount=1, fee=0, unit=1, margin_long=1, margin_short=1, lot_size='inf,0,floor,1') ``` 只影響報表、不影響回測本身——同一個跑完的 core 換一份 config 重新 `generate_report` 就好,不用重跑。**設錯不會報錯,但整份報表失真。** | 欄位 | 說明 | 預設 | |---|---|---| | `name` | 策略規則名稱,多策略回測時的分組依據,也是 `rp.report` 的欄名 | `'strategy'` | | `symbol` | 交易標的代號 | `'symbol'` | | `tax_long` | **進場那一腳**的稅率,見下方說明 | `0` | | `tax_short` | **出場那一腳**的稅率 | `0` | | `daytrade_discount` | 當沖稅率折扣:進出場同一天時稅率乘上此值(`1`=無折扣、`0.5`=減半) | `1` | | `fee` | 手續費。`>= 1` 為**每口固定金額**;`< 1` 為**成交金額費率** | `0` | | `unit` | 合約乘數,決定「名目金額 = qty × unit × price」。**預設 `1`(以股計)**——`qty` 就是股數。想用「張」思考才設 `1000`,那時 `qty` 是張數。台指期 `200` | `1` | | `margin_long` | 多單保證金。`>= 10` 為每口固定金額;`< 10` 為名目金額比例(成數) | `1` | | `margin_short` | 空單保證金,同上 | `1` | | `lot_size` | 百分比下單(`add_qty < 1`)時的口數限制,格式 `'最大口數,最小口數,取整方式,幾口一取'`,取整只接受 `floor` / `ceil`。**固定口數下單不受影響** | `'inf,0,floor,1'` | > `fee` 與 `margin` 會**依數值大小自動切換計算模式**。`fee=500` 是每口 500 元, > `fee=0.001425` 是 0.1425% 費率——寫錯一個小數點,成本會差幾百倍。 ### tax_long / tax_short 的名字會誤導 看 `generate_report/pnl.py` 的 `_make_tradeX` 成本公式: ```text cost = qty × unit × ( entry_price×(tax_long + fee) + exit_price×(tax_short + fee) ) ``` **`tax_long` 乘的是進場價、`tax_short` 乘的是出場價,與多空方向無關。** 台股證交稅只在賣出收,所以**台股只要填 `tax_short=0.003`**,`tax_long` 保持預設的 `0` 就好。 (兩邊都填會把稅收兩次、成本虛增一倍。) | 標的 | 設法 | |---|---| | 台股個股(以張計) | `fee=0.001425, tax_short=0.003, unit=1000`,`qty` 填張數 | | 台股個股(以股計) | `fee=0.001425, tax_short=0.003`(`unit` 用預設 1),`qty` 填股數 | | 台股 ETF | 同上但 `tax_short=0.001` | | 台股個股(含當沖減半) | 再加 `daytrade_discount=0.5` | | 台指期 | `fee=500, tax_long=0.00002, tax_short=0.00002, unit=200, margin_long=0.13, margin_short=0.13` | | 美股 | `fee=0, tax_long=0, tax_short=0, unit=1` | ```python # 台股個股 cfg = bt.config(symbol='2330', fee=0.001425, tax_long=0, tax_short=0.003, daytrade_discount=0.5, unit=1000) # 台指期(固定手續費/口,保證金為名目金額成數) cfg = bt.config(symbol='TXF', tax_long=0.00002, tax_short=0.00002, fee=500, unit=200, margin_long=0.13, margin_short=0.13) # 百分比下單,換算口數無條件捨去、無上限 cfg = bt.config(name='pct_TXF', symbol='TXF', tax_short=0.00002, fee=20, unit=200, margin_long=0.13, margin_short=0.13, lot_size='inf,0,floor,1') ``` --- ## bt.generate_report ```python rp = bt.generate_report(core_dic, margin_call=False, capital=1000000, benchmark=None) ``` | 參數 | 說明 | 預設 | |---|---|---| | `core_dic` | `{config: core}` 字典。`core` 須已跑完整段資料。可放多組一起比較 | 必填 | | `margin_call` | 是否把未實現的浮動虧損也算進資金佔用(影響 `rp.daily` 的 `invest`、`rp.report` 的 `Invest` / `MaxPosition`)。`True` 較保守,模擬保證金追繳 | `False` | | `capital` | 起始資金。**只在百分比下單時才生效**,見下 | `1000000` | | `benchmark` | 基準指數的每日收盤價(`dict` 或 `pd.Series`,index 為日期)。提供後 `rp.report` 多一欄做買進持有比較 | `None` | ### capital 只在百分比下單時生效 `_make_tradeX`(`generate_report/pnl.py`)在「所有交易都是固定口數」時會走向量化路徑,**`capital` 完全不參與計算**。 實測:同一組固定 1 口的策略,`capital` 設 10 萬 / 100 萬 / 1 億, `Invest`、`NetProfit`、`MaxPosition`、`TotalTrades`、`TotalReturns`、 `AvgCashUtilizationRate` **完全相同**。那時的 `TotalReturns` 其實是 `NetProfit / Invest`。 要讓資金池真的生效,`add_qty` 要填 0~1 的比例: ```python self.Condition.Global(True, 0.2, 0, self.PriceType.market_ioc, None, 'bk') # ^^^ 投入當下資金池的 20% ``` 此時: ```text capital 在進場時 = 起始資金 + entry_time 之前已實現的損益 口數 raw = capital × add_qty / margin,再依 lot_size 取整與夾限 ``` > **`capital` 只累加已實現損益,不會扣掉未平倉部位佔用的資金。** > 所以 N 檔同時進場時每檔都拿「同一份 capital」的比例去算口數, > `add_qty × 同時持有檔數` 若 > 1 就是隱性槓桿。取 `1/檔數` 最安全。 ### 兩種部位大小的寫法 `Condition.Global` 的 `add_qty` 有兩種語意,由「是否 < 1」決定, 而**單位由 `config.unit` 決定**——兩者搭錯會差 1000 倍。 #### A. 換股/輪動:`qty = 1/n` n 檔輪流持有、共用一份資金: ```python N = len(SYMS) self.Condition.Global(True, 1 / N, 0, self.PriceType.market_ioc, None, 'bk') ``` `qty < 1` 走百分比路徑,`capital` 真的生效,`rp.report['Strategy']` 是共用資金池的組合視角。 實測 3 檔、`capital=10,000,000`、`qty=1/3`(`unit=1000`): ```text 交易 164 筆 / qty=0 被夾掉 2 筆 單筆進場金額 中位 2,700,843 最大 3,259,638 MaxPosition 8,563,185 ← < capital,沒有超額 ``` `capital` 只扣**已實現**損益、不扣未平倉佔用,所以 `qty × 同時持有檔數 > 1` 就是隱性槓桿——取 `1/n` 剛好是安全上限。 #### B. 各檔訊號獨立:`qty = 固定金額 / price`,搭 `unit=1` 每檔各進各的、互不排擠,每筆固定名目金額。**必須以「股」計(`unit=1`)**: ```python cfg = bt.config(symbol=s, fee=0.001425, tax_long=0, tax_short=0.003, unit=1) def on_bar(self, row): if row['sig'] and self.global_qty == 0: qty = 100000 / row['Close'] # 每筆 10 萬元 self.Condition.Global(True, qty, 0, self.PriceType.market_ioc, None, 'bk') ``` `qty` 這時 ≥ 1,走**固定口數**路徑——`capital` 不參與計算(見上一節)。 #### `unit` 配錯的實測差距 同一條 `qty = 100000/price` 公式,只改 `unit`: | 寫法 | 單筆進場金額(中位) | |---|---| | `unit=1`(以股計) | **100,077** ← 正確,就是 10 萬 | | `unit=1000`(以張計) | **100,076,656** ← 差 1000 倍 | 因為 `unit=1000` 時 `qty` 被當成**張數**:`100000/2375 = 42.1` 張 = 42,100 股。 以張計的正確寫法要自己換算並取整: ```python qty = max(1, round(100000 / (row['Close'] * 1000))) # unit=1000 ``` 實測這樣寫單筆進場中位 653,430——因為台股一張最少就要幾十萬, 10 萬元的目標在張制下根本買不到一張,`max(1, ...)` 只好進位到一張。 **要精準控制名目金額就用 `unit=1`。** #### 兩者的差別 | | A. 換股 `1/n` | B. 獨立 `金額/price` | |---|---|---| | `qty` | < 1,佔資金池比例 | ≥ 1,實際股數 | | `unit` | 1000 或 1 都行 | **必須 1** | | `capital` | 生效,是資金約束 | **不生效**(固定口數走向量化路徑) | | 適合 | n 檔輪動、資金有限 | 各訊號獨立、看單一規則的期望值 | | 看哪一欄 | `rp.report['Strategy']` | 逐檔欄位各自看 | --- ### 部位被夾成 0 時的誤導訊息 `lot_size` 預設 `'inf,0,floor,1'`,`capital × add_qty` 買不起一單位時 `floor` 會把口數變 0。 **全部**被夾掉時每日損益全為 0,`make_daily` 會拋: ```text RuntimeError: make_daily: 每日損益全為 0,無法產生報表。 常見原因是 pandas / numpy 版本不相容導致索引對不起來,... ``` 實務上最常見的原因不是版本,而是**資金不夠買一個單位**(台股一張 1000 股)。 提高 `capital` 或減少檔數即可。 --- ## 產出內容 | 屬性 | 說明 | |---|---| | `rp.report` | 績效摘要(KPI)。多策略時每個策略各佔一欄,另有一欄 `Strategy` 是合併視角 | | `rp.trade_main` | 委託/成交明細(合併視角),**每筆下單都在,不論成交與否** | | `rp.trade_detail` | 進出場配對明細,計算損益的核心資料 | | `rp.position` | 每日持倉部位 | | `rp.daily` | 每日績效彙總(權益曲線) | | `rp.daily_close` | 每日收盤價 | | `rp.core[name]` | 單一策略獨立的 `StrategyResult`(不受其他策略影響),`name` 對應 `config.name` | | `rp.dashboard()` | 產出互動式績效儀表板(HTML),見下方 | | `rp.save(path=None)` | 存成一個 xlsx,見下方 | | `rp.set_benchmark(data)` | 事後設定/更新基準指數(同一天多筆取最後一筆) | > **沒有 `rp.trade`。** 逐筆交易在 `rp.trade_detail`。 ### 單策略時欄名是 `Strategy`,不是 `config.name` `config.name` 只在**多策略**時才成為欄名。`core_dic` 只放一個 core 時, 整份 `rp.report` 只有 `Strategy` 一欄(給了 `benchmark` 就多一欄 `benchmark`), **`config.name` 那一欄根本不存在**: #### input ```python cfg = bt.config(name='MA5_10_0050', symbol='0050', ...) rp = bt.generate_report({cfg: core}, benchmark=bench) print(list(rp.report.columns)) rp.report.loc['Invest', 'MA5_10_0050'] ``` #### output ```text ['Strategy', 'benchmark'] KeyError: 'MA5_10_0050' ``` 安全寫法: ```python COL = 'Strategy' if len(core_dic) == 1 else cfg.name invest = rp.report.loc['Invest', COL] ``` ### rp.dashboard() ```python rp.dashboard(path=None, view='notebook', page_size=20, unit=1e4, unit_label='萬') ``` | 參數 | 值 | 行為 | |---|---|---| | `path` | `None`(預設) | 自動命名 `YYYYMMDD_dashboard_N.html` 存進 `Path.cwd()`,`N` 從 1 遞增,不覆蓋既有檔 | | | `'out.html'` | 存到指定路徑 | | `view` | `'notebook'`(預設) | Jupyter 內嵌顯示。**非 notebook 環境只會印出 ``** | | | `'web'` | 存檔後用瀏覽器開啟 | | | `None` | 只存檔,不顯示也不開啟 | | `page_size` | `20` | 表格每頁筆數 | | `unit` / `unit_label` | `1e4` / `'萬'` | 金額圖的單位,兩者要一致(`1, '元'` 就是元) | 在終端或腳本裡跑,**要明確給 `path`**,否則檔案會散落在當前目錄: ```python rp.dashboard(path='dashboard.html', view=None) # 腳本 rp.dashboard() # notebook ``` > `view='notebook'` 且 `path=None` 且確實在 notebook 裡時,**不會存檔**,只內嵌顯示。 > 其餘組合一律存檔。 四個分頁: | 分頁 | 內容 | |---|---| | 總覽 | 上方 10 張卡片(總報酬率、平均年報酬、年化報酬、投資金額、淨利潤、勝率、Calmar、Sharpe、Sortino、年化波動率);近期報酬與交易次數、資金使用率、資料明細(含 `MddRatio`/`MddAmount`/`MddDuration`);累計報酬、月報酬熱圖(% 與金額)、損益與回撤(金額)圖、最大 5 次回撤(天數/金額)表 | | 績效分析 | 個股績效表(交易次數、勝率、`total_qty`、報酬率、損益)、每日摘要 | | 交易明細 | 委託(最新委託/全部委託)、成交(最新庫存/全部成交) | | 個股分析 | 選股票 → K 線(進出場標記,並畫出策略的 `self.char`/`self.char1` 指標)、進出場規則績效、個股委託、個股成交 | `rp.report` 的每一列都會出現在總覽(卡片或表格),新增的列自動補在「資料明細」最後。 > 股票池很大時檔案會很大:個股分析把每檔每根 K 棒都存進 HTML。實測美股 6,490 檔、317 萬根約 116 MB、產生約 17 秒。 ### rp.save() — 存成 xlsx ```python rp.save() # 存成 ./YYYYMMDD_report_N.xlsx,回傳實際路徑 rp.save('my_report.xlsx') ``` | sheet | 內容 | |---|---| | `report` | `rp.report` | | `daily` | `rp.daily`(index 名 `date`) | | `trade_main` | `rp.trade_main` | | `trade_detail` | `rp.trade_detail` | | `symbol_stats` | 個股績效(同 dashboard 績效分析頁) | | `rule_stats` | 進出場規則績效(股票代號、進場規則、出場規則、次數、占比、total_pnl、average_pnl) | - 不給 `path` 時自動命名 `YYYYMMDD_report_N.xlsx` 存在目前資料夾,`N` 從 1 找第一個沒用過的,不覆蓋舊檔;副檔名一律改成 `.xlsx`。 - **不存 `daily_close`**:股票池的「天數 × 檔數」寬表動輒幾十萬格,xlsx 寫入會佔掉九成時間。要的話直接拿 `rp.daily_close`。 ### 曝險率要自己算 28 項 KPI 裡**沒有曝險率**,但它是判斷「輸給 buy&hold 是參數問題還是結構問題」的關鍵: ```python exposure = (rp.daily['position'].abs() > 0).mean() # 有部位的交易日佔比 ``` 實測 0050 MA5/MA10:曝險率 **61.3%**——有 38.7% 的時間空手。 標的同期漲 3 倍時,空手的每一天都是純機會成本,**這是結構性的,掃參數救不了**。 ### benchmark 的報酬率從策略 StartDate 起算 `_make_benchmark_report(benchmark, index_list, start_date)` 刻意以策略的 `StartDate` (第一次進場日)對齊,讓兩邊比較同一段期間。所以跟自己算的 buy&hold **會對不上**: ```python rp.report.loc['TotalReturns', 'benchmark'] # 2.9284 ← 從 StartDate(2022-08-15) 起 bench.iloc[-1] / bench.iloc[0] - 1 # 3.0703 ← 從資料第一天(2022-08-01) 起 ``` **兩個都對,區間不同。** 暖身期越長(MA240 之類)差距越大。 引用「buy&hold 報酬」時要講清楚是哪一個。 多策略時 `rp.report` 的 `Strategy` 欄是「把所有 `name` 的交易按時序合併、 共用一份 `capital` 重算」的結果;其餘各欄是「該策略獨佔全部資金」的單獨視角。 **所以逐檔加總不等於 `Strategy`。** ```python benchmark = df.set_index('DateTime')['收盤價'].resample('D').last().dropna() rp = bt.generate_report({cfg1: core1, cfg2: core2}, margin_call=True, capital=10_000_000, benchmark=benchmark) print(rp.report) # 兩個策略 + benchmark 並列 print(rp.core['pct_TXF'].report) # 只看單一策略 ``` --- ## 時間欄位是字串 > `rp.trade_main` 的 `order_dt` / `dt`、`rp.trade_detail` 的 > `entry_time` / `exit_time` / `current_time` 都已經 `strftime` 成**字串**(顯示用), > 不是 `datetime64`。要做 `.dt.month`、算持有時間,得先 `pd.to_datetime()`。 > 空值仍是 `NaN`,`isna()` 可以正常篩選未平倉列。 > (dtype 在 pandas 2 顯示 `object`、pandas 3 顯示 `str`,值都是 Python 字串。) --- ## rp.trade_main(委託/成交明細) | 欄位 | 說明 | |---|---| | `name` | 策略名稱(對應 `config.name`) | | `symbol` | 交易標的代號 | | `rule` | 觸發此筆委託的訊號名稱(`Condition` 的 `rule`) | | `type` | 委託類型,例如 `market_ioc`、`limit_rod` | | `order_dt` | 委託時間 | | `order_qty` | 委託數量(正=買、負=賣) | | `order_price` | 委託價格(市價單為 0) | | `dt` | 實際成交時間 | | `qty` | 實際成交數量 | | `price` | 實際成交價格 | | `after_qty` | 成交後的持倉數量 | | `uid` | 唯一委託識別碼 | | `math_uid` | 配對用識別碼(對應進出場配對) | ## rp.trade_detail(進出場配對) | 欄位 | 說明 | |---|---| | `name` | 策略名稱 | | `symbol` | 交易標的代號 | | `direction` | `long`(多)或 `short`(空) | | `type` | `平倉`(已結清)或 `未平倉`(仍持有) | | `entry_rule` / `entry_time` / `entry_price` | 進場的規則、時間、價格 | | `exit_rule` / `exit_time` / `exit_price` | 出場的規則、時間、價格(未平倉為 `NaN`) | | `current_time` / `current_price` | 未平倉時的最新時間與市價(已平倉為 `NaN`) | | `qty` | 成交口數(張數),取絕對值 | | `unit` | 每口合約乘數 | | `cost` | 總交易成本(手續費 + 交易稅) | | `entry_amount` | 進場時實際佔用的資金(含保證金,**負值**) | | `exit_amount` | 出場後回收金額(`pnl + entry_amount`;未平倉為 `NaN`,改看 `predict`) | | `predict` | 未平倉部位以當前市價估算的出場金額 | | `pnl` | 本筆損益(**已扣除 `cost`**) | | `return` | 本筆報酬率(`pnl / abs(entry_amount)`) | | `margin` | 本筆保證金佔用 | > 想看「扣成本前的毛損益」用 `(pnl + cost).sum()`。日頻頻繁進出的策略常常毛損益接近零、 > 全部虧損來自成本——**先看這個再看報酬率**。 ## rp.daily(每日績效) 以交易日為單位追蹤資產變化。MDD 與波動度都基於 `value_pct`。 | 欄位 | 說明 | |---|---| | `cashflow` | 當日現金流(進出場產生的淨現金變化) | | `entry_cost` | 當日持倉的進場成本(負值,代表佔用資金) | | `market_value` | 當日持倉的浮動市值 | | `profit_loss` | 累計損益(已實現 + 未實現) | | `unrealized` | 未實現損益(`entry_cost + market_value`) | | `realized` | 已實現損益(`profit_loss - unrealized`) | | `position` | 當日最大資金佔用(以保證金/進場金額估算) | | `invest` | 累計最大投入資本(報酬率的分母,取歷史最大值)。是否計入未實現虧損由 `margin_call` 決定 | | `dd` | 當日回撤**金額** = `profit_loss - profit_loss.cummax()`(創新高那天是 0)。`rp.report` 的 `MddAmount` 就是它的最小值 | | `PNL/COST` | 累計損益 / 累計進場成本 | | `return` | 當日報酬(`return_cumsum` 的差分) | | `return_pct` | 當日報酬率:`(1 + return_cumsum) / (1 + prev_return_cumsum) - 1` | | `value_pct` | 當日資產變動率:`profit_loss.diff() / (前日 profit_loss + invest)`,風險指標都用這個 | ## rp.report(KPI 摘要,28 項) | 欄位 | 說明 | |---|---| | `StartDate` | 第一筆進場日期 | | `EndDate` | 回測結束日期 | | `BacktestDate` | 執行回測當下的日期 | | `TotalReturns` | 累計總報酬(`daily['return'].sum()`) | | `CAGR` | 年化報酬率(複利) | | `AAR` | 年化報酬率(單利:平均每日報酬 × 252) | | `MddRatio` | 最大回撤**比率**(基於 `value_pct`,負數)。2026-10 前叫 `MaxDrawdown` | | `MddAmount` | 最大回撤**金額** = `daily['dd'].min()`(負數,元)。可能比任何單月虧損都大(月中跌深、月底反彈時月損益看不出來) | | `MddDuration` | 最長回撤持續天數 | | `CalmarRatio` | `CAGR / abs(MddRatio)`。`bt.Tools.optimize` 的評分 | | `SharpeRatio` | 夏普比率(基於 `value_pct`,年化) | | `SortinoRatio` | 索提諾比率(只計下行波動) | | `AnnualisedVolatility` | 年化波動率(`value_pct` 標準差 × √252) | | `WinRate` | 勝率(已平倉交易中 `pnl > 0` 的比例) | | `ProfitLossRatio` | 盈虧比(獲利總額 / 虧損總額) | | `MaxPosition` | 期間最大資金佔用(峰值 `position`) | | `Invest` | 期間最大投入資本(峰值 `invest`,受 `margin_call` 影響) | | `AvgCashUtilizationRate` | 平均資金使用率 | | `TotalTrades` | 總交易筆數(含未平倉) | | `ProfitTimes` / `LossTimes` | 獲利/虧損筆數(已平倉) | | `NetProfit` | 淨利 = `round(daily['profit_loss'].iloc[-1])` | | `TradeCost` | 總交易成本(所有手續費+稅) | | `AvgProfitPerTrade` | `NetProfit / TotalTrades` | | `WeeklyReturn` | 近 5 根(約 1 週)報酬 | | `MonthlyReturn` | 近 20 根(約 1 月)報酬 | | `QuarterlyReturn` | 近 60 根(約 1 季)報酬 | | `AnnualReturn` | 近 240 根(約 1 年)報酬 | > `NetProfit` 取自每日曲線末值並四捨五入,**期末若有未平倉部位會與 > `rp.trade_detail['pnl'].sum()` 有小差異**(未平倉部位在 `trade_detail` 預扣進出場雙邊成本, > 在 `daily` 只計單邊)。全部平倉時兩者一致。 設定 `benchmark` 會多一欄;`WinRate` / `TotalTrades` 等交易統計對 benchmark 不適用,值為空。 --- ## 相關頁 - [事件模型與策略撰寫](backtest-strategy.md) - [委託、成交價與風控](backtest-order.md) - [資料與週期](backtest-data.md) - [指標與參數尋優](backtest-tools.md) - [回測總覽](backtest.md):用積木訊號回測、單檔與組合 ==================================================================================================== # 回測:技術指標與參數尋優 > 所屬章節:回測 ## self.Ind — 技術指標工具箱 `self.Ind` 是 `Core` 的**類別屬性**(所有策略共用同一份),採**增量計算**: 每根新 K 棒呼叫一次,回傳目前累積的完整序列(`list`),取 `[-1]` 就是最新值。 同一條序列若有多種用途,用 `name=` 參數區分狀態快取; 不指定時以 `window` 加資料物件 id 自動區分。 | 函式 | 簽名 | 備註 | |---|---|---| | `rolling_mean` | `(ls, window, min_period=None, name=None)` | 移動平均 | | `rolling_max` | `(ls, window, min_period=None, name=None)` | 移動最大 | | `rolling_min` | `(ls, window, min_period=None, name=None)` | 移動最小 | | `rolling_std` | `(ls, window, k=1, min_period=None, name=None)` | ta-lib 相容 STDDEV:母體標準差(ddof=0)× k | | `ema` | `(ls, window, alpha=None, name=None)` | `alpha=None` → α=2/(N+1) 標準 EMA;`alpha=1/N` → Wilder 平滑(ATR/RSI 用) | | `macd` | `(ls, short_window=12, long_window=26, macd_window=9, name=None)` | 回傳 `macd_dif, macd_ema, macd_hist` | | `atr` | `(high, low, close, window=14, name=None)` | ta-lib 相容,Wilder 平滑 | | `rsi` | `(ls, window=14, name=None)` | ta-lib 相容 | | `stochastic` | `(high, low, close, rsv_window=9, k_window=3, d_window=3, name=None)` | KD,與 pandas `ewm(adjust=False)` 對齊 | | `rolling_sum` | `(ls, window, min_period=None, name=None)` | 移動加總 | | `skew` / `kurt` | `(ls, window, name=None)` | 移動偏度/峰度 | | `zscore` / `minmax` | `(ls, window, eps=1e-9, name=None)` | 移動標準化 /區間正規化 | | `median` / `tsrank` | `(ls, window, name=None)` | 移動中位數/時序排名 | | `argmax` / `argmin` | `(ls, window, norm=True, name=None)` | 窗口內極值的位置 | | `decay` / `slope` / `delta` | `(ls, window, name=None)` | 線性衰減加權/斜率/差分 | | `corr` / `cov` | `(a, b, window, name=None)` | 兩條序列的移動相關/共變異 | | `katz` / `shannon` | `(ls, window[, bins=8], name=None)` | 碎形維度/熵 | ```python def my_indicators(self, row): self.close_list.append(row['Close']) ma5 = self.Ind.rolling_mean(self.close_list, 5) ma20 = self.Ind.rolling_mean(self.close_list, 20) self.char['ma5'] = ma5[-1] # 存進 self.char,show_monitor() 與 dashboard 的 K 線就會畫 self.char['ma20'] = ma20[-1] return ma5[-1], ma20[-1] ``` ### 兩個容易踩的地方 **每根 bar 都要呼叫一次。** 增量計算的前提是「每來一根就餵一次」, 包在 `if` 裡條件性呼叫會讓內部狀態跟資料脫節。 **同一根 K 棒呼叫兩次會前進兩次。** 例如逐欄位算特徵時三個欄位都要 `ema(c, 15)`,就推進了三次,窗口全部錯位(實測 MACD 因此反號)。用當根根數當快取鍵,保證一根只算一次。 **多個 core 共用 `Ind`。** `Ind` 是類別屬性,同一個 kernel 跑多個 core 時,給相同 `name` 會互相污染。在 `on_init` 寫 `self.Ind = type(self.Ind)()` 讓每個實例各用一份。 **同一條序列不同用途要給 `name`。** 例如同一份 `close_list` 同時要 5 日與 5 日 (但不同 `min_period`)的平均,不給 `name` 會共用同一份快取狀態。 --- ## bt.Tools.optimize — 參數尋優 ```python bt.Tools.optimize(my_strategy, search_range, times=50, random_ratio=0.5) ``` | 參數 | 說明 | 預設 | |---|---|---| | `my_strategy` | 自訂策略**函式**,需回傳有 `report` 屬性的物件(即 `generate_report` 的結果) | 必填 | | `search_range` | 參數範圍字典,格式 `{'名稱': [最小, 最大, 步長]}` | 必填 | | `times` | 優化總次數 | `50` | | `random_ratio` | 前面隨機探索的比例,之後用智能(TPE)尋優 | `0.5` | 回傳最佳參數 dict(例 `{'percent_in': 2.3, 'percent_out': 4}`)。評分是 `rp.report` 的 **`CalmarRatio`**(`CAGR / abs(MddRatio)`,NaN 當 0)。全部結果另存目前資料夾的 `optimize.xlsx`(CalmarRatio 在最前面),跑完會自動開檔。 ```python def opt(percent_in=2, percent_out=3): core = MyStrategy() core.percent_in = percent_in # 覆寫 on_init 設的 self.xxx core.percent_out = percent_out core.feed_data(df) return bt.generate_report({cfg: core}) arg = {'percent_in': [1, 5, 0.1], 'percent_out': [1, 10, 0.1]} best = bt.Tools.optimize(opt, arg, times=50) rp_best = opt(**best) # 用最佳參數重跑一次 print(rp_best.report) ``` ### 尋優要注意的事 **參數必須是 `on_init` 裡設的 `self.xxx`**,`optimize` 才能從外面覆寫。 寫死在 `on_bar` 裡的常數改不到。 **每次呼叫都要建新的 `core`。** `core` 是有狀態的,重複用同一個會累積前一次的部位與統計。 **評分是 `CalmarRatio`**(`CAGR / abs(MddRatio)`)。 這個目標偏好高報酬低回撤,但完全不看交易次數—— 可能挑出只交易 3 次剛好都對的參數。自己看 `rp.report` 的 `TotalTrades` 檢查。 **參數型別會變。** 取樣值剛好是整數時傳進來是 `int`(`1.0` 會變 `1`),否則是 `float`。 window 這類參數在函式開頭自己 `int(x)`;字串參數用索引搜尋(`'metric_i': [0, len(METRICS)-1, 1]`); 要固定某個參數不搜,用 `functools.partial(run, metric='YoY')`。 **`成功: 0組` 接著 `UnboundLocalError: best_params`** 是症狀不是原因:每一組都拋了例外、被吞掉沒印。 自己呼叫一次 `run(**某組參數)` 真正的錯誤就會出現(最常見:參數名收不到、回傳的不是 rp)。 **連續跑兩輪先關 Excel。** 上一輪自動開啟的 `optimize.xlsx` 會鎖住檔案,下一輪整輪跑完才在寫檔時 `PermissionError`。 **尋優本身就是過度配適的來源。** `times=50` 在兩個參數上已經掃過相當比例的空間, 挑出的最佳值在樣本外不見得成立。至少把資料切成前後兩段分別驗。 --- ## 相關頁 - [事件模型與策略撰寫](backtest-strategy.md):`on_init` 放參數、`self.char` - [績效報告](backtest-report.md):`rp.report` 的欄位定義 - [回測總覽](backtest.md)