興櫃轉上市櫃「甜蜜期」

Photo by Shane on Unsplash

本文重點概要

  • 文章難度:★★☆☆☆
  • 閱讀建議:本文會利用 Python 進行資料挑選整理分類,接著實作視覺化過程,需要讀者對視覺化以及程式有基本認識。

前言

在投資論壇中常有一些常見的投資法或是交易策略等等,其中就好比跟隨大戶法人做買賣、又好比買量不賣量等術語,而我們今天就是要探究人人口耳相傳的甜蜜期是否真有其事,而這些甜蜜期對於交易來說是否存在效率,還是只是大眾的一種謬論?

編輯環境及模組需求

本文使用 Window10 並以 Spyder 作為編輯器

###coding三寶
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
plt.rcParams['axes.unicode_minus'] = False
plt.rcParams['font.sans-serif'] = ['Microsoft JhengHei']
###API串接套件
import tejapi
import time
tejapi.ApiConfig.api_key="YOUR KEY"
tejapi.ApiConfig.ignoretz = True###時間欄位忽略時區

資料庫使用

TEJ API 公司基本資料:資料庫代碼為(TWN/AIND),「TSE產業別」

TEJ PRO 資料庫 :新上市(櫃)首次承銷

資料導入

本文資料取自TEJ PRO資料庫,在本機端讀取,公司資料從1970年到2022年

df = pd.read_excel('C:/Users/user/Desktop/Tej/PreIPO.xlsx')
部分資料
部分資料
部分資料
部分資料

首先將需要的資料欄位選取出來即可,接著先創造一個Dataframe(A3)將收盤價取出來跑迴圈計算報酬率,最後將欄位名字改成報酬率,刪除第一天收盤價再合併公司名稱及代號。

A1 = df[['代號','名稱','上市日收盤價(元)','上市日後一天收盤價(元)','上市日後二天收盤價(元)','上市日後三天收盤價(元)','上市日後四天收盤價(元)','上市日後五天收盤價(元)']]
A2 = A1[['上市日收盤價(元)','上市日後一天收盤價(元)','上市日後二天收盤價(元)','上市日後三天收盤價(元)','上市日後四天收盤價(元)','上市日後五天收盤價(元)']]
A3 = A2.copy()
for i in range(1, len(A2.columns)):
    A3.iloc[:,i:i+1] = ((A2.iloc[:,i:i+1].values)/(A2.iloc[:,0:1].values))-1
A3 = A3.rename(columns={'上市日後一天收盤價(元)' : '後一日累積報酬率%',
                        '上市日後二天收盤價(元)' : '後二日累積報酬率%', 
                        '上市日後三天收盤價(元)' : '後三日累積報酬率%', 
                        '上市日後四天收盤價(元)' : '後四日累積報酬率%', 
                        '上市日後五天收盤價(元)' : '後五日累積報酬率%'}, inplace = False)
data = A3.drop('上市日收盤價(元)',axis=1)
data1 = A1.join(data, how = "left")
計算出之報酬率
計算出之報酬率

接著以代號製作一個List來撈取TEJ API產業別,並將撈取出來的資料公司簡稱的欄位名改成代號,方便我們後續去做合併資料的動作,其中又必須刪掉一些特別的產業別代號,原因是可能該產業的樣本太少,或是性質特殊因而排除。

產業別對照表
產業別對照表
Company = A1['代號'].to_list()
Detail = tejapi.get('TWN/AIND', chinese_column_name = True , paginate = True, coid = Company,
                    opts={'columns':['coid','ind1']}) # 舊產業名
Detail = Detail.rename(columns={"公司簡稱" : "代號"}, inplace = False)

qq = Detail[Detail['TSE 產業別'] != "17" ]
qq = qq[qq['TSE 產業別'] != "14" ]
qq = qq[qq['TSE 產業別'] != "19" ]
qq = qq[qq['TSE 產業別'] != "20" ]
qq = qq[qq['TSE 產業別'] != "80" ]
qq = qq[qq['TSE 產業別'] != "32" ]
qq = qq[qq['TSE 產業別'] != "33" ]
qq = qq[qq['TSE 產業別'] != "34" ]
qq = qq[qq['TSE 產業別'] != "91" ]

最後將篩選出來的產業合併先前計算出的報酬率,得到我們需要的興櫃成功上市櫃的公司。

PreIPO = data1.merge(qq, on='代號')

最後就是來繪圖了,首先要先將存在NA值得資料刪除,並利用產業別來當作標的,分別計算該產業所擁有的勝率,所謂勝率就是凡只要報酬率為正值的公司就算被納入,最後在除上該產業所對應的Total公司。

PreIPO = PreIPO.dropna(axis=0,how='any') # 清空NA
industry_name = np.unique(PreIPO[['TSE 產業別']])
payoff = np.array(['後一日累積報酬率%','後二日累積報酬率%','後三日累積報酬率%','後四日累積報酬率%','後五日累積報酬率%'])
industry_number = len(PreIPO.groupby('TSE 產業別').count())
save_IPO = list()
for i in range(industry_number):
    for j in range(len(payoff)):        
        positive_payoff = len(PreIPO[(PreIPO['TSE 產業別'] == industry_name[i]) & (PreIPO[payoff[j]] > 0)])
        total_number = len(PreIPO[(PreIPO['TSE 產業別'] == industry_name[i])])
        save_IPO.append(f'{round(positive_payoff/total_number*100,2)}')

接著就畫圖,詳細Code請看尾頁的完整程式碼。

上市櫃勝率
上市櫃勝率

上圖要表達的是,可以很明顯看到勝率高的產業是甚麼,但由於因為資料庫的資料若用中文顯示於圖檔中將更難以查閱,可能擠在一起,因此小編手寫並將產業調整的時間也一併寫上,我們發現上市櫃擁有甜蜜期的公司以電器電纜勝率最高。若追求以勝率為效率之投資者即可參考本圖結果。

再來我們要計算產業的平均報酬率

PreIPO = PreIPO.dropna(axis=0,how='any') # 清空NA
industry_name = np.unique(PreIPO[['TSE 產業別']])
payoff = np.array(['後一日累積報酬率%','後二日累積報酬率%','後三日累積報酬率%','後四日累積報酬率%','後五日累積報酬率%'])
industry_number = len(PreIPO.groupby('TSE 產業別').count())
save_IPO = list()
for i in range(industry_number):
    for j in range(len(payoff)):        
        industry_payoff = PreIPO[payoff[j]][PreIPO['TSE 產業別']==industry_name[i]].mean()
        save_IPO.append(f'{round(industry_payoff*100,2)}')
上市櫃報酬率
上市櫃報酬率

上圖則是要表達的是,我們發現有些產業所獲得得報酬率,依據天數的增加所獲得的報酬率波動較高,有些波動較小。就以勝率最高的電器電纜來說,他勝率高風險波動也小,然而勝率也跟電器電纜差不多的橡膠業,波動度卻比電器電纜高。

結論

因此若我們選擇以此為一種投資策略來操進行短線操作,其實可以篩選自己適合的風格,看是想要擁抱波動度來獲得報酬,還是維持勝率雖然可能賺不多,但不輸就好的風格。這篇文章主要是想讓讀者了解到,確實是有甜蜜其存在,且也可以以此為一種策略方法來投資有價證券,然而當我們細分產業後也才發現,甜蜜期有時候不適用於某些類群的產業。還是建議在得知可能某種策略有效時,多加細分因子去做分析,較不容易在投資中失利唷。

完整程式碼

延伸閱讀

相關連結

返回總覽頁