此文章為VIP限定
帝牙盧卡有著控制時間的能力,被稱作時間之神。牠可以扭曲時間以讓時間加快或減慢甚至停止。
帕路奇亞擁有扭曲空間的能力,在神奧地區的神話裡被描述成神。它可以憑藉自己操縱空間的連接從而能夠移動到遠處的異空間~寶可夢
交易者和寶可夢訓練家的世界其實有異曲同工之妙,如果你收服「帝牙盧卡」和「帕路奇亞」,等同擁有掌握時間與空間的能力,在對戰上佔盡優勢。
在交易的世界裡,時間與空間指的是什麼呢?股海有句老話是「獲利是等出來的」,然而真的每個催化劑都適合等嗎?什麼樣的換股間隔才最適合?為什麼有些策略是用一週,有些用每月底?
在股價波動的空間裡,什麼樣的停損才適當?如何保留多數獲利、減低多數虧損?
如果你掌握投資市場分析時空序列的能力,等同在擁有犯規的神獸啊~
看過FinLab的「投信大哥跟屁蟲」教學影片了嗎?沒看過的人,請先趕緊去看。相信看過的人都能快速掌握 Python 語法,了解策略的設定,看完後再來學這篇文章進階的小工具,了解投信大哥跟屁蟲的秘密。
時間分析
為什麼投信大哥跟屁蟲換股是3天,而不是5天、10天、20天?
要分析其實很簡單,使用FinLab模組的 ReportCollection 即可取得回測報告集合,判斷策略組合數據優劣,從策略海中快速找到體質最強的策略。 也可以觀察在同條件下的策略疊加更多條件後會有什麼變化?以下程式範例將策略程式封裝成函數,變數為換股間隔,來跑跑看2~20天不同換股週期的回測效果。
from finlab.backtest import sim
from finlab import data
def run_strategy(interval:int):
close = data.get("price:收盤價")
vol = data.get('price:成交股數')
投信買賣超股數 = data.get('institutional_investors_trading_summary:投信買賣超股數')
c1 = 投信買賣超股數 >= 800000
c2 = 投信買賣超股數/vol >= 0.05
position = c1 & c2
position = position * close
position = position[position>0]
position = position.is_smallest(8)
# 每3個交易日再平衡,與resample='3D'差異在後者是隔3日,而非3個交易日。
position = position.loc[list(position.index)[::interval]]
report = sim(position,trade_at_price='open', position_limit=1/3, fee_ratio=1.425/1000/3, upload=False, mae_mfe_window=40)
return report
from finlab.optimize.combinations import ReportCollection
# 回測2~20間隔
reports = {i:run_strategy(i) for i in range(2,21)}
# 回測報告視覺化
collection = ReportCollection(reports)
collection.plot_creturns()
跑完後發現當間隔為3天時,累積報酬率明顯優於其他天數表現。為了更確認分析,我們可以再執行reports[3].display_mae_mfe_analysis()
來看 Edge Ratio (下圖第一排中間子圖)的表現,Edge Ratio 簡而言之是綜合交易時間與波動關係的判斷指標,可以發現投信策略在一開始進場就有優勢 (大於1) ,但優勢隨著持有時間 (x軸) 拉長急速下降,直到第20天後才又拉升到持有3天時的高峰,可見投信買賣超的因子在短期較具有影響性,考量換股效率,持有3天是不錯的選項,可以用多次小獲利不斷去滾。
空間分析
勝敗手MAE分佈圖
分析完時間,我們把換股週期3天保留下來,接下來要研究停損怎麼設定才好?好的停損是保留多數獲利,避免提早被洗掉,並能將大虧損變小虧損,降低損失,進而優化策略體質。
分析的第一步可以先看勝敗手的 MAE Distribution (若不知道 MAE ,請見此篇教學文章),MAE簡單說是每筆交易持有歷程的最大虧損。
數據呈現一樣用 display_mae_mfe_analysis() 可以叫出。我們將圖片放大來看,可以發現贏錢的交易(藍色)的第75百分位數很小,只有0.51%,代表多數贏錢的交易在持有過程中很少碰到虧損,而輸錢的交易(紅色)的第75百分位數也不大,只有 4.2%,代表有 25% 的虧損交易的 MAE 大於 4.2%。由上述分析,我們合適的停損應落於 0.51%~4.2% 之間,只要停損設超過 0.51%,就能保留多數獲利,因為這些少數的獲利交易才會超過 0.51%,而停損設小於 4.2% ,可以將MAE 高的標地往內縮,降低潛在損失。
停損回測集
依據上述分析,可以知道波動空間與合適的停損範圍大概在 0.51%~4.2%(可在後推一點)上下 ,我們一樣用前面示範過的方法,改將停損設定設為變數,再看停損哪一個數字最棒。FinLab 模組的 ReportCollection 有熱力圖與統計數據可以幫握們分析,使用方式如下:
from finlab.backtest import sim
from finlab import data
def run_strategy_with_stop_loss(stop_loss:float):
close = data.get("price:收盤價")
vol = data.get('price:成交股數')
投信買賣超股數 = data.get('institutional_investors_trading_summary:投信買賣超股數')
c1 = 投信買賣超股數 >= 800000
c2 = 投信買賣超股數/vol >= 0.05
position = c1 & c2
position = position * close
position = position[position>0]
position = position.is_smallest(8)
# 每3個交易日再平衡,與resample='3D'差異在後者是隔3日,而非3個交易日。
position = position.loc[list(position.index)[::3]]
report = sim(position,trade_at_price='open', position_limit=1/3, fee_ratio=1.425/1000/3, upload=False, mae_mfe_window=40, stop_loss=stop_loss)
return report
from finlab.optimize.combinations import ReportCollection
stop_loss_reports = {i/1000:run_strategy_with_stop_loss(i/1000) for i in range(0,50,5)}
stop_loss_collection = ReportCollection(stop_loss_reports)
stop_loss_collection.plot_creturns().show()
stop_loss_collection.plot_stats(mode='heatmap', heatmap_sort_by='daily_mean').show()
最終結果發現停損在 4.5% 的報酬率與夏普率效果最好,但很明顯可發現這個策略無論停損參數射哪一組,max_drawdown (最大回撤)都很大,超過 -40%,雖然年化報酬有 29%,但實戰上可能會扛不住大波動。
大盤時空
拉出報酬率序列來看,可以發現投信跟屁蟲策略在多頭時很猛,但在 2022 空頭時可能會碰上瘋狂停損的局面,台股中期回檔的 2015、2018 年份,該策略也有不小回檔,可能要加上大盤濾網來判斷市況是否適合順勢追擊。
於是我們可以考慮加上大盤濾網,由於投信策略屬於短線的策略,會偏好使用較靈敏的大盤指標:整體市場多空排列家數來判斷,想了解其他指標,可見「4種均線指標 | 讓你在大盤崩崩前高歌離席!」。可以發現雖然犧牲了報酬率,但回撤曲線大幅優化,年化報酬你要追求報酬率極大化,還是追求穩定度?
結論
是不是領略到「投信大哥跟屁蟲」背後的秘密了呢?趕緊把學到的招式用在你的策略,找找最適合的換股週期和停損設定,學會時空序列分析的技巧,真的會有寶可夢等級大幅提升的感覺啊!