【指标分享】多空排列量化指标
发布于 8 个月前 作者 Wilson-G 825 次浏览 来自 分享

背景介绍: 常听老股民说什么多头排列、空头排列,指的其实是K线图上短期MA 中期MA 长期MA按照顺序,依次在上或在下的形态: 空头排列

可是我们要如何量化这个形态,甚至优化它呢,其实从原理上来看,多头排列形态的任意一个时刻都会有如下关系:
	ma_short>ma_middle>ma_long
空头排列形态的任意一个时刻都会有如下关系:
	ma_short<ma_middle<ma_long
	
比如ma15,ma30,ma60这三个ma指标,多头(上升趋势的时候)短期均线就会跑的比长期均线快,而且趋势稳定明朗的时候,短期均线会依次比长期均线数值高(ma15>ma16>ma17>......)
但你知道真是的世界不会永远这么简单明了,常常会出现均线交叉缠绕的情况,大家对于这种情况的处理,就是八仙过海各显神通了,但其实我们仍然可以用刚学到的概念和模型去处理这个问题:所谓均线交叉其实只不过是用户选取的某几根均线在一个时间会交叉,比如ma15,ma17,ma19,但如果你选择了ma15,ma30,ma60,大概率它就不交叉缠绕。但是从整体角度考虑,由于ma15,ma17,ma19这几根ma的交叉缠绕,是不是就造成了整体多头排列趋势的减弱了,原先大家只告诉你一个完美的多头排列是怎样,其实我们可以通过量化去度量任意时刻 多空排列趋势的『势头』的程度和大小。

要做到这件事情,就要用到数学上的逆序数这个概念了:
	逆序:在一个排列中,如果一对数的前后位置与大小顺序相反,即前面的数大于后面的数,那么它们就称为一个逆序
	
	举个栗子,list_a=[1,2,3,4] ,list_b=[1,2,5,4], list_c=[4,3,2,1],根据上面的定义大家看看这三个排列的逆序数应该是多少?
	答案分别是:0,1,6 
	如果你能正确计算出答案,代表你掌握了这个概念,就可以继续往下看了。
	
所以一个数量为n的均线族,完全多头排列的指标,在数学上就可以表达为:
	均线族的逆序数为0;
完全空头排列的指标,
	均线族的逆序数为 (1+n-1)*(n-1)/2
	
因为数量为n的一个排列,其最大的逆序数就是(1+n-1)*(n-1)/2这个了,那么我们所有得到的结果用max值进行标准化和一些简单的变化,就能得到如下图一样的指标和结果,该指标的范围是0-100,超过了50意味着多头趋势明显,低于50意味着空头趋势明显,怎么样,是不是觉得是非常有用的一个指标呢

指标 (这是上证指数17年到现在的日线K图,我所选用的是range(11,31)一共20根ma均线做的均线族得出的结果)

今天先写到这里,思路已经给了大家,感兴趣的朋友可以自己先实现一下这个指标,根据群主建议,100楼放代码实现23333
16 回复

100楼放代码嗷 完整实现

盖楼,哈哈

天神闭关的第一天,想他

一个丑陋的实现

def Indicator_Order(DataFrame, l = [2,3,4,5]):
    C = DataFrame['close']
    DICT = {}
    for i,n in enumerate(l):
        DICT['MA'+str(n)] = MA(C,l[i])
    DICT['Order'] =[]
    for i in range(len(l)):
        for j in range(len(l)-i-1):
            if len(DICT['Order'])==0:
                DICT['Order'] =(DICT['MA'+str(l[i+j+1])]<DICT['MA'+str(l[i])]).astype("int")
            else:
                DICT['Order']+=(DICT['MA'+str(l[i+j+1])]<DICT['MA'+str(l[i])]).astype("int")
    DICT['Order']=DICT['Order']-len(l)**2//4

    return pd.DataFrame(DICT)
	```

数学真是美丽啊,一个名词就把复杂的问题数量化表述

离一百楼又近一步

image.png 不知道这么算对不对 import QUANTAXIS as QA import pprint import datetime import pandas as pd import numpy as np

def ma_power(clp, range_list): ""“ 多头排列能量强度定义 ”"" def inv_num(series): ’’‘ 计算逆序数个数 ’’' series = np.array(series) # 提升速度 return np.sum([np.sum(x < series[:i]) for i, x in enumerate(series)])

ma_pd = pd.DataFrame()
for r in range_list:
    ma = QA.MA(clp, r)
    if len(ma_pd) == 0:
        ma_pd = ma
    else:
        ma_pd = pd.concat([ma_pd, ma], axis=1)
ma_pd.columns = range_list
df_fixed = ma_pd.dropna()  # 前n个数据部分均线为空值,去除
num = df_fixed.apply(lambda x: inv_num(x), axis=1)  # 每排逆序个数
ratio = num / (len(range_list) * (len(range_list) - 1)) * 2
return pd.DataFrame({'MAPOWER':ratio.reindex(ma_pd.index)})

准备数据

szzs = QA.QA_fetch_index_day_adv(code=‘000001.SH’, start=‘2017-01-01’, end=‘2019-01-01’) clp = szzs.data.close range_list = range(11,31)

计算指标

pp = ma_power(clp, range_list)

作图

m_df = pd.concat([pp, clp], axis=1) m_df.plot(use_index=False,y=[‘MAPOWER’,‘close’],secondary_y=[‘close’],figsize=(12,9))

不错,不错

数学全部交给了老师了!点赞!

回到顶部