Plotly-Sunburst|輕鬆監控多策略部位|DashBoard 應用教學(5)

  • Post author:
  • Reading time:7 mins read

開發動機

你的 FinLab 量化平台的策略儀表板上是不是有很多豐富的策略呢?
如果答案為是,代表你很棒,嘗試了許多量化策略的實驗,有些策略拿來實驗想法、有些是真的拿來實戰。這時你可能會有下面幾個問題想處理,我想監控儀表板上真正拿來實戰的策略,看每個策略綜整後的部位為何?策略們的標的集中在哪些類股?哪些標的被多個策略同時選中或是比重最大?這時 Sunburst (旭日圖) 可能是你監控策略部位最好的資料視覺化武器之一,FinLab 已開發好工具了!來看看怎麼使用吧!

Sunburst 是怎樣的圖表?

Sunburst 是圓餅圖的進化版,可以顯示分層數據的比例關係,不同的子資料對應於不同級別層次結構,你可以想成是 Treemap 的變化版,都可以使用面積與顏色呈現不同維度的資料,Sunburst 與 Treemap 的差異在允許子資料缺角,不一定要填滿,像是以下的圖例,使用起來比 Treemap 更有彈性,Treemap 就一定要填滿部位。

newplot 11
Sunburst 缺角圖https://plotly.com/python/sunburst-charts/

Plotly-Sunburst 基礎教學

圖例

plotly 官方文件提供了多元的 Sunburst 範例程式,我們的多策略部位 Sunburst 會以色階型態的 Sunburst 範例為底,用色階變化呈現漲跌幅度,用面積顯示部位權重。

newplot 13
色階型 SunBurst

程式解構

import plotly.express as px
import numpy as np
df = px.data.gapminder().query("year == 2007")
fig = px.sunburst(df, path=['continent', 'country'], values='pop',
                  color='lifeExp', hover_data=['iso_alpha'],
                  color_continuous_scale='RdBu',
                  color_continuous_midpoint=np.average(df['lifeExp'], weights=df['pop']))
fig.show()

plotly.express 提供了高封裝程度的 API,讓我們可以用簡單的語法來繪圖,插入資料以 dataframe 來控制。接著說明一下 sunburst 裡的重要參數。

  • path:sunburst 分層路徑,list 資料是 dataframe 裡的欄位名稱,先後順序代表由裡到外的層級。
  • values:決定圓餅面積比例的欄位。
  • colors:決定圓餅色階的欄位。
  • hovers:游標滑過區塊部位時,想外加的顯示欄位。
  • color_continuous_scale:色階條樣式,RdBu 是常用樣式,可以自選其他樣式
  • color_continuous_midpoint:色階中間決定斷點,用來控制色階深淺區間,範例是取平均壽命當中間點。

StrategySunburst 物件教學

finlab.plot.StrategySunburst()
提供了多策略的資料處理與視覺化功能,並將 plotly sunburst 的繪圖功能包裝進來。

獲取多策略資料

可以用s_data屬性連結到finlab.data.get_strategies(), 取得已上傳的策略資料,像是每個策略的報酬率曲線、策略報酬率統計、近期部位、近期換股日等等,就不用一個個策略回測取得,直接一把抓,並藉由以下範例取得策略名稱和單一策略部位,策略名稱會用於之後繪圖所用的策略框定。
取得策略名稱的範例如下:

from finlab.plot import StrategySunburst

# 實例化物件
strategies = StrategySunburst()
s_data = strategy.s_data
print(f'已上傳的策略名稱:{s_data.keys()}')

獲取繪圖資料

StrategySunburst().get_strategy_df(select_strategy=None)

StrategySunburst 下的 get_strategy_df 方法可獲取繪圖資料所用的 dataframe,

參數說明如下:

  • select_strategy (dict):選取的策略與策略對應權重,預設是策略全選,權重為每個策略的資金比例平均。也可以自訂匡選的策略,像若是只想看兩個實戰的策略,並分別設定6成語4成資金比重,可以這樣設定:{‘低波動本益成長比’:0.6,’研發魔人’:0.4}。若有現金的空部位想加入資產配置,可以設定如下,策略名稱為現金,即可創造現金部位 {‘低波動本益成長比’:0.5,’研發魔人’:0.2, ‘現金’:0.2}。

回傳的 dataframe 中,資料欄位 ‘market’ 為資產所屬的市場,目前有 tw_stock (台股) 或 crypto (加密貨幣) 或 現金 選項。

Sunburst 繪圖

from finlab.plot import StrategySunburst

# 實例化物件
strategies = StrategySunburst()

strategies.plot().show()
strategies.plot(select_strategy={'高殖利率烏龜':0.5,'營收強勢動能瘋狗':0.3,'現金流價值成長':0.2}).show()
strategies.plot(select_strategy={'高殖利率烏龜':0.4,'營收強勢動能瘋狗':0.25,'現金流價值成長':0.2,'現金':0.15},path =  ['market', 'category','stock_id','s_name']).show()

StrategySunburst().plot(select_strategy=None, path=None, color_continuous_scale='RdBu_r')

StrategySunburst 下的 plot 方法提供了繪圖設定,使用短短的程式碼就可以顯示多策略部位圖表。參數承襲 plotly.express.sunburst ,說明如下:

  • select_strategy (dict):設定選取的策略與策略對應的持股現值權重,預設策略是策略全選,權重策略數的平均值。也可以自訂匡選的策略,像是只想看兩個實戰的策略,並分別設定6成與4成持股現值比重,可以設定成 {'低波動本益成長比':0.6,'研發魔人':0.4} 。若有現金的空部位想加入資產配置,可以設定成 {'低波動本益成長比':0.5,'研發魔人':0.2, '現金':0.2} ,策略名稱為現金,即可創造現金部位。
  • path (list):sunburst 分層路徑,預設由裡到外的分層是 ['s_name', 'market', 'category', 'stock_id'] ,可以觀察策略持有哪些類股為主。你可以自動設定分層,會有不同的效果,像是也可以設成 ['category','stock_id','s_name'] 變成可以看標的被哪些策略同時選到。
  • color_continuous_scale (str):預設為'RdBu_r',可以自選其他樣式

繪圖範例

from finlab.plot import StrategySunburst

# 實例化物件
strategies = StrategySunburst()

# 範例1
strategies.plot().show()
# 範例2
strategies.plot(select_strategy={'高殖利率烏龜':0.5,'營收強勢動能瘋狗':0.3,'現金流價值成長':0.2}).show()
# 範例3
strategies.plot(select_strategy={'高殖利率烏龜':0.4,'營收強勢動能瘋狗':0.25,'現金流價值成長':0.2,'現金':0.15},path =  ['market', 'category','stock_id','s_name']).show()

範例1

strategies.plot().show()

不帶任何參數會顯示全部的已上傳策略部位,策略資金分配比率為策略平均分配。

範例2

strategies.plot(select_strategy={'高殖利率烏龜':0.5,'營收強勢動能瘋狗':0.3,'現金流價值成長':0.2}).show()

自選3個策略,設定不同權重,看策略比重、策略持股的產業分佈。面積越大代表市值權重越大。顏色越紅代表上漲幅度越大,越藍代表跌幅越大。點擊策略可以做圖表互動,放大可只看單一策略的 sunburst (右圖),從圖表觀察到營收策略選到三檔網通股,佔比最大,獲利最高的是6470 宇智,網通族群可能有營收趨勢翻多的群聚性。若是某些族群佔比超過 50% 以上,可能要反過來思考策略是不是太過於相似?可能會有標的不夠分散的風險。

範例3

strategies.plot(select_strategy={'高殖利率烏龜':0.4,'營收強勢動能瘋狗':0.25,'現金流價值成長':0.2,'現金':0.15},path = ['market', 'category','stock_id','s_name']).show()


自選3個策略並設定現金權重,設定不同權重,除了看策略持股的產業分佈,也可看看標的被哪些策略同時選到。像圖中的 4572 駐龍同時被兩個策略選到,可能是非常厲害的標的喔!

newplot 18

結論

Plotly – Sunburst 是不是十分絢麗呢!可以作多層次是覺化呈現及圖表互動。利用 FinLab 套件的 StrategySunburst 可以很輕鬆地將多策略資料漂亮地呈現出來,並觀察裡面的 insight,當作其中一個管理多策略的工具,不同的繪圖參數設定能玩出不同的效果,趕快來試試吧!

colab 範例檔連結

Ben

Python 軟體工程師與量化策略研究員。 鑽研資料工程、網頁後端、資料視覺化、量化交易策略開發。 投資主力在台股市場,量化策略為主、質化分析為輔,追求人機攜做最佳化。逐步將觸角延伸到總經、美股、加密貨幣,朝更全方位的交易人邁進。