大盤指標濾網
大盤指標轉空時出清持股,避免在系統性下跌中持續承受損失。本策略透過比較市場中多頭排列與空頭排列的股票家數,判斷大盤多空方向,作為個股策略的總開關。
策略邏輯
大盤多空排列指標
定義一個 ls_order_position 函數,統計全市場中:
- 多頭排列:短均線 >= 中均線 >= 長均線 的股票家數
- 空頭排列:短均線 < 中均線 < 長均線 的股票家數
當多頭排列家數大於空頭排列家數時,判定大盤偏多,允許持股;反之則出清。預設參數為短期 5 日、中期 10 日、長期 30 日均線。
個股選股條件
個股層面使用簡單的動能策略:股價同時高於 20 日前與 60 日前的收盤價,代表短中期趨勢向上。
最終持股為個股條件與大盤指標的交集:只有在大盤偏多時,才會持有符合動能條件的個股。
程式碼
from finlab import data
from finlab.backtest import sim
import numpy as np
import pandas as pd
# 市場多空排列家數
def ls_order_position(short=5, mid=10, long=30):
close = data.get("price:收盤價")
short_ma = close.average(short)
mid_ma = close.average(mid)
long_ma = close.average(long)
long_order = (short_ma >= mid_ma) & (mid_ma >= long_ma)
long_order = long_order.sum(1)
short_order = (short_ma < mid_ma) & (mid_ma < long_ma)
short_order = short_order.sum(1)
entry = long_order > short_order
cond = ~close.isna()
position = cond & entry
return position
close = data.get("price:收盤價")
# 多頭排列
buy = (close > close.shift(20)) & (close > close.shift(60))
# 套入大盤指標
position = buy & ls_order_position()
report = sim(position, upload=False)
report.display()
策略特色
ls_order_position是一個可重複使用的大盤濾網函數,可搭配任何個股策略- 函數參數可調整均線天數(
short、mid、long),適應不同的市場節奏 - 大盤指標使用市場寬度(breadth)概念,比單純看指數均線更能反映整體市場狀態
- 未指定
resample參數,預設為每日換股 - 此濾網在空頭市場可有效減少虧損,但在震盪盤中可能產生較多進出訊號