2022 可說是亂世風雲,中國防疫政策、俄烏戰爭、通膨、美國大幅升息、企業庫存暴增…等等利空連發重挫市場,許多市場指數到 2022年10月都回檔30%,台股也在護國神山走山下,從 18000 點下殺到 13000 點以下,明顯跌入熊市。
令人不安的是救市神主牌國安基金在 2022/7/12 已進場護盤,卻仍止不住跌勢,被質疑是否過早進場送頭?如果連最後一張王牌都無法扛住,那確實麻煩大了。
本篇文章將用 Finlab 模組 與 Pandas 實作 國安基金與庫藏股 的簡易趨勢分析,讓你更加熟悉 Pandas 各種財經時序資料處理的手法。最後輸出的結果,我們會看到國安基金這次是否和以往不一樣?
庫藏股資料處理
透過FinLab資料庫,我們可取得庫藏股資訊,在之前的「庫藏股實施家數|崩盤後的長線抄底訊號|左側交易」文章中有相關實作,不過上篇是用「董事會決議庫藏股的日期」當訊號,這次換示範另一種寫法,使用「庫藏股實施期間」來當訊號,更能精準反應當下有在護盤的公司大概的總家數。
程式範例
import pandas as pd
from finlab import data
預定買回期間_起 = data.get('treasury_stock:預定買回期間-起').unstack()
預定買回期間_迄 = data.get('treasury_stock:預定買回期間-迄').unstack()
# date 為董事會決議庫藏股日期
treasury_stock = pd.DataFrame({'預定買回期間_起':預定買回期間_起, '預定買回期間_迄':預定買回期間_迄}).dropna(how='all')
treasury_stock.index.names = ['stock_id', 'date']
# 產生實施期間序列
treasury_stock['period'] = [pd.date_range(s,e).to_list() for s,e in zip(treasury_stock['預定買回期間_起'],treasury_stock['預定買回期間_迄'])]
# 使用 explode 展開資料
treasury_stock_period = treasury_stock.explode('period')
treasury_stock_period = treasury_stock_period[['period']]
# 計算每日預計實施庫藏股的公司家數
treasury_count = treasury_stock_period.groupby(['period'])['period'].count()
benchmark = data.get('benchmark_return:發行量加權股價報酬指數')
# 日期索引對應加權大盤報酬指數
treasury_count = treasury_count.reindex(benchmark.index).fillna(0)
treasury_count.plot()
程式說明
- 組裝資料
將「預定買回期間起迄」兩份資料使用 unstack 方法 將格式從 pivot 轉換成 Series,再組裝成 DataFrame。 - 產生庫藏股實施日日期序列
將開始與結束日期傳入 date_range 方法,得到日期序列。 - 統計每日預計實施庫藏股的公司家數
在使用 groupby 與 count 統計每日總家數前,要先使用 explode 方法展開上一個步驟得到的日期資料。 - 日期索引重置
為了等一下畫圖顯示趨勢,將庫藏股家數趨勢的日期對應加權大盤報酬指數,讓兩條序列長度一致,方便呈現。 - 簡易繪圖檢視
最後使用dataframe內建的 plot 方法,呈現剛剛整理的數據
取得國安基金資料
現在 FinLab 的資料庫可以取得國安基金的進出場基本資訊了,詳見資料庫說明。
簡單一行就能取出囉 data.get('national_security_fund')
目前國安基金共啟動8次。
趨勢繪圖
將國安基金實施期間與庫藏股趨勢疊合,比較兩者訊號時間點。
程式範例
import plotly.graph_objects as go
from plotly.subplots import make_subplots
# Create figure with secondary y-axis
fig = make_subplots(specs=[[{"secondary_y": True}]])
# Add traces
fig.add_trace(
go.Bar(x=treasury_count.index, y=treasury_count.values, marker_color='navy',name="庫藏股實施家數"),
secondary_y=False,
)
fig.update_traces(marker_color = 'rgba(0,0,250, 0.5)',
marker_line_width = 0,
selector=dict(type="bar"))
# 大盤指數
fig.add_trace(
go.Scatter(x=benchmark.index, y=benchmark['發行量加權股價報酬指數'],line = dict(color = '#2C191B'), name="發行量加權股價報酬指數"),
secondary_y=True,
)
# 國安基金實施期間
for i,row in national_security_fund.iterrows():
fig.add_vrect(x0=row['啟動時間'], x1=row['退場時間'],
annotation_text=row['時空背景'], annotation_position="top left",
fillcolor="green", opacity=0.25, line_width=0)
# Add figure title
fig.update_layout(
title={
'text': "庫藏股與國安基金護盤趨勢",
'x': 0.49,
'y': 0.9,
'xanchor': 'center',
'yanchor': 'top'},
legend=dict(
orientation="h",
yanchor="bottom",
y=1.02,
xanchor="right",
x=0.3
)
)
# Set x-axis title
fig.update_xaxes(title_text="date",
rangeselector=dict(
buttons=list([
dict(count=1,
label="1y",
step="year",
stepmode="backward"),
dict(count=3,
label="3y",
step="year",
stepmode="backward"),
dict(count=5,
label="5y",
step="year",
stepmode="backward"),
dict(count=10,
label="10y",
step="year",
stepmode="backward"),
dict(step="all")
])
),
rangeslider=dict(
visible=True
),
type="date")
# Set y-axes titles
fig.update_yaxes(title_text="<b>count</b>", secondary_y=False)
fig.update_yaxes(title_text="<b>benchmark</b>", secondary_y=True,showgrid=False)
fig.show()
救市趨勢分析
政府救市三步
通常政府救市的步驟如下
1.鼓勵企業實施庫藏股
2.限空令 or 找法人喝咖啡
3.國安感冒糖漿(國家金融安定基金)
庫藏股對政府最省事,因為不用自己出一毛錢就可能有效果,當然別人先動手最好。
企業內部人往往對自家公司價值最了解,有些又有質押股票面臨市值下修的壓力。一般來說,庫藏股這類回燒公司資金的事,經營者多會考量價格是否合理(進入低檔)才買入。
從圖表發現,前幾次國安基金進場前,庫藏股家數(藍柱)都會先明顯變多,內部人護盤也撐不住了,國家隊才會進場。
但這次很不一樣,雖然政府在7月初已經 鼓勵企業實施庫藏股,卻沒啥公司響應,於是殺盤持續。即使現在跌多,庫藏股仍靜悄悄,是不是股價不到公司派目標價 (前幾年噴太多)?還是公司派看到未來景氣風險,要保留資金過冬?
還沒等到公司派進場,政府軍這次等不及了,先啟動國安基金,發現還是抵擋不住殺盤,才再祭出「限空令」,SOP似乎和以前不一樣,就怕大招放完後仍抵擋不住,這次沒庫藏股先擋第一線,要自己多扛一點。
如果政府招式出盡後,還是繼續殺呢?那很可能國安基金這個六連勝的底部訊號也會失效,讓我們繼續看下去 ~
下一篇來教大家怎麼將庫藏股和國安基金進出場化作大盤風險濾網加入策略。
程式範例檔
colab連結
註冊 FinLab 量化平台 VIP 才能取得全時段數據喔。