国安基金护盘绩效探讨

Photo by Wance Paleri on Unsplash

 

本文重点概要

文章难度:★☆☆☆☆

前言

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_result
import matplotlib.pyplot as plt
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[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
第七次护盘期间,2308股价与八大行库买卖超
第七次护盘期间,2308股价与八大行库买卖超
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. 八大行库的净买卖金额总和与股价表现较不成正比,但可推测国安基金稳定市场之宗旨。

国安基金虽时常能在新闻稿发布后的短期内稳定市场,但针对国际环境之经济衰退也曾有护盘后股市仍持续下跌的情况,投资人仍应谨慎判断当前市场概况、总体经济,不应仅靠国安基金护盘消息便盲目进场。
最后,我们附上目前进行中的国安基金第八次护盘,上述热门股票与大盘的表现比较图,供读者参考。

第八次护盘:2022/07/13~2022/11/08,持续进行中
第八次护盘:2022/07/13~2022/11/08,持续进行中

最后,还是要再次提醒本文所提及之标的仅供说明使用,不代表任何金融商品之推荐或建议。因此,若读者对于建置策略、绩效回测、研究实证等相关议题有兴趣,欢迎选购 TEJ E Shop中的方案,具有齐全的资料库,就能轻易的完成各种检定。

完整程式码

延伸阅读

相关连结

返回总览页