筹码集中度

Photo by Maxim Hopman on Unsplash

 

本文重点概要

文章难度:★☆☆☆☆

使用前15名买卖超量与总成交量建构筹码集中度指标,以及券商总买卖量、参与券商数和排名来建构买卖集中度指标

阅读建议:本文主要透过筹码资料来建构集中度相关指标,并用资料视觉化的方式呈现,需要读者对资料视觉化与筹码资料有一定的认识。

前言

台湾股票市场属于浅碟市场,所谓浅碟代表的是没有深度,容易受到外部的震荡,而在股票市场则代表,容易受到外部力量干扰,而有明显的涨跌幅情况,像是受到新闻的影响、或是投资大户对单一股票大量的买入,都会明显影响股价表现,而本文使用了几个筹码资料,来探讨当筹码集中于一档股票时,对股价的影响为何,并用互动式的图表呈现。

编辑环境及模组需求

本文使用Mac OS并以jupyter作为编辑器

import pandas as pd
import numpy as np
import tejapi
import matplotlib.pyplot as plt
import matplotlib.transforms as transforms
from matplotlib.font_manager import FontProperties

plt.rcParams['font.sans-serif'] = ['Arial Unicode MS'] # 解决MAC电脑 plot中文问题
plt.rcParams['axes.unicode_minus'] = False

tejapi.ApiConfig.api_key ="Your Key"
tejapi.ApiConfig.ignoretz = True

import plotly.express as px
import plotly.graph_objects as go
from plotly.subplots import make_subplots

资料库使用

调整股价(日)-除权息调整(TWN/APRCD1)
主要券商进出明细-券商别(TWN/AMTOP)

资料导入

资料期间取自2017年到2022年,以台积电作为例子,分别取得了买进股数、卖出股数、成交量以及收盘价资料。

df = tejapi.get('TWN/AMTOP1',  #从TEJ api捞取所需要的资料
                chinese_column_name = True,
                paginate = True,
                coid='2330',
                mdate = {'gt':'2017-01-01'},
                opts={'columns':['coid','mdate', 'key3','buy', 'sell', 'total']})
df1 = tejapi.get('TWN/APRCD1',  #从TEJ api捞取所需要的资料
                chinese_column_name = True,
                paginate = True,
                coid='2330',
                mdate = {'gt':'2017-01-01'},
                opts={'columns':['coid','mdate', 'volume', 'close_adj']})

将资料NA值删掉,并将买进股数由大到小排序,并取出每日买进股数的最大前15笔资料

df.dropna(inplace=True)
df.sort_values(['日期','买进股数'], ascending=[1,0], inplace=True)#根据买进股数由大到小排序
df_buy = df.groupby(['日期']).head(15)#取出每个日期的前15笔

创一个新的Dataframe,并用日期当index,把刚刚筛选出来的每日买进股数作加总,放进新的表中

result = pd.DataFrame(index=df_buy['日期'].unique())#创一个新的表,日期当index
result['买进股数'] = df_buy.groupby(['日期'])['买进股数'].sum()# 把每个日期的前15笔买进股数加总

用跟买进股数一样的方式处理卖出股数的部分

df.sort_values(['日期','卖出股数'], ascending=[1,0], inplace=True)#根据卖出股数由大到小排序
df_sell  = df.groupby(['日期']).head(15)#取出每个日期的前15笔
result['卖出股数'] = df_sell.groupby(['日期'])['卖出股数'].sum()

将买进股数跟卖出股数,根据比较常见的60日跟120日做rolling的总和

result_60 = result.rolling(60).sum() #根据n日做买进/卖出rolling 总和
result_60.rename(columns = {'买进股数':'买进股数_60', '卖出股数':"卖出股数_60"}, inplace=True)
result_120 = result.rolling(120).sum() #根据n日做买进/卖出rolling 总和
result_120.rename(columns = {'买进股数':'买进股数_120', '卖出股数':"卖出股数_120"}, inplace=True)

把成交量也做60日跟120日的rolling总和,并且跟刚刚买卖股数的table做合并

df1['成交量(千股)_60'] = df1['成交量(千股)'].rolling(60).sum()
df1['成交量(千股)_120'] = df1['成交量(千股)'].rolling(120).sum()
result2 = pd.merge(result_60, df1[['成交量(千股)_60', '成交量(千股)_120','收盘价(元)']], left_index=True, right_index=True) #把成交量跟买进/卖出合起来
result3 = pd.merge(result2, result_120, left_index=True, right_index=True) #把成交量跟买进/卖出合起来

接著根据筹码集中度的公式:((买方前15名近n日的总买超量-卖方前15名近n日的总卖超量)/近n日的总成交量)*100,把筹码集中度计算出来

result3['60日筹码集中度'] = ((result3['买进股数_60'] - result3['卖出股数_60'])/result2['成交量(千股)_60'])*100 
result3['120日筹码集中度'] = ((result3['买进股数_120'] - result3['卖出股数_120'])/result2['成交量(千股)_120'])*100 
# ((买方前15名近n日总买超量 - 卖方前15名近n日总卖超量) / 近n日总成交量)*100

透过plotly套件将结果作成互动式的图表,也能方便观察特定时间的趋势,从图中可以看到,在疫情最恐慌的时期,台积电的60日筹码集中度创下了自2017年以来的新低,可见筹码大量分散,股价也跌至波段的低谷。

近四年台积电&筹码集中度
筹码集中度

资料导入

资料期间取自2021年中到2022年,以台积电作为例子,分别取得了券商名称、券商代码、买进股数、卖出股数。

df2 = tejapi.get('TWN/ABSR', #从TEJ api捞取所需要的资料
                  chinese_column_name = True,
                  paginate = True,
                  mdate = {'gt':'2021-06-30', 'lt':'2022-11-22'},
                  coid="2330",
                  opts={'columns':['coid','mdate','key3','brk_nm','buy_s','sell_s']})

将买进股数跟卖出股数由大到小排序,并使用rank function针对每个日期的不同券商排名

df2_buy = df2.sort_values(['年月日','买进股数(股)'], ascending=[1,0]).reset_index(drop=True)
df2_sell = df2.sort_values(['年月日','卖出股数(股)'], ascending=[1,0]).reset_index(drop=True)
df2_buy['排名'] = df2_buy.groupby('年月日')['买进股数(股)'].apply(lambda x: x.rank(method='dense' ,ascending=False))
df2_sell['排名'] = df2_sell.groupby('年月日')['卖出股数(股)'].apply(lambda x: x.rank(method='dense' ,ascending=False))

计算买进张数、卖出张数、排名*张数以及每日参与的券商总数,用以后续指标计算使用

df2_buy['买进张数'] = df2_buy['买进股数(股)']/1000
df2_buy['名次_张数'] = df2_buy['排名']*df2_buy['买进张数']
attend = df2_buy.groupby('年月日')['买进股数(股)'].count()
attend.name = '参与交易券商数'
df2_buy = df2_buy.merge(attend, on='年月日')
df2_buy.set_index('年月日', inplace=True)

df2_sell['卖出张数'] = df2_sell['卖出股数(股)']/1000
df2_sell['名次_张数'] = df2_sell['排名']*df2_sell['卖出张数']
attend1 = df2_sell.groupby('年月日')['卖出股数(股)'].count()
attend1.name = '参与交易券商数'
df2_sell = df2_sell.merge(attend, on='年月日')
df2_sell.set_index('年月日', inplace=True)

买进集中度公式:(((SUM(买进张数)*参与交易券商数)/2)-(SUM(买进张数)/2)+(SUM(买进张数)*排名))/(SUM(买进张数)*排名)/2

卖出集中度公式:(((SUM(卖出张数)*参与交易券商数)/2)-(SUM(卖出张数)/2)+(SUM(卖出张数)*排名))/(SUM(卖出张数)*排名)/2

差值:买进集中度-卖出集中度

因为公式计算上较为复杂,所以在计算上我将他分成a,b,c三部分来计算,最后计算出买进集中度、卖出集中度以及差值

result = pd.DataFrame(index=(df2_buy.index).unique())
result['a1'] = ((df2_buy.groupby('年月日')['买进张数'].sum())*(df2_buy.groupby('年月日')['参与交易券商数'].head(1)))/2
result['b1'] = (df2_buy.groupby('年月日')['买进张数'].sum())/2
result['c1'] = df2_buy.groupby('年月日')['名次_张数'].sum()
result['a2'] = ((df2_sell.groupby('年月日')['卖出张数'].sum())*(df2_buy.groupby('年月日')['参与交易券商数'].head(1)))/2
result['b2'] = (df2_sell.groupby('年月日')['卖出张数'].sum())/2
result['c2'] = df2_sell.groupby('年月日')['名次_张数'].sum()

result['买进集中度'] = (result['a1'] - (result['b1']+result['c1']))/result['a1']
result['卖出集中度'] = (result['a2'] - (result['b2']+result['c2']))/result['a2']
result['差值'] = result['买进集中度'] - result['卖出集中度']

将买进集中度、卖出集中度、差值跟台积电的收盘价整合进同一张table,方便后续绘图

final = result[['买进集中度','卖出集中度','差值']].merge(result3.loc['2021-07-01':]['收盘价(元)'], left_index=True,right_index=True)
近一年台积电筹码集中度
买进集中度、卖出集中度、差值

先将差值隐藏更好观察这张图表,可以发现不管是买进集中度或是卖出集中度的波动都非常大,较难观察到趋势与股价的走势是否有一致的存在,再来观察看看差值与股价的关系。

买卖集中度与差值
买进、卖出集中度

而从差值与台积电收盘价来看就比较清楚,当差值较大的时候,台积电当天的收盘价表现得较好,反之,当差值呈现下降趋势的话,台积电的收盘价也呈现下降的趋势,可见筹码集中度即便是对于像台积电这种市值跟成交量庞大的公司也仍有一定的效果存在。

买卖集中度与差值
差值、收盘价图

结论

我们能从结果看到,无论是第一种60/120日筹码集中度或是第二种买/卖出指标与差值,都可以看到筹码集中度对股价的影响,当集中度越低或是差值越小的时候,股价往往是回落的,需要注意的是,读者如果想使用在程式交易或是学术研究上时,可能需要考虑进一步的平滑化,否则波动这么大的资料容易有过度产生讯号或是有定态的问题。

之后也会介绍使用TEJ资料库来建构各式指标,并回测指标绩效,所以欢迎对各种交易回测有兴趣的读者,选购TEJ E-Shop的相关方案,用高品质的资料库,建构出适合自己的交易策略。

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

完整程式码

延伸阅读

相关连结

返回总览页