文件
開啟 Studio

策略範例

大盤指標濾網

本頁內容4

大盤指標轉空時出清持股,可以避免在系統性下跌中持續承受損失。這個策略比較全市場多頭排列與空頭排列的股票家數來判斷大盤多空,作為個股策略的總開關。濾網寫成一個函數,可以搭配任何個股策略。

策略邏輯

  • 大盤多空排列:ls_order_position 函數統計全市場的股票家數:

    • 多頭排列:短均線 >= 中均線 >= 長均線
    • 空頭排列:短均線 < 中均線 < 長均線

    多頭排列家數大於空頭排列家數時,判定大盤偏多、允許持股;反之則出清。預設是短期 5 日、中期 10 日、長期 30 日均線。

  • 個股條件:簡單的動能策略,股價同時高於 20 日前與 60 日前的收盤價,代表短中期趨勢向上。

  • 最終持股:個股條件與大盤指標的交集,只有大盤偏多時,才持有符合動能條件的股票。

  • 換股:沒有指定 resample,預設每日換股。

完整程式碼

strategy.py
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()

report.display() 會畫出完整的回測報告。

怎麼調整

  • 均線天數 ls_order_position(short=5, mid=10, long=30):函數參數可以調整三條均線的天數,適應不同的市場節奏。
  • 個股條件 buy:ls_order_position() 是可重複使用的大盤濾網,把 buy 換成任何個股策略,再和它取交集即可。
  • 換股頻率:目前沒有設定 resample,每日換股;想降低頻率,在 sim() 加上 resample。

大盤指標使用市場寬度(breadth)的概念,比單純看指數均線更能反映整體市場狀態。

下一步

↑↓ 選擇 Enter 開啟 Esc 關閉