请 [注册] 或 [登录]  | 返回主站

量化交易吧 /  量化平台 帖子:3365785 新帖:17

股指期货蜘蛛网策略 ——从成交

EA发表于:5 月 9 日 17:19回复(1)


一、会员成交持仓信息

期货“结算会员成交持仓排名” 数据,是一项重要的市场信息。从中可以捕捉投资者行为信息。

二、指标构建

我们首先考虑将股指期货市场中的投资者分成两类:一类为“知情投资者”,另一类为“非知情投资者”。所谓知情投资者,是指某些更加专业、更具有投资经验、 获取信息更加有效率的投者,大部分的机构投资者属于此类。非知情投资者则是指获取信息能力弱、易被市场噪音影响的投资者,大多数散户投资者属于此类。

上了三个龙虎榜的会员为独立会员(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’,便可得到这三个指标:
Img

三、交易策略

基于ITS的正向操作:

当昨日ITS大于0时,买入,持有一天(研报中当天收盘平仓)
当昨日ITS小于0时,卖出。
这是一个非多即空的策略,按照研报中的回测时间,也回测了一下:
Img
与研报中有一定差别, 关键原因是未当天平仓,而是次日开盘换仓。

鉴于研报发布时是2013,于是又拉长时间回测了一下:
很糟糕
Img

无论结果怎样,研报还是提供了一个很好的观察市场的视角。

其它策略思路

当然除了使用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;    }


ITSUTSMSD
2019-04-01-0.053524-0.1386020.085079

全部回复

0/140

量化课程

    移动端课程