期货“结算会员成交持仓排名” 数据,是一项重要的市场信息。从中可以捕捉投资者行为信息。
我们首先考虑将股指期货市场中的投资者分成两类:一类为“知情投资者”,另一类为“非知情投资者”。所谓知情投资者,是指某些更加专业、更具有投资经验、 获取信息更加有效率的投者,大部分的机构投资者属于此类。非知情投资者则是指获取信息能力弱、易被市场噪音影响的投资者,大多数散户投资者属于此类。
上了三个龙虎榜的会员为独立会员(m个),没有同时上三个榜的会员称为"其它会员",总共统计的会员为n=m 1个。
每个会员的知情度:
stat(i)=(Bi Si)/Vistat(i)=(BiSi)/Vi
stat(i)=(Bi Si)/Vi
其中:
BiBi
Bi
:会员i的持买单量
SiSi
Si
:会员i的持卖单量
ViVi
Vi
:会员i的成交量
定义如下三个情绪指标:
A.知情投资者情绪(Informed Trader Sentiment, ITS)指标:
1, 计算出 n 个会员单位的统计量 Stat(i),筛选出其中大于当月合约统计量 Stat(IF)(Stat(IF)=opid/vol)的会员单位;
2, 将筛选出的会员单位视为知情投资者, 计算其总持买单量 B, 总持卖单量 S;
3, 知情投资者情绪指标的计算公式: ITS=(B-S)/(B S)。
B.非知情投资者情绪(Uninformed Trader Sentiment, UTS)指标:
1,计算出 n 个会员单位的统计量 Stat(i),筛选出其中小于当月合约统计量 Stat(IF)的会员单位;
2,将筛选出的会员单位视为非知情投资者,计算其总持买单量 B,总持卖单量 S;
3,非知情投资者情绪指标的计算公式: UTS=(B-S)/(B S)。
C.市场情绪差异(MarketSentiment Difference, MSD)指标:
MSD=ITS?UTSMSD=ITS?UTS
MSD=ITS-UTS
本研究中给出了计算相关指标的函数,给定日期如‘2019-04-01’,品种代码如‘IF’,便可得到这三个指标:
当昨日ITS大于0时,买入,持有一天(研报中当天收盘平仓)
当昨日ITS小于0时,卖出。
这是一个非多即空的策略,按照研报中的回测时间,也回测了一下:
与研报中有一定差别, 关键原因是未当天平仓,而是次日开盘换仓。
鉴于研报发布时是2013,于是又拉长时间回测了一下:
很糟糕
无论结果怎样,研报还是提供了一个很好的观察市场的视角。
当然除了使用ITS,还可以使用UTS,MSD,也可以如研报中研究阈值对收益回撤的影响。在此不再赘述,有兴趣读者可自行研究。
def get_member_sentiment(day,code):from jqdata import financeimport pandas as pd""" 输入:日期,品种代码 输出:会员情绪指标 """#当日主力合约dominant_future = get_dominant_future(code,day)#获取数据:获得某天、某合约的成交量、持多、持空排名q=query(finance.FUT_MEMBER_POSITION_RANK.day,finance.FUT_MEMBER_POSITION_RANK.code,finance.FUT_MEMBER_POSITION_RANK.rank_type,finance.FUT_MEMBER_POSITION_RANK.rank,finance.FUT_MEMBER_POSITION_RANK.member_name,finance.FUT_MEMBER_POSITION_RANK.indicator,finance.FUT_MEMBER_POSITION_RANK.indicator_increase).\filter(finance.FUT_MEMBER_POSITION_RANK.code==dominant_future, finance.FUT_MEMBER_POSITION_RANK.day==day)df=finance.run_query(q) #当日主力合约持仓量opid = get_extras('futures_positions', dominant_future, start_date=day, end_date=day, df=True).iloc[0,0]#当日成交量vol = get_price(dominant_future, start_date=day, end_date=day, frequency='daily', fields='volume').iloc[0,0]#该合约的持仓量比成交量stat_contra = opid/vol#上榜会员单位交集、并集、差集member_intersection = set(df[df['rank_type']=='成交量排名']['member_name'])&\ set(df[df['rank_type']=='持买单量排名']['member_name'])&\ set(df[df['rank_type']=='持卖单量排名']['member_name'])member_all = set(df[df['rank_type']=='成交量排名']['member_name'])|\ set(df[df['rank_type']=='持买单量排名']['member_name'])|\ set(df[df['rank_type']=='持卖单量排名']['member_name'])member_d = member_all-member_intersection #上三榜的会员stat_mem = {}for mem in member_intersection:stat_mem[mem] = (df[(df['member_name']==mem)&(df['rank_type']=='持买单量排名')].indicator.tolist()[0]+\ df[(df['member_name']==mem)&(df['rank_type']=='持卖单量排名')].indicator.tolist()[0])/\ df[(df['member_name']==mem)&(df['rank_type']=='成交量排名')].indicator.tolist()[0]#筛选知情会员、非知情会员#stat_df = pd.DataFrame(stat_mem,index=['stat']).TInformed_Trader = []Uninformed_Trader =[]for key,value in stat_mem.items():if value>stat_contra:Informed_Trader.append(key)else:Uninformed_Trader.append(key)#其它会员temp = df.set_index('member_name').loc[member_d,:]B_other = sum(temp[temp['rank_type']=='持买单量排名'].indicator)S_other = sum(temp[temp['rank_type']=='持卖单量排名'].indicator)stat_mem_other = (B_other+\ S_other)/\ sum(temp[temp['rank_type']=='成交量排名'].indicator)#-计算相关指标#其它会员为知情会员if stat_mem_other>stat_contra:temp2 = df.set_index('member_name').loc[Informed_Trader,:]B = sum(temp2[temp2['rank_type']=='持买单量排名'].indicator)+B_otherS = sum(temp2[temp2['rank_type']=='持卖单量排名'].indicator)+S_otherITS = (B-S)/(B+S)temp3 = df.set_index('member_name').loc[Uninformed_Trader,:]B = sum(temp2[temp2['rank_type']=='持买单量排名'].indicator)S = sum(temp2[temp2['rank_type']=='持卖单量排名'].indicator)UTS = (B-S)/(B+S)else:temp2 = df.set_index('member_name').loc[Informed_Trader,:]B = sum(temp2[temp2['rank_type']=='持买单量排名'].indicator)S = sum(temp2[temp2['rank_type']=='持卖单量排名'].indicator)ITS = (B-S)/(B+S)temp3 = df.set_index('member_name').loc[Uninformed_Trader,:]B = sum(temp2[temp2['rank_type']=='持买单量排名'].indicator)+B_otherS = sum(temp2[temp2['rank_type']=='持卖单量排名'].indicator)+S_otherUTS = (B-S)/(B+S)MSD = ITS-UTSdata = pd.DataFrame([ITS,UTS,MSD],index=['ITS','UTS','MSD'],columns=[day]).Treturn dataday = '2019-04-01'code = 'IF'indicator = get_member_sentiment(day,code)indicator
.dataframe tbody tr th:only-of-type { vertical-align: middle; } .dataframe tbody tr th { vertical-align: top; } .dataframe thead th { text-align: right; }
ITS | UTS | MSD | |
---|---|---|---|
2019-04-01 | -0.053524 | -0.138602 | 0.085079 |
本社区仅针对特定人员开放
查看需注册登录并通过风险意识测评
5秒后跳转登录页面...
移动端课程