筹码集中度
由qxiao创建,最终由qxiao 被浏览 6 用户
在股市的波澜壮阔中,筹码集中度宛如一座神秘的灯塔,照亮着投资者前行的道路。它不仅是一个冰冷的数据指标,更是市场情绪与资金流向的细腻诠释者。当我们深入探索筹码集中度时,仿佛是在解读一本关于市场智慧与人性博弈的厚重书籍。每一个百分点的变化,都承载着无数投资者的希望与梦想,每一次波动的背后,都隐藏着市场脉动的秘密。通过筹码集中度,我们得以窥见那些隐藏在市场深处的巨头身影,感受他们如何在股市的舞台上悄然布局,又如何在关键时刻掀起波澜。它让我们明白,股市不仅仅是数字的游戏,更是智慧与勇气的较量。而筹码集中度,正是这场较量中不可或缺的重要参考,指引着我们在复杂多变的市场中,寻找到属于自己的投资之道。
一、背景介绍:
①什么是筹码?筹码指投资者手中持有的股票数量以及股票资产的份额,它不仅代表数量,还蕴含着投资者在市场中的地位和影响力。了解和估计投资者购买股票的价格,有利于我们了解和分析市场,并作出合理的买卖操作。
②什么是筹码集中度?筹码集中度是指某只个股的筹码被特定投资者掌握的程度,它反映了市场中一定数量的股票集中在少数人手中的情况。筹码集中度越高,意味着股份分布越不平均,少数持股人掌握更多话语权;反之则较为分散。直观上说,筹码越集中,说明持有该股票的投资者购买金额差距小,否则说明购买价格分散。
③为什么要估计筹码集中度?交易所不会公开股市每天真实的筹码数据,仅仅公布每笔交易的价格与对应的交易股数。我们只能利用公开的历史数据,依据某些特定假设,建立对应的筹码模型,估计和拟合筹码分布。
上面是某交易平台的截图,右端即为当前股票的筹码分布,如何估计筹码分布呢?
二、模型构建与模型假设:
①本模型使用交易所公开以及可以自由获取的数据建模。通过研究每笔交易的数量、价格以及每天市场的数据,预估实时股票买入价位的分布情况,即筹码分布。利用模型拟合出当前时刻的筹码公布图后,可以计算70%和90%筹码集中度以及峰度、最大筹码集中度等统计指标。筹码集中度可以辅助我们进行选股,结合其他选股条件,就可以运用筹码因子模型进行选股交易。不过,投资需谨慎,因市场复杂多变,风险与机遇并存。单一模型有局限,难以全面应对。应结合多个模型,如基本面、技术面、筹码分布等,多维度分析,相互印证,才能更准确评估投资价值,降低风险,提高投资成功率。
②分段挥发模型:前一个交易日处于任何价位的股票在第二个交易日进行交易的概率相同,为第二天的股票换手率,被称为筹码的挥发率。在这样的假设下,一个交易日的筹码来源为两部分,前一个交易日挥发的股票(当前交易日交易的股票)、前一个交易日未挥发的股票。
③研究周期截断:从研究时刻开始,选取“一个近乎完整的交易周期”对数据进行截断,只研究该周期内的交易数据。换言之,我们认为周期开始时刻,该股票的筹码均为该日的收盘价。
④日内合并:为加快模型计算速度,在计算获利盘胜率时,在每个历史交易日中都以收盘价代替当天所有的交易价格,作为历史交易的筹码价格。由于研究周期较长,这样的假设不会对获利盘胜率造成太大影响。
⑤指标:本平台提供了每只股票的筹码分布图以及70%筹码集中度和90%集中度。除此之外,本平台还提供了峰度、最大筹码集中度等其他指标,作为辅助投资者利用筹码因子策略投资的依据。
⑥参数设置:为研究筹码分布,我们首先需要读取历史数据。为保证有充分的数据可以截断,我们可以选取一个较长的周期便于截断。sd为研究开始时间,ed为当前时刻。beta系数是筹码分布图的切割数,参数值越大,筹码分布图的线条越细,筹码越详细。
三、代码实现与算法。
对每只股票(代码为ins),我们都可以利用下面的函数输出如下的列表,包含了筹码分布因子的重要信息。
process_ins(ins)
collectdata = pd.DataFrame(columns=['当前股价', '90%筹码', '70%筹码','平均成本','收盘获利','峰度','最大集中度'])
dataout = process_ins(ins)
collectdata.loc[ins] = dataout
下面我们详细介绍该函数处理数据和建模的具体算法和逻辑,并展示一些中间步骤和最终结果。
①数据读取与预处理
本平台提供了对投资者超级友好的读取数据方式,使用本平台开发的高性能分布式计算库dai,结合SQL语言,非常容易利用函数读取丰富的投资者想要查看和分析的历史数据。其中,df为分时数据,df_d为日时数据。
df = dai.query("select * from cn_stock_bar1m ", filters={'date':[sd,ed], 'instrument':[ins]}).df()
df_d = dai.query("select date as day,* from cn_stock_bar1d ", filters={'date':[sd,ed], 'instrument':[ins]}).df()
随后对数据进行预处理,包括合并,异常值删除,日期格式化,利用调整因子处理价格。本平台提供了非常高性能的分布式计算库,可以快速得到想要的数据,以下是用sql查询语言计算模型构建还需要的额外数据df_merge的代码。
sql = """
select date,instrument,
turn as 换手,
volume as 成交量,
成交量*100/换手 as 流通股本,
adjust_factor as 复权因子
from cn_stock_prefactors
order by date,instrument
"""
df_tmp = dai.query(sql, filters={'date':[sd,ed],'instrument':[ins]}).df().rename(columns={'date':'day'})
经过数据预处理,我们可以得到我们需要的数据,用于筹码分布和筹码因子的构建。以下是一个日时数据的处理结果。
在得到该数据后,我们需要和有效的分时数据和日时数据合并。
②挥发模型:计算累计筹码
由于当前时刻的筹码可能来源于当日市场交易或前一个交易日,而前一个交易的筹码又可能来源于前一个交易日,故任何时刻的筹码其实来源于整个研究周期从开始到当前时刻的每一天。那么,如何得到当前时刻的筹码分布呢?我们可以将筹码保留率(1-挥发率)累乘,换言之,如果前面两个交易日的挥发率都为1%,那么两天前的筹码就有(1-1%)(1-1%)的可能性保留到今天。将每个历史交易日的筹码经过如此计算,我们就可以计算得到当前时刻的筹码分布了。那么,如何使用代码完成这个工作呢?
df = pd.merge(df,df_tmp[['day','流通股本','复权因子']],left_on='day',right_on='day',how='left') #获得流通股本
# print(df)
adjust_factor_now = df['adjust_factor_y'].iloc[-1]
now_price = df['close'].iloc[-1]#调整后的收盘价
float_vol = df.loc[df.index[-1], '流通股本']
df['turn_m'] = df['volume'] / df['流通股本']
df['turn_decay'] = (1 - df['turn_m']).shift(-1).fillna(1)
df = df.iloc[::-1]
df['mul'] = df['turn_decay'].cumprod()
df = df.iloc[::-1]
df['adj_volume'] = df['volume'] * df['mul']
df['cumsum_vol'] = df['adj_volume'].cumsum()
这段代码的主要目的是通过计算换手率及其衰减因子来调整成交量,从而得到一个更符合实际情况的成交量序列。另外,cumsum函数帮助我们计算累计交易量。这样的交易看起来是一个合适的问题,但是,从什么时刻开始递推呢?本模型利用了一个截断,截断的依据是当累计换手量达到0.9时,就可以认为这之后股票几乎进行了快一轮换手,即筹码更新了一个周期。当然,聪明的读者可以选取其他截断方式,更适用于个人的研究方法是关键。
for i in range(len(df_tmp) - 1, -1, -1):
cumulative_sum += df_tmp.loc[i, '换手']
if cumulative_sum >= 0.9:
index = i
break
df = df.loc[i:, :]
截断后,有效的数据为一个dataframe格式的名为df的数据表。下面是df中某些列的解释:
turn_m:单日成交量与流通股本的比值,作为股票真实换手率的估计,剔除不活跃股本的影响;
turn_decay:挥发系数:筹码因子挥发分段模型的假设,类似指数滑动;
mul:用挥发系数指数滑动,作指数运算,累乘因子作为筹码保留率;
adj_volume:指数模型的计算规则:假设第n个交易日的股票有mul在第n+1个交易日挥发,故在研究期间内调整后的成交量是指数递减的;
cumsum_vol:从研究日开始,利用挥发系数mul计算得到每天的挥发量,再相加寻找超过90%的节点;
③切割绘图:绘制筹码分布图
我们已经利用pandas、numpy库以及本平台的高性能分布式计算库,得到了当前时刻某股票的筹码分布信息,但这样的结果却非常离散——筹码价格可能有几万甚至几百万。如何能直观体现筹码分布图呢?这就需要我们利用切割,将筹码分布切割为有限的区间。
df['adj_amount'] = df['close'] * df['adj_volume']
avg_price = df['adj_amount'].sum() / df['adj_volume'].sum()
df['groups'] = pd.cut(df['close'],bins=beta,labels=False)
为方便后续处理,我们还需要整理一些数据,例如,读取当前结果,计算筹码均价(总价格除以总流通股数)。获取当前价格和流通股本,计算调整换手率、累计因子,计算累计成交量。于是,我们可以计算出获利盘胜率,换言之,购买价比当前价格更低的筹码就是获利盘,反之为亏本盘。最后,我们将切割后的筹码价格储存在列表chip_list中,将与之对应的筹码数目储存在price_list中,随后就可以绘制出筹码分布图。
上图就是一个筹码分布图的例子,横轴是筹码价格,纵轴是对应的筹码数量。红色是盈利盘,蓝色是亏损盘,两者的交界处是当前价格。这样的筹码分布图非常直观,可以从图上看出一些明显的几何特征,但没有具体的指标,我们还是没法对筹码性质进行定量。
④指标计算:计算用于描述筹码特征的指标。
90%筹码集中度是指某只股票90%的流通筹码被特定投资者持有,反映筹码集中在少数人手中的程度,70%集中度的概念与之类似。根据定义,不难发现90%集中度比70%集中度更高,这是因为对应的筹码区间更宽。当然,90%筹码集中度和70%筹码集中度数字越小,说明筹码越集中。
除此之外,峰度是描述数据分布曲线尖峭或扁平程度的统计量,体现数据在均值附近聚集的形态特征。我们也可以计算筹码的峰度,它刻画了筹码的尖锐程度,越尖锐说明筹码在某个区间越集中。下图展示了对10只有代表性的股票的筹码信息。
除此之外,我们也可以利用其他统计指标辅助研究筹码分布和筹码分布的性质。一个常见的统计指标是最大集中度,它描述了筹码在10等分区间内最集中的程度。至此,我们对每个输入的股票代码ins,都利用挥发模型计算得到了筹码分布图和筹码信息数据。
四、后续处理
我们自定义的函数容易加工多只股票,可以将需要计算的股票代码放在列表ins_list中,利用for循环计算。
for ins in ins_list:
collectdata = pd.DataFrame(columns=['当前股价', '90%筹码', '70%筹码','平均成本','收盘获利','峰度','最大集中度'])
dataout = process_ins(ins)
collectdata.loc[ins] = dataout
本平台提供了高效的分布式运行计算库dai,可以高效处理代码,并且为投资者提供了友好的交易平台和编程平台,利用SQL查询语言以及python代码,可以得到许多精美的结果。例如,我们对沪深300、科创板甚至A股全市场的股票进行筹码计算,下图展示了科创板的计算结果。
另外,如果股票数目太多或周期太长,且投资者希望按照某指标进行排序,可能需要利用快速排序,加快运行速度,下面是快速排序的代码。
def quicksort(arr, low, high):
if low < high:
pi = partition(arr, low, high)
quicksort(arr, low, pi - 1)
quicksort(arr, pi + 1, high)
def partition(arr, low, high):
pivot = arr[high]
i = low - 1
for j in range(low, high):
if arr[j] <= pivot: # 从大到小排序
i += 1
arr[i], arr[j] = arr[j], arr[i]
arr[i + 1], arr[high] = arr[high], arr[i + 1]
return i + 1
# 将'90%筹码'列转换为列表
chip_list = collectdata['90%筹码'].tolist()
quicksort(chip_list, 0, len(chip_list) - 1)
pd.set_option('display.max_rows', None)
sorted_indices = [collectdata.index[collectdata['90%筹码'] == chip][0] for chip in chip_list]
sorted_df = collectdata.loc[sorted_indices]
print(sorted_df)
五、模型评价
总的来说,筹码挥发模型是一种在股市技术分析中用于评估和预测股价趋势的工具。它基于市场交易数据,通过构建数学模型来量化分析筹码的分布与变化,从而揭示市场主力资金的动向及潜在的股价支撑与阻力位。筹码分布图能清晰展示不同价位上的持仓量,帮助投资者快速了解市场的平均持筹成本,从而判断股价是处于相对高位还是低位,依据筹码峰的变化、密集程度以及与其他技术指标的结合运用,能够在一定程度上预判股价的短期波动方向和可能的反转点,为买卖时机提供参考。
不过,无法精确统计每个账户的具体持股数量和平均价位,以为无法得到准确的交易数据。除此之外,A股市场有较多不按常理出牌的投资者,这也会导致筹码估计不准确。另外,该模型主要侧重于技术分析层面,对上市公司的基本面变化关注不足,如公司的财务状况、行业前景、核心竞争力等,而这些因素对股价的长期走势有着重要影响。
总之,筹码挥发模型虽有诸多优势助力投资决策,但也存在不可忽视的缺点。投资者应客观认识其价值与局限,结合其他分析手段,综合考虑各种因素,以更全面、准确地把握股市动态,做出合理的投资选择,在降低风险的同时提高投资收益。用户在本平台,也可以更快更准确更详细地了解、理解和运用筹码分布和筹码因子。
完整代码如后。
https://bigquant.com/codesharev3/c69c8d88-456a-4379-8f6f-33c6a800c13e
\