【量化分析】國安基金護盤績效探討

使用Python回測國安基金過往護盤的績效,同時分析跟隨八大行庫券商買賣超能否獲利。

本文關鍵字:國安基金、八大行庫、護盤績效、買賣超

本文重點概要

文章難度:★☆☆☆☆

前言

2022年,在烏俄戰爭及高通膨的背景下,物價上漲壓抑消費者之購買能力,進而影響企業整體獲利,導致全球陷入經濟衰退的疑慮。美國聯準會以升息循環應對高通膨問題,卻也造成股債市資金撤出,兩年前的QE 動能正式宣告終止。美國那斯達克及費城半導體指數均進行了 30% 以上的回檔修正,而臺灣加權指數也從年初最高的 18619 點,修正至7/12的13950點,修正幅度達 25%,加權指數在 7/12 大跌390點後,財政部正式授權國安基金進場護盤,此次為國安基金歷史第八次護盤,也是加權指數在萬點之上的第一次護盤行動。

國安基金簡介

全名:國家金融安定基金

主管機關:行政院

成立目的:即國家金融安定基金設置及管理條例第一條:為因應國內、外重大事件,以維持資本市場及其他金融市場穩定,確保國家安定。

資金來源&相關政府官員:

1. 以國庫所持有之公民營事業股票為擔保,向金融機構借款;借款最高額度新台幣二千億元。

2. 借用郵政儲金、郵政壽險積存金、勞工保險基金、勞工退休基金、公務人員退休撫卹基金所屬可供證券投資而尚未投資之資金;其最高額度新台幣三千億元。

總額上限:新台幣5000億元。

操盤手:委員會置委員十一人至十三人,其中一人為主任委員,由行政院副院長兼任,其餘委員由中央銀行總裁、財政部部長、交通部部長、行政院主計處主計長、行政院勞工委員會主任委員、銓敘部部長兼任及由主管機關就立法院各黨團推荐之學者、專家遴聘之。

何謂市場失序:

股市成交量委靡造成眾多賣股票者賣不掉、股市資金大幅外流、台灣股市相對其它亞洲股市有超大跌幅,股市大幅下跌牽動其他金融市場的恐慌。

國安基金過去七次進場歷史

國安基金的宗旨在於維持資本市場及其他金融市場穩定,由上表可見,國安基金共進場七次,往往在一個月內即可有效穩定指數,讓指數不再下跌,唯二兩次敗績發生於2000年10月的網路泡沫、以巴衝突以及2008年的全球金融海嘯,顯示國安基金在面臨全球性經濟因素利空時,確實力有未逮,但整體觀察下,國安基金仍是穩定股市的有效手段,特別是在面臨非經濟因素事件時,例如:319槍擊案的政治情勢不穩、新冠疫情爆發,只需很少的銀彈,便可有效穩定股市運作。
此次2022/07/13為國安基金第八次進場,原因為烏俄戰爭及全球經濟衰退疑慮。

國安基金熱門口袋名單

觀察過去四次國安基金的持股明細,發現有以下十支股票均是國安基金的口袋名單,我們將以下十檔股票依產業別分類:

金融股:2880華南金、2886兆豐金

科技股:2308台達電、2330台積電、2317鴻海、2382廣達

傳產股:1101台泥、1301台塑、1303南亞、1326台化

新聞常常提到,跟著國安基金明牌,便可有好的報酬,事實上真的是如此嗎?我們就以近四次護盤期間,針對以上十檔股票,探討其護盤期間報酬。

編輯環境及模組需求

本文使用Windows OS並以Jupyter作為編輯器

import tejapi
import pandas as pd
import numpy as np
tejapi.ApiConfig.api_base="Your Key"
tejapi.ApiConfig.ignoretz = True
plt.rcParams['font.sans-serif'] = ['Microsoft JhengHei']
plt.rcParams['axes.unicode_minus'] = False

資料庫使用

調整股價(日) — 除權息調整(TWN/APRCD1)
主要券商進出明細-股票別 (AMTOP1)

資料導入

資料期間為第七次國安基金護盤期間
取得大盤報酬指數。

#第七次國安基金進場
mdate = {'gte':'2020-03-20', 'lte':'2020-10-12'}
#八大行庫券商
bank = ["000102 合庫證券","000538 第一金證","000104 臺銀證券","2801 彰銀","2834 臺企銀","5857 土銀","000930 華南永昌證券","000700 兆豐證券"]

取得國安基金熱門口袋名單股價。

#國安基金熱門標的
coid = ["1101","1301","1303","1326","2308","2317","2330","2382","2880","2886"]
for i in range(0,len(coid)):

stock = tejapi.get('TWN/APRCD1',
coid = coid[i],
mdate = mdate,
paginate=True)
df1 = pd.DataFrame({"日期":stock["mdate"],str(coid[i]):stock["close_adj"]})
#以日期做合併
df = pd.merge(df,df1,left_on="日期",right_on="日期",how="outer")
df

個股績效計算,公式:(每天股價-國安基金進場第一天股價)/國安基金進場第一天股價。

#算個別個股績效
#(每天股價-國安基金進場第一天股價)/國安基金進場第一天股價
df2 = (df.iloc[:, 1:] - df.iloc[0, 1:].values.squeeze()).div(df.iloc[:, 1:])
#四捨五入
df2 = df2.astype(float).round(3)
df_result = pd.DataFrame({"日期":df["日期"]})
df_result = pd.merge(df_result,df2,left_on=None,right_on=None,left_index=True,
right_index=True)
df_result
df = df_resultimport matplotlib.pyplot as pltdf.set_index(pd.to_datetime(df["日期"], format="%Y-%m-%d"), inplace=True)
del(df["日期"])
plt.rcParams['font.sans-serif'] = ['Microsoft JhengHei']
plt.rcParams['axes.unicode_minus'] = False
#畫圖
fig, ax1 = plt.subplots(figsize=(20, 10))
plt.plot(df.index,df[coid],lw=1.5,label=coid)
plt.plot(df.index,df["大盤"],lw=5,label="大盤",color="blue")
plt.xlabel("日期",fontsize=20)
plt.ylabel("累積報酬",fontsize=20)
plt.xticks(fontsize=20)
plt.yticks(fontsize=20)
plt.title("第七次國安基金熱門標的股價表現與大盤比較",fontsize=30)
plt.legend(bbox_to_anchor=(1, 1.0))
plt.show()

以上四次熱門股進場結果發現,國安基金照顧的標的在護盤期間的表現不一定優於大盤,熱門股名單中唯有2330台積電,四次護盤期間的累積報酬均擊敗大盤,所以當國安基金進場時,我們無須按照國安基金以往的標的做篩選,被動追蹤加權指數的ETF,如:0050,會是更穩定的選擇。

八大行庫買賣超績效

由於國安基金的進出場與持股明細,均受到嚴格保密,民眾只能在國安基金宣布護盤結束後,由財政部發布之國安基金財報中,才可看到護盤期間損益及持股,護盤期間內唯一能追蹤國安基金動向的方法便是從八大行庫買賣超著手,但由於在八大行庫進出的不只國安基金,也有一般大戶與散戶投資人,這無疑大大增加追蹤的難度。

資料導入

資料期間為第七次國安基金護盤期間
取得大盤報酬指數
取得八大行庫護盤期間賣賣超

#第七次國安基金進場
mdate = {'gte':'2020-03-20', 'lte':'2020-10-12'}
#八大行庫券商
bank = ["000102 合庫證券","000538 第一金證","000104 臺銀證券","2801 彰銀","2834 臺企銀","5857 土銀","000930 華南永昌證券","000700 兆豐證券"]
#國安基金熱門標的
coid = ["1101","1301","1303","1326","2308","2317","2330","2382","2880","2886"]

國安基金熱門股股價表現與八大券商淨買賣總金額之相關性

cor = []
for i in coid:

#-------------------------------------------------------------------
#個股股價
market = tejapi.get('TWN/APRCD1',
coid = i,
mdate = mdate,
paginate=True)
#累積買賣超
df = pd.DataFrame({"日期":market["mdate"],"股價":market["close_d"]})
#-------------------------------------------------------------------
#個股券商買賣超
data = tejapi.get('TWN/AMTOP1',
coid = i,
mdate = mdate,
paginate=True)
#-------------------------------------------------------------------
for i in range(0,len(bank)):
#選出八大券商
broker = bank[i]
data1 = data[data["key3"] == broker]

bs_data = data1[["mdate","bs_m"]]
bs_data = bs_data.rename(columns={"mdate": '日期',"bs_m": str(broker)})
#算出八大券商期間累積買賣超
df = pd.merge(df,bs_data,left_on="日期",right_on="日期",how="outer")
df[str(broker)] = df[str(broker)].fillna(0)
bs_m_list = list(df[str(broker)])
agg = []
n = 0
for j in range(0,len(bs_m_list)):
n = n + bs_m_list[j] #每日淨買賣
agg = agg + [n] # #每日加總
df[str(broker)] = agg
#八大券商買賣總金額
df_total = pd.DataFrame({"股價":market["close_d"],
"八大淨買賣總和":df[bank].sum(axis=1)})
#標準化
from sklearn.preprocessing import StandardScaler
df_total[df_total.columns] = StandardScaler().fit_transform(df_total[df_total.columns])
#相關性
df_total_cor = round(df_total['股價'].corr(df_total["八大淨買賣總和"]),2)
cor = cor + [df_total_cor]
df_cor = pd.DataFrame({"股票":coid,"相關係數":cor})
df_cor

將個股股價表現與八大券商累積買賣超金額以圖表呈現,以不同產業的2308、2886和1303為例

#輸入個股代碼
coid = "2308"
#個股股價
market = tejapi.get('TWN/APRCD1',
coid = coid,
mdate = mdate,
paginate=True)
df = pd.DataFrame({"日期":market["mdate"],"股價":market["close_d"]})#---------------------------------------------------------------------------
#個股券商買賣超
data = tejapi.get('TWN/AMTOP1',
coid = coid,
mdate = mdate,
paginate=True)
for i in range(0,len(bank)):broker = bank[i]
data1 = data[data["key3"] == broker]
bs_data = data1[["mdate","bs_m"]]
bs_data = bs_data.rename(columns={"mdate": '日期',"bs_m": str(broker)})
#累積買賣超
df = pd.merge(df,bs_data,left_on="日期",right_on="日期",how="outer")
df[str(broker)] = df[str(broker)].fillna(0)
bs_m_list = list(df[str(broker)])
agg = []
n = 0
for j in range(0,len(bs_m_list)):
n = n + bs_m_list[j] #每日淨買賣
agg = agg + [n] # #每日更新
df[str(broker)] = agg
df["八大淨買賣總和"] = df[bank].sum(axis=1)df
df.set_index(pd.to_datetime(df["日期"], format="%Y-%m-%d"), inplace=True)
del(df["日期"])
plt.rcParams['font.sans-serif'] = ['Microsoft JhengHei']
plt.rcParams['axes.unicode_minus'] = False
#畫雙軸圖
fig, ax1 = plt.subplots(figsize=(20, 10))
plt.plot(df.index,df[bank],lw=1.5,label=bank)
plt.plot(df.index,df["八大淨買賣總和"],lw=5,label="八大淨買賣總和")
plt.xlabel("日期",fontsize=20)
plt.ylabel("累積買賣超(元)",fontsize=20)
plt.xticks(fontsize=20)
plt.yticks(fontsize=20)
plt.title(str(coid)+" 國安基金期間八大券商累積買賣超關係圖",fontsize=30)
plt.legend(bbox_to_anchor=(-0.05, 1.0))
ax2 = ax1.twinx()
plt.plot(df.index,df["股價"],lw=5,label=str(coid)+"股價")
plt.ylabel("股價(元)",fontsize=20)
plt.yticks(fontsize=20)
plt.legend(bbox_to_anchor=(1, 1.0))
plt.show()

我們從金融、科技、傳產,三大產業挑了三檔個股進行討論,分別為2886兆豐金、2308台達電、1303南亞,發現八大券商淨買賣總和在3–5月中這段期間內,買賣超總金額都是增加的,隨著國安基金護盤效果顯現,台股市場穩定逐漸穩定,科技股2308台達電後續股價上漲階段,八大行庫呈現賣超情形,2886兆豐金、1303南亞在護盤期間股價表現較為溫吞,八大券商便持續買超。
由上圖可更清楚發現,股價與八大行庫買賣超不成正比,甚至有反比的情形,但這也與國安基金的宗旨相符,以達到市場穩定為目標。

結論

國安基金身為台股市場一雙看不見的黑手,對穩定市場情緒及投資人信心有著顯著影響力,本篇文章針對大眾對國安基金事件的一些看法提出了不一樣的觀點

1. 國安基金熱門股的股價表現未必能打敗大盤,投資大盤為較安穩之選擇。

2. 八大行庫的淨買賣金額總和與股價表現較不成正比,但可推測國安基金穩定市場之宗旨。

國安基金雖時常能在新聞稿發布後的短期內穩定市場,但針對國際環境之經濟衰退也曾有護盤後股市仍持續下跌的情況,投資人仍應謹慎判斷當前市場概況、總體經濟,不應僅靠國安基金護盤消息便盲目進場。
最後,我們附上目前進行中的國安基金第八次護盤,上述熱門股票與大盤的表現比較圖,供讀者參考。

最後,還是要再次提醒本文所提及之標的僅供說明使用,不代表任何金融商品之推薦或建議。因此,若讀者對於建置策略、績效回測、研究實證等相關議題有興趣,歡迎選購 TEJ E Shop中的方案,具有齊全的資料庫,就能輕易的完成各種檢定。

完整程式碼

延伸閱讀

相關連結

給我們鼓勵
之後會持續分享更多財金資料庫的應用
如果你的覺得今天的文章不錯,可以幫我們在下面的
掌聲 icon 點 1下
如果覺得超讚,可以按住
掌聲 icon 不放直到 50 下
有任何想法歡迎點選
留言 icon和我們討論

--

--

新手上路|Rookie / 資料科學|Data Analysis / 量化分析|Quant / 實戰手冊|Application

Get the Medium app

A button that says 'Download on the App Store', and if clicked it will lead you to the iOS App store
A button that says 'Get it on, Google Play', and if clicked it will lead you to the Google Play store
TEJ 台灣經濟新報

TEJ 為台灣本土第一大財經資訊公司,成立於 1990 年,提供金融市場基本分析所需資訊,以及信用風險、法遵科技、資產評價、量化分析及 ESG 等解決方案及顧問服務。鑒於財務金融領域日趨多元與複雜,TEJ 結合實務與學術界的精英人才,致力於開發機器學習、人工智慧 AI 及自然語言處理 NLP 等新技術,持續提供創新服務