量化实战跟随龙虎榜个股交易能获利吗?

国内A股市场向来投机氛围重,大多数资金(尤其是游资散户)偏好短线操作,对概念主题炒作乐此不疲。涨跌停板制度设立初衷是为了防止市场过度波动,但该规则容易导致助涨杀跌,成为主力资金的杠杆,因为主力资金只需将个股拉涨停(或跌停),就能营造出想买买不到(想卖卖不出)追涨情绪。与涨跌停板相伴随的另一个中国特色市场数据——龙虎榜数据,是指每日两市中涨跌幅、换手率等由大到小的排名榜单,并从中披露该股成交额最大的前几名证券营业部。该数据有助于了解当日异动个股的资金进出情况,判断是游资所为还是机构所为。历史上很多大牛股、妖股,如金轮股份、特力A、九安医疗等,在连续暴涨过程中经常出现在龙虎榜数据中,因此很多交易者试图通过挖掘龙虎榜数据,捕捉妖股或龙头股,赚取短期暴利。

从短线交易来看,龙虎榜数据具有一定的分析价值。一方面,龙虎榜数据代表了当前市场最活跃、最强势的资金偏好,包括机构资金和游资。所以从龙虎榜个股里很容易找到短线妖股,而长线投资价值股也很可能潜伏其中。另一方面,通过龙虎榜数据,可以直观看出主力的买卖动向,对比买卖双方席位资金总量。

那么跟着龙虎榜数据买卖操作,真的能实现超额收益吗?本文通过对2014年以来龙虎榜数据进行探索性分析和量化回测,研究发现龙虎榜数据在短期上有一定的分析价值,但从整体上看,跟随龙虎榜数据持仓交易不但无法获得超额收益,还可能造成严重亏损

02 数据获取

导入后面需要用到的Pyhton第三方包。

import pandas as pd
import numpy as np
#efinance是金融数据包,可免费爬取东方财富交易数据
#直接使用pip install efinance安装
import efinance as ef
import matplotlib.pyplot as plt
#seaborn、plotly可视化包
import seaborn as sns
import plotly.express as px
import warnings
warnings.simplefilter(action='ignore', category=FutureWarning)
from pylab import mpl
mpl.rcParams['font.sans-serif']=['SimHei']
mpl.rcParams['axes.unicode_minus']=False

使用金融数据包efinance获取2014年1月5日至2022年8月5日数据,样本期间涵盖了大牛市(2014-2015)和大熊市(2015-2016)。

#使用efinance包获取2014年至2022年8月5日数据
board_data=ef.stock.get_daily_billboard(start_date='2014-01-01',end_date='2022-08-05')
#保留需要的数据特征
cols=['股票代码','股票名称','上榜日期','收盘价','涨跌幅','换手率','龙虎榜净买额','流通市值','上榜原因','解读']
#有些股票可能因不同原因上榜,剔除重复记录样本
board_data=board_data[cols].drop_duplicates(['股票代码','上榜日期'])
board_data.head()

龙虎榜的上榜条件。根据沪深股票交易所规定,每日收盘后,公开当日异常交易/波动的前三名和前五名股票的买入卖出前五名的交易(席位)信息,具体包括:

  • 日价格涨跌幅偏离值达到7%;
    这里的涨幅偏离值是指个股的日涨跌幅与其对应分类指数涨跌幅之间的差值,如买上交所某股票,当日涨幅为10%,而上证指数当天的涨幅为1%,则个股当天的偏离值=10%-1%=9%;
  • 日价格振幅达到15%;
  • 日换手率达到20%;
  • 连续三个交易日内收盘价涨、跌幅偏离值累计达到20%;
  • ST、*ST和S证券连续三个交易日收盘价格张、跌幅偏离值累计达到15%(深市12%)。

上榜原因可以即上龙虎榜的上榜条件,解读里可以看到是游资还是主力资金参与。当然这里获取到的数据与官方公布的龙虎榜数据相比,在营业部交易席位上信息比较简略。

量化实战跟随龙虎榜个股交易能获利吗?

03 探索性分析

样本共有11万多观察值,收盘价最小值为0.017元,最大值为1232元,样本里可能存在退市股或B股,这些股一般投资者购买不到,需要剔除出样本。涨跌幅均值4.4%,标准差高达17%,最大跌幅89.57%,最高涨幅1942.58%,这些是没有涨跌幅限制的个股,中位数7%更能代表样本总体情况。换手率是一定时间内市场股票转手买卖的频率,该值越高反映买卖该股票的意愿越大,属于热门股。数据显示,换手率均值16%,标准差达到16%,中位数10.19%,可见上榜的个股交投非常活跃,最高换手率高达88.98%。龙虎榜净买额均值和中位数均为正,流通市值均值和75%分位数比较接近,60多亿左右,可见上榜的个股大多为中小市值股。

board_data.describe()
量化实战跟随龙虎榜个股交易能获利吗?

下面排除新股、退市和B股样本。样本观察值共10万左右。

#剔除退市、B股和新股N
s1=board_data['股票名称'].str.contains('退')
s2=board_data['股票名称'].str.contains('B')
s3=board_data['股票名称'].str.contains('N')
s=s1|s2|s3
final_data=board_data[-(s)]
final_data.describe()
量化实战跟随龙虎榜个股交易能获利吗?

#有些个股可能会修改名称,但代码一般不会改变counts=final_data.groupby('股票代码')['股票代码'].count().sort_values(ascending=False)counts.describe()
量化实战跟随龙虎榜个股交易能获利吗?

个股上榜次数统计分布。上榜次数分布呈现幂律分布特点(二八定定律),即大多数个股登上龙虎榜的次数只有1-2次,少数个股多次登上龙虎榜。换句话说,龙虎榜一直是由少数个股占据。

d1=pd.DataFrame(counts).rename(columns={'股票代码':'上榜次数'}).reset_index()
d2=final_data[['股票代码','股票名称']].drop_duplicates()
dd=pd.merge(d1,d2,how='inner').drop_duplicates('股票代码').reset_index(drop=True)
sns.displot(dd['上榜次数'],kde=True);
量化实战跟随龙虎榜个股交易能获利吗?

上龙虎榜次数最多的前100只个股。榜单上的个股详细读者耳熟能详,因为这些个股大都是曾经的“妖股”。

fig = px.treemap(dd[:100], 
                 path=['股票名称'],
                 values='上榜次数', color='上榜次数',
                 color_continuous_scale=['Green','Red',"#8b0000"])
fig.data[0].texttemplate = "%{label}<br>%{customdata}"
fig.update_traces(textposition="middle center", 
                  selector=dict(type='treemap'))

fig.update_layout(margin = dict(t=30, l=10, r=10, b=10))
fig.update(layout_coloraxis_showscale=False)
fig.show()
量化实战跟随龙虎榜个股交易能获利吗?

#注意qstock为个人量化包,加入Python金融量化知识星球可获取#可以使用pecharts自己编写画图替代from qstock.plot_data import chart_klinedef plot_stock(code):    col0=['开盘','最高','最低','收盘','成交量']    col1=['open','high','low','close','vol']    df0=(ef.stock.get_quote_history(code)        .rename(columns=dict(zip(col0,col1))))    df0.index=pd.to_datetime(df0['日期'])    df0=df0[col1]    return chart_kline(df0)

放大时间期间看,这些龙虎榜上的“妖股”大都“风光一时”,炒作过后变成一地鸡毛。

plot_stock('金轮股份')
量化实战跟随龙虎榜个股交易能获利吗?

plot_stock('浙江建投')
量化实战跟随龙虎榜个股交易能获利吗?

plot_stock('汇金股份')
量化实战跟随龙虎榜个股交易能获利吗?

历年龙虎榜上榜次数。2015年大牛市共有1.6万次的龙虎榜,龙虎榜数据一定程度上反映了市场的交投热情和火热程度。

from qstock.plot_data import chart_bar
year_df=final_data.copy()
year_df['year']=year_df['上榜日期'].apply(lambda s:s[:4])
ss=year_df.groupby('year')['股票代码'].count()
x=[str(i) for i in ss.index]
y=ss.tolist()
chart_bar(x,y,title='历年龙虎榜次数')
量化实战跟随龙虎榜个股交易能获利吗?

04 交易回测

一般而言,若买入席位资金总量>卖方席位资金总量,说明资金吸筹较多,后市继续上涨概率大;若买入席位资金总量<卖方席位资金总量,说明抛压较大,短期继续上涨概率降低。尤其是龙虎榜持续显示资金净买入或者净卖出,那么上涨或者大跌的可能性将会被成倍放大。因此,下面的交易回测重点以龙虎榜净买额数据作为交易参考指标。

策略1:当某只股票进入龙虎榜,涨跌幅大于0,且龙虎榜净买额大于0时,第二天买入持有,这里假定第二天不是一字板涨停,然后持有一定周期后进行卖出调仓,考虑到龙虎榜数据属于短期投机行为,将调仓周期设定为短期,如3日、5日、10日、20日等。

def cal_ret(start,code,w_list):
    dd=ef.stock.get_quote_history(code,beg=start)
    dd.index=pd.to_datetime(dd['日期'])
    dd=dd.sort_index()
    result={}
    #上榜后第二天开始算,除以索引1对应收盘
    for w in w_list:
        result[str(w)+'日收益率']=dd['收盘'].iloc[w]/dd['收盘'][1]-1
    return result

#计算龙虎榜净买额前五名组合收益率
def cal_date_ret(date,data=final_data,n=5):
    c1=data['涨跌幅']>0
    c2=data['龙虎榜净买额']>0
    data=data[c1&c2]
    df=data[data['上榜日期']==date].sort_values('龙虎榜净买额',ascending=False)[:n]
    result_df=pd.DataFrame()
    for code,d in df[['股票代码','上榜日期']].values:
        d=''.join(d.split('-'))
        result_df[code]=pd.Series(cal_ret(d,code,w_list=[3,5,7,10,15,20]))   
    return pd.DataFrame({d:result_df.mean(axis=1)}).T

计算持仓收益率。

#计算所有日期持仓收益率数据
from tqdm import tqdm
def cal_all_ret(dates):
    ret_df=cal_date_ret(dates[0])
    for d in tqdm(dates[1:]):
        try:
            temp=cal_date_ret(d)
            ret_df=pd.concat([ret_df,temp])
        except:
            continue
    return ret_df

数据显示,2087次观察值中,短线(3、5、7、10、15、20日)持有龙虎榜个股平均收益率均为负数,从统计意义上看,跟随龙虎榜个股进行交易很难实现获利。

dates=final_data.sort_values('上榜日期')['上榜日期'].unique()
#获取2014年1月5日至2022年8月5日龙虎榜组合持仓收益率数据
ret_all=cal_all_ret(dates)
#龙虎榜组合持仓收益率描述性统计
ret_all.describe()
量化实战跟随龙虎榜个股交易能获利吗?

#龙虎榜组合定期调仓累计收益率def cal_cum_ret(data):    ss=data.copy()    for d in [3,5,7,10,15,20]:        row=ss.iloc[range(0,len(ss)-d,d)].index        col=f'{d}日调仓累计收益率'        ss.loc[row,col]=((ss[str(d)+'日收益率'][range(0,len(ss)-d,d)]+1).cumprod()-1)    cols=[f'{d}日调仓累计收益率' for d in [3,5,7,10,15,20]]    print((ss[cols].fillna(method='ffill').iloc[-1]*100).round(2).apply(lambda s:str(s)+'%'))    ss[cols].fillna(method='ffill').plot(figsize=(15,7));    plt.title('龙虎榜组合跟踪持仓累计收益率\n2014年1月-2022年8月',size=15);    return

持仓累计收益率对比可视化。如果从2014年1月开始,采取策略1的龙虎榜个股跟随交易定期调仓,一直持续到2022年8月,期间累计收益率表现相当糟糕。尽管该交易策略在2015年期间累计收益率高达300%多,但整个回测期间在设定的周期【3、5、7、10、15、20日】调仓下,均出现了90%多的累计亏损。该结果一定程度上反映了散户简单跟随龙虎榜数据进行操作,风险非常高!

cal_cum_ret(ret_all)

量化实战跟随龙虎榜个股交易能获利吗?

策略2 (机构跟随):选择涨跌幅和龙虎榜净买额均大于0,且交易席位有机构买入的龙虎榜个股进行跟踪交易。

龙虎榜席位包括机构席位,游资席位,沪股通、深股通席位。机构席位主要是基金、保险、社保、券商自营和QFII等使用,一般以价值投资为主。游资席位主要是市场中的私募基金、大户、超级大户使用,以短线投机为主。当龙虎榜中出现机构席位时,往往继续上涨的概率较大(后面量化回测结果并不支持这一说法)。

r0=final_data['涨跌幅']>0
r1=final_data['龙虎榜净买额']>0
r2=final_data['解读'].str.contains('机构买入')
#排除没有涨跌停限制的个股
r3=final_data['涨跌幅']<21
r=r0&r1&r2&r3
r_data=final_data[r].copy()
#r_data.describe()
dates1=r_data.sort_values('上榜日期')['上榜日期'].unique()
#获取2014年1月5日至2022年8月5日龙虎榜组合持仓收益率数据
r_all=cal_all_ret(dates1)

描述性统计和累计收益率可视化结果均显示,该策略的表现并没有什么改善。跟随机构交易的行为非但不能让你获利,可能带来毁灭性的损失。毕竟在A股市场,很多所谓的“机构”交易行为与一般游资散户没啥区别,常表现出追涨杀跌。

r_all.describe()
量化实战跟随龙虎榜个股交易能获利吗?

cal_cum_ret(r_all)

量化实战跟随龙虎榜个股交易能获利吗?

策略3 :选择涨跌幅小于0,但龙虎榜净买额大于0。

s_data=final_data.query("涨跌幅<0&龙虎榜净买额>0")
dates2=s_data.sort_values('上榜日期')['上榜日期'].unique()
#获取2014年1月5日至2022年8月5日龙虎榜组合持仓收益率数据
s_all=cal_all_ret(dates2)
s_all.describe()

回测结果依然显示,累计收益率亏损非常严重,龙虎榜跟踪持股策略表现非常糟糕。

量化实战跟随龙虎榜个股交易能获利吗?

cal_cum_ret(s_all)

量化实战跟随龙虎榜个股交易能获利吗?

05 结语

本文从量化的角度分析了2014年-2022年龙虎榜数据,认为龙虎榜数据尽管有一定的短线分析价值,但不建议投资者跟风操作。实际上龙虎榜数据代表的是市场的投机炒作行为,过高的换手率往往是交易者陷入疯狂,估值过度泡沫化的表现。当然,市场整体的分析显示龙虎榜数据不能给投资者带来超额收益,不代表个体不能通过对该数据的深入挖掘(定性分析也很重要!)获利。只是从统计意义上来说,个体要从龙虎榜数据里获取有用的信息,从而交易获利的概率很小。

国内A股市场投机氛围一直较重,或许是文化(好赌成性)与制度(如涨跌停、信息披露等)的产物。查理·芒格认为“中国人天性好赌,有的中国人沉溺于赌博,沉溺于急功近利赚快钱,把股票看成赌场的筹码,这非常糟糕。股票背后是实实在在的企业,不是赌场的筹码。我们应该做投资,投资于企业,股票只是一个载体,不应投机”。

发布者:股市刺客,转载请注明出处:https://www.95sca.cn/archives/69102
站内所有文章皆来自网络转载或读者投稿,请勿用于商业用途。如有侵权、不妥之处,请联系站长并出示版权证明以便删除。敬请谅解!

(0)
股市刺客的头像股市刺客
上一篇 2024 年 7 月 9 日
下一篇 2024 年 7 月 9 日

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注