兴柜转上市柜「甜蜜期」

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)}')
上市柜报酬率
上市柜报酬率

上图则是要表达的是,我们发现有些产业所获得得报酬率,依据天数的增加所获得的报酬率波动较高,有些波动较小。就以胜率最高的电器电缆来说,他胜率高风险波动也小,然而胜率也跟电器电缆差不多的橡胶业,波动度却比电器电缆高。

结论

因此若我们选择以此为一种投资策略来操进行短线操作,其实可以筛选自己适合的风格,看是想要拥抱波动度来获得报酬,还是维持胜率虽然可能赚不多,但不输就好的风格。这篇文章主要是想让读者了解到,确实是有甜蜜其存在,且也可以以此为一种策略方法来投资有价证券,然而当我们细分产业后也才发现,甜蜜期有时候不适用于某些类群的产业。还是建议在得知可能某种策略有效时,多加细分因子去做分析,较不容易在投资中失利唷。

完整程式码

延伸阅读

相关连结

返回总览页