精华内容
下载资源
问答
  • 这里为什么选择EMV作为第一个策略进行学习呢,主要还是觉得相比均线这种只考虑价格的指标来说,EMV是兼顾量的指标可能更能真实反映市场行情。 为更好地编写代码和理解指标这里复习一下EMV的公式:首先EMV是由EM计算...

    虽然说是学习的第一个指标,但是其实在上个月我是学过量化的,当时第一个学习的是均线策略,所以这里指的是我在网上开始分享式学习的第一个策略。

    这里为什么选择EMV作为第一个策略进行学习呢,主要还是觉得相比均线这种只考虑价格的指标来说,EMV是兼顾量的指标可能更能真实反映市场行情。

    为更好地编写代码和理解指标这里复习一下EMV的公式:首先EMV是由EM计算出来的,短均线和长均线组成。EM = ((当日最高价+当日最低价)/2 - (昨日最高价+昨日最低价)/2)*(当日最高-当日最低)/成交量。

    接下来一步一步来:

    1、定义获取本地股票数据的函数

    def get_stock_data(inport_code, start_date=None, end_date=None,
                       usecols=('trade_date','open','high','low','close','pre_close','pct_chg','vol','amount'),
                       recover_type='后复权'):
        '''
        读取股票行情数据(只支持price)
        :param inport_code: 股票代码(纯数字字符串)
        :param start_date: 开始时间
        :param end_date: 截止时间
        :param usecols: 获取的列
        :param recover_type: 复权类型
        :return: 
        '''
        # 判断所属市场
        if inport_code.startswith('6'):  # 判断市场标识
            market_code = inport_code + '.SH'
        else:
            market_code = inport_code + '.SZ'
    
        # 读取文件
        file_root = os.path.join(r'G:\PycharmProjects\DeltaTrader\data\data_tushare\{}.csv'.format(market_code))
        data = pd.read_csv(file_root, parse_dates=['trade_date'], index_col='trade_date', usecols=usecols)
    
        # 对起始时间参数进行处理
        if start_date is not None: 
            start_date = datetime.datetime.strptime(start_date, '%Y-%m-%d')
        else:
            start_date = data.index[0]
        # 对结束时间参数进行处理
        if end_date is not None: 
            end_date = datetime.datetime.strptime(end_date, '%Y-%m-%d')
        else:
            end_date = data.index[-1]
        # 获取指定日期的数据
        data = data.loc[start_date:end_date,]
    
        # 计算复权价
        data = cal_recover_price(data, recover_type)
        return data
    if __name__ == '__main__':
        # pass
        df = get_stock_data('000001','2010-01-01')
        print(df)  

     

    2、接下来计算指标并计算买卖信号(由于成交量会受到除权的影响,所以我采用成交额替代成交量,不合适的话可以指出来哪里有问题。)

     

    3、根据买卖信号计算每日收益率

    def account(data, slippage=1/1000, commision_rate=1/1000):
        '''
        根据每日仓位计算总资产的 日收益率
        :param df:
        :param slippage: 滑点 默认千分一
        :param commision_rate: 手续费 默认千分一
        :return: df['capital_rtn']
        '''
        # 生成副本
        data = data.copy()
        data['capital_rtn'] = np.nan
        data.iloc[0, -1] = 0
    
        # 当加仓时,计算当天的计算曲线 capital_rtn = 昨天的position在今天的涨幅 + 今天开盘新买入position涨幅(扣除手续费)
        data['capital_rtn'] = np.where(
            data['position'] > data['position'].shift(1),
            data['position'].shift(1) * data['pct_chg'] * 0.01 + \
            (data['position'] - data['position'].shift(1)) * \
            (data['close'] / data['open'] - 1) * (1 - slippage - commision_rate),
            data['capital_rtn']
        )
        # 当减仓时,计算当天的计算曲线 capital_rtn = 今天的position的涨幅 + 今天开盘卖出position在今天的涨幅(扣除手续费)
        data['capital_rtn'] = np.where(
            data['position'] < data['position'].shift(1),
            data['position'] * data['pct_chg'] * 0.01 + \
            (data['position'].shift(1) - data['position']) * \
            (data['open'] / data['close'].shift(1) - 1) * \
            (1 - slippage - commision_rate),
            data['capital_rtn']
        )
        # 当仓位不变时,当天capital_rtn = 当天的ptc_change*position
        data['capital_rtn'] = np.where(
        data['position'] == data['position'].shift(1),
        data['position'] * data['pct_chg'] * 0.01, \
        data['capital_rtn'])
    
        return data

     

    4、根据资产日收益率计算年化收益率,为了规避停牌造成的影响这里要用市场的交易日历为计算,另外顺便计算最大回撤。

    def market_calendar():
    
        # 获取交易日历
        calendars = pd.read_csv(r'G:\PycharmProjects\DeltaTrader\data\finance\2021-08-07_tsc.csv',
                                index_col='cal_date', parse_dates=['cal_date'])
        return calendars
    
    def annual_return(date_line, capital_line):
        '''
        计算年化收益率
        :param date_line: 时间序列
        :param capital_line: 账户价值序列
        :return:
        '''
        # 将数据合并为DateFrame,并按日期排列
        data = pd.DataFrame({'capital':capital_line}, index=date_line)
        # 计算年化收益率
        calendars = market_calendar()
        periods = data.index # 获取个股交易日
        days = calendars.loc[periods[0]:periods[-1]] # 计算股市开市天数
        annual = np.divide(data.iloc[-1]['capital'], data.iloc[0]['capital']) ** (243/len(days.index))-1
    
        return annual
    
    def max_drawdown(date_line, capital_line):
        '''
        计算最大回撤
        :param date_line: 时间序列
        :param capital_line: 账户价值序列
        :return: 返回最大回撤的值
        '''
    
        # 将数据合并为DateFrame,并按日期排列
        data = pd.DataFrame({'date': date_line, 'capital': capital_line})
        # 计算最大净值
        data['max_here'] = data['capital'].expanding().max()
        # 计算当日回撤
        data['dd_here'] = data['capital']/data['max_here']
        # 找的最大化回撤的 结束时间 和 值
        end_date, remains = tuple(data.sort_values('capital',ascending=False).iloc[0][['date', 'dd_here']])
        # 找到最大回撤开始时间
        start_date = data.sort_values('capital').iloc[0]['date']
        # print(f'最大回撤为:{(1-remains)*100}%\n开始时间:{start_date}\n结束时间:{end_date}')
    
        return 1-remains

    5、最后写一段代码,对所有股票进行回撤

    if __name__ == '__main__':
        # 遍历所有股票文件获取文件名,得到股票代码
        for root, dirs, files in os.walk(r'G:\PycharmProjects\DeltaTrader\data\data_tushare'):
            # 结果容器
            result = []
            for code in files:
                try:
                # 获取对应股票数据
                    df = dt.get_stock_data(code.split('.', maxsplit=1)[0])
                # 剔除空数据
                except IndexError as e:
                    print(e, code)
                    continue
                # 剔除数据长度不满一年半
                if len(df.index) < 366:
                    continue
                print(code)
                # 策略数据容器
                re = pd.DataFrame(
                    columns=['code', 'start', 'param', 'strategy_rtn', 'stock_rtn', 'strategy_ma', 'stock_ma', 'excessive_rtn'])
                # 计算股票累计收益
                df['stock_capital'] = (df['pct_chg'] * 0.01 +1).cumprod()
                # 调整param
                i = 0
                for p in range(5,27,2):
                    for q in range(5,27,2):
                        if p >= q:
                            continue
                        # 计算交易信号
                        df_stg = EMV2(df, p, q)
                        # 计算策略单次收益
                        df_stg = account(df_stg)
                        # 计算策略资金曲线
                        df_stg['capital'] = (df_stg['capital_rtn']+1).cumprod()
    
                        # 获取时间序列 和 股票and策略 资金曲线
                        date_line = df_stg.index
                        capital_line = df_stg['capital']
                        stock_total = df_stg['stock_capital']
    
                        # 策略的年化收益
                        strategy_rtn = annual_return(date_line, capital_line)
                        # 股票的年化收益
                        stock_rtn = annual_return(date_line, stock_total)
                        # 股票最大回撤
                        stock_md = max_drawdown(date_line, stock_total)
                        # 策略最大回撤
                        strategy_md = max_drawdown(date_line, capital_line)
                        # ========根据资金曲线计算相关评价指标========
                        re.loc[i, 'code'] = df_stg.iloc[0]['ts_code']
                        re.loc[i, 'start'] = df_stg.index[0]
                        re.loc[i, 'param'] = str(p)+'_'+str(q)
                        re.loc[i, 'strategy_rtn'] = strategy_rtn
                        re.loc[i, 'stock_rtn'] = stock_rtn
                        re.loc[i, 'strategy_md'] = strategy_md
                        re.loc[i, 'stock_md'] = stock_md
                        re.loc[i, 'excessive_rtn'] = re.loc[i, 'strategy_rtn'] - re.loc[i, 'stock_rtn']
                        i +=1
                        print(f'循环{i}遍')
    
                # 获取最优参数和数据
                re.sort_values('excessive_rtn', ascending=False, inplace=True)
                result.append(re.iloc[0])
        # 合并表格
        re = pd.concat(result, ignore_index=True, axis=0)
        re.to_csv(r'G:\PycharmProjects\DeltaTrader\data\example\EMV.csv',header=False, index=False, mode='a')

    搞定!由于数据量特别大,这里就不贴结果了,感兴趣的可以去看下这个帖子:https://blog.csdn.net/xingbuxing_py/article/details/78545509?spm=1001.2014.3001.5501

    展开全文
  • 简易波动指标EMV基础知识介绍:EMV的计算公式_EMV应用法则简易波动...EMV指标是一个将价格与成交量的变化结合在一起的指标。其设计者认为,价格在上升趋势的保持过程中不会耗用太多的能量,仅当趋势发生转折时成交...

    简易波动指标EMV基础知识介绍:EMV的计算公式_EMV应用法则

    简易波动指标(EMV),它是根据成交量和人气的变化,构成一个完整的股价系统循环。指示投资者在人气聚集且成交热络的时候买进股票,并且在成交量逐渐展现无力,而狂热的投资者尚未察觉能量即将用尽时,卖出股票。

    EMV指标是一个将价格与成交量的变化结合在一起的指标。其设计者认为,价格在上升趋势的保持过程中不会耗用太多的能量,仅当趋势发生转折时成交量才会放大。这种说法虽然与传统价升量增的观点相悖,但确有独到之处。

    从EMV指标的设计理念来看,投资者应当高度重视其所发出的信号。因为该指标可以依靠指标的变动情况,就能得出一个主力资金粗略的控盘程度。

    计算公式

    1. A=(今日最高+今日最低)/2

    B=(前日最高+前日最低)/2

    C=今日最高-今日最低

    2.EM=(A-B)*C/今日成交额

    3.EMV=N日内EM的累和

    4.MAEMV=EMV的M日简单移动平均

    5.参数N为14,参数M为9

    应用法则

    1.EMV指标上升代表放量上升,在股价上升阶段是正常信号;EMV指标下降代表缩量下跌,在股价下跌阶段也是正常信号。

    2.EMV由下往上穿越0轴时,视为中期买进信号;EMV由上往下穿越0轴时,视为中期卖出信号;

    3.MAEMV穿越0轴所发出的信号,可信度较高。

    4.EMV与MAEMV之间的交叉状况仍然值得注意。

    5.EMV指标应与趋向指标(DMI)配合使用。当DMI中的ADX低于PDI及MDI时,或ADXR出现“指标失效”信号时,应停止使用EMV指标。

    6.EMV指标同样适用于形态理论。

    注意要点

    1.EMV指标反应的是价格运行全过程中成交量的动态变化情况。因此,指标对价格的中长期走势更具有警示性。须长期使用EMV指标,才能获得最佳投资效果。

    展开全文
  • 致初学者: 大家好,我是一个马叉虫的宽客:Tao,从本期...EMV简易波动指标,是为数不多的考虑价量关系的技术指标。它刻画了股价在下跌的过程当中,由于买气不断的萎靡退缩,致使成交量逐渐的减少,EMV 数值也因而尾随.

    在这里插入图片描述

    致初学者:

    大家好,我是一个马叉虫的宽客:Tao,从本期开始,我将为大家带来一系列的量化指标。众所周知,认识技术指标是作为一个从事二级市场必不可少的技能。相信开始对量化感兴趣的宽客们都有一两个自己擅长的技术指标,而对技术指标进行量化策略的构建是最简单最基本的量化实现,宽客们,通过本期学习,一起来实现并尝试改善专属于自己的技术指标吧!

    宽客:Tao

    简介

    EMV简易波动指标,是为数不多的考虑价量关系的技术指标。它刻画了股价在下跌的过程当中,由于买气不断的萎靡退缩,致使成交量逐渐的减少,EMV 数值也因而尾随下降,直到股价下跌至某一个合理支撑区,捡便宜货的买单促使成交量再度活跃,EMV 数值于是作相对反应向上攀升。

    当EMV 数值由负值向上趋近于零时,表示部分信心坚定的资金,成功的扭转了股价的跌势,行情不断反转上扬,并且形成另一次的买进信号。

    基本用法

    EMV 在0 以下表示弱势,在0 以上表示强势;EMV 由负转正应买进,由正转负应卖出。

    EMV 上穿MAEMV 则买入;EMV 下穿MAEMV 则卖出。

    EMV 大于0,买入;EMV 小于0,卖出。

    本策略用法

    EMV 在0 以下表示弱势,在0 以上表示强势;EMV 由负转正应买进,由正转负应卖出。

    CCI计算方法

    在这里插入图片描述

    策略代码

    function AT_EMV(bInit,bDayBegin,cellPar)
    %EMV简易波动指标量化择时策略:
    %arrayfun函数:MATLAB的滚动窗口运行函数,具有并行运算效果,提高代码的运行效率
    %%
    %全局变量:
    global g_idxK;
    global g_idxAlpha;
    global TLen;
    global DayNum;
    global EMVvalue;
    global EMVconut;

    %赋值:
    Len = cellPar{1};
    DayTime=cellPar{2};
    freq = cellPar{3};

    %%
    if bInit
    %初始化读取所有数据:
    traderSetParalMode(false); %并行执行时方便设置断点调试
    g_idxK=traderRegKData(freq,1); %数据提取
    TLen = length(g_idxK(:,1)); %股票总数量
    g_idxAlpha=traderRegUserIndi(@myEMV,{Len}); %策略逻辑实现
    DayNum=0;
    EMVconut=1;
    else
    %主题策略部分:
    if bDayBegin
    %每日交易第一根Bar初始化设置:
    DayNum=DayNum+1;
    end
    if DayNum==1||mod(DayNum,DayTime)0
    disp(DayNum);
    %提取数据:
    EMV = traderGetRegUserIndi(g_idxAlpha,1); %alpha因子值读取
    if (sum(EMV
    0)==TLen)
    return;
    else
    if EMVconut
    EMVvalue(:,2)=EMV;
    EMVconut=0;
    return;
    else
    EMVvalue=[EMVvalue(:,2),EMV]; %用于存储多个计算出的EMV值
    %资金分配:
    num=sum(EMVvalue(:,1)<0&EMVvalue(:,2)>0); %准备下单的标的数
    mp=traderGetAccountPositionV2(1,1:TLen); %仓位读取
    [,MarketCap,,,] = traderGetAccountInfoV2(1); %获取动态权益
    Stock_flow = ((MarketCap)0.4)/num; % 每只股票分配的资金
    getKData = traderGetRegKData(g_idxK,1,false);%获取K线数据
    Close=getKData(5:8:end,1);
    shareNum = 100
    floor((Stock_flow./Close)/100); %计算购买股票数量;

               %信号设置:
               A=EMVvalue(:,1)<0&EMVvalue(:,2)>0&mp==0&shareNum>0;  %买入
               B=EMVvalue(:,1)>0&EMVvalue(:,2)<0&mp~=0;  %卖出
    
               idx=1:TLen;
               %进仓:
               arrayfun(@(x) traderDirectBuyV2(1,x,shareNum(x),0,'market','buy1'), idx(A==1), 'UniformOutput', false);
               %平仓:
               arrayfun(@(x) traderPositionToV2(1,x,0,0,'market','sell'), idx(B==1), 'UniformOutput', false);
           end
       end
    

    end
    end
    end

    function value=myEMV(cellPar,bpPFCell)
    %全局变量声明:
    global g_idxK;
    global TLen;
    %赋值:
    Len = cellPar{1};
    %提取数据:
    getKData = traderGetRegKData(g_idxK,Len+1,false,bpPFCell);%getKData:双标签矩阵:每8行表示一只标的,
    %八行中每行对应的数据为:(1)时间、(2)开盘价、(3)最高价、(4)最低价、(5)收盘价、(6)成交量、(7)成交金额、(8)持仓量。
    high=getKData(3:8:end,:);
    low=getKData(4:8:end,:);
    volume=getKData(6:8:end,:);
    value=zeros(size(high(:,1))); %只返回每只标的当天计算的值
    if sum(isnan(high(:,1)))TLen
    return;
    else
    %step1:
    MID=((high(:,2:end)+low(:,2:end))/2)-((high(:,1:end-1)+low(:,1:end-1))/2); %MID有可能等于0
    %step2:
    BRO=volume(:,2:end)./(high(:,2:end)-low(:,2:end));%BRO有可能为inf
    %step3:
    EM=MID./BRO;
    %step4:
    EMV=MEAN(EM,Len);
    EMV(EMV
    inf)=0;
    EMV(isnan(EMV))=0;
    value=EMV(:,end);
    end
    end
    function value = MEAN(A,N)
    value=cell2mat(arrayfun(@(L) mean(A(:,L-N+1:L),2),N:size(A,2),‘UniformOutput’,false));

    回测分析

    回测设置:

    1、回测标的:HS300
    2、回测时间:20050901-20180101,共13年
    3、初始资金:1千万
    4、资金分配:40%流动资金均等分配给准备下单的股票。

    回测结果:

    权益曲线

    在这里插入图片描述

    绩效分析
    在这里插入图片描述

    结论

    1、EMV 策略操作简单,策略回测效果一般。

    2、该策略在2008年金融危机以及2015年证券危机时段并没有判断出熊市趋势。

    3、下面我们来探讨就以上两个亏损点的主要原因。

    对于亏损点一:

    回顾EMV 指标计算公式,若行情没有经历或者短暂经历价格下跌伴随着成交量放大的情况,而快速过渡到量价起升的阶段,这使得EMV 数值不会这么快回复到0(这种情况往往是行情阶段底部V 字反转的形态。

    对于亏损点二:

    指标在0 附近波动,意味着小的价格移动或者大的成交量。
    参考文献
    [1]百度云盘:技术指标系列(九)——EMV指标改进用法识别尖部能力强 ,密码:q71s

    https://pan.baidu.com/share/init?surl=WgDaG6KceH_1SA7ur0e_Rw

    [2]百度百科:EMV指标
    [3]MBA智库百科:简易波动指标

    展开全文
  • 前两天看到一篇论文《基于EMV指标的量化交易策略在我国A股市场的研究》,想想看我们学习talib中居然没有这个指标,至少目前还没碰见。作者通过EMV指标实现了年化20%的收益。对于一个本...

    前两天看到一篇论文《基于EMV指标的量化交易策略在我国A股市场的研究》,想想看我们学习talib中居然没有这个指标,至少目前还没碰见。作者通过EMV指标实现了年化20%的收益。对于一个本着学习目的的我来说,学一学EMV指标确实挺好。想想看要是自己也能开发这样一套系统的话,想想都觉得美滋滋。但毕竟咋不是专业的,野路子就要咋不断的动手了,希望黄天不负有心人吧!

    1.EMV到底是什么?

    简易波动指标(EMV),是为数不多的考虑价量关系的技术指标。它是根据成交量和人气的变化,构成一个完整的股价系统循环。该指标指示投资者在人气聚集且成交热络的时候买进股票,并且在成交量逐渐展现无力时,卖出股票。具体来说,当股价下跌时,由于买方萎靡退缩,致使成交量逐渐的减少,EMV数值也因而尾随下降,直到股价下跌至某一个合理支撑区,捡便宜货的买单促使成交量再度活跃,EMV 数值于是作相对反应向上攀升。所以EMV 指标的上升下降意味着市场的强弱变化,可以以此作为择时的判断依据。

    2.EMV的计算公式

    EM=((high[i]+low[i])/2-(high[i-1]+low[i-1])/2)*(high[i]-low[i])/volum[i]
    #EMV表示EM的n日平均值
    EMV=talib.SMA(EM,n)  
    #MAEMV表示m日的EMV的均值
    MAEMV=talib.SMA(EMV,m)
    

    3.使用python实现上述公式并作图

    def TEMV(data,fasttimeperiod,lasttimeperiod):
        temp=data
        temp['sub']=2
        emFront=talib.DIV(talib.ADD(temp['high'],temp['low']),temp['sub'])
        emFrontSub=talib.DIV(talib.ADD(temp['high'].shift(1),temp['low'].shift(1)),temp['sub'])
        emEnd=talib.DIV(talib.SUB(temp['high'],temp['low']),temp['volume'])
        em= talib.SUB(emFront,emFrontSub)*emEnd
        EMV=talib.SMA(em,fasttimeperiod)
        MAEMV=talib.SMA(EMV,lasttimeperiod)
        return EMV,MAEMV
    

    小结:通过上述简易的Demo,我们发现emv指标确实能够捕捉到一些信号。至少会比我盲听别人的观点强的多。作为一个专业搞软件的同学,我觉得咋就搭建一个系统然后做一个EMV策略。因为咋也没做过投资,那就按一般的常识做。当emv和maemv指数均大于0,并且emv指数上穿maemv我们就买入,当emv下穿maven咋就卖出。并设定投资金额是5000元人名币,每次笔交易的服务费是0.2%

    策略运行结果如下:

    分析一下:emv的周期我设置的是5,maemv的周期设置的是10,当emv和maemv指数均大于0,并且emv指数上穿maemv我们就买入,当emv下穿maven咋就卖出。每次买入信号来的时候买100股,每次卖出信号来的时候全部卖出。总之在年末我的账面资金是:

    这里贴一下耗了一下午的策略。算是学了python吧

    
    
    import talib
    import matplotlib.pyplot as plt
    from matplotlib.pylab import date2num
    import matplotlib.ticker as ticker  # 用于日期刻度定制
    import baostock as bs
    import pandas as pd
    import datetime
    from matplotlib import colors as mcolors  # 用于颜色转换成渲染时顶点需要的颜色格式
    from matplotlib.collections import LineCollection, PolyCollection  # 用于绘制直线集合和多边形集合
    from matplotlib.widgets import Cursor  # 处理鼠标
    
    
    totalRmb=10000
    handTotal=0
    buysell=[]
    myRmb=[]
    def date_to_num(dates):
        num_time = []
        for date in dates:
            date_time = datetime.datetime.strptime(date,'%Y-%m-%d')
            num_date = date2num(date_time)
            num_time.append(num_date)
        return num_time
    
    
    # 绘制蜡烛图
    def format_date(x, pos=None):
        # 日期格式化函数,根据天数索引取出日期值
        return '' if x < 0 or x > len(date_tickers) - 1 else date_tickers[int(x)]
    
    
    #EMV技术计算
    def TEMV(data,fasttimeperiod,lasttimeperiod):
        temp=data
        temp['sub']=2
        emFront=talib.DIV(talib.ADD(temp['high'],temp['low']),temp['sub'])
        emFrontSub=talib.DIV(talib.ADD(temp['high'].shift(1),temp['low'].shift(1)),temp['sub'])
        emEnd=talib.DIV(talib.SUB(temp['high'],temp['low']),temp['volume'])
        em= talib.SUB(emFront,emFrontSub)*emEnd
        EMV=talib.SMA(em,fasttimeperiod)
        MAEMV=talib.SMA(EMV,lasttimeperiod)
        SubEmv=talib.SUB(EMV,MAEMV)
        return EMV,MAEMV,SubEmv
    
    
    #策略
    def BuySallForEmv(Emv,MaEmv):
        BuyIndex=[]
        SallIndex=[]
        temp=pd.DataFrame({ 'emv' :Emv, 'maemv' :MaEmv})
        for index, row in temp.iterrows():
            if row['emv'] is None:
                continue
            if row['emv'] > 0 and row['maemv']>0 and row['emv']>row['maemv']:
                BuyIndex.append(index)
            elif row['emv']>=0 and row['maemv']>=0 and row['emv']<row['maemv']:
                SallIndex.append(index)
        return BuyIndex,SallIndex
    
    
    
    
    #买股票
    def Dobuy(index,price):
        global totalRmb, handTotal
        global buysell, myRmb
        currentRmb=price*100*1.002
        if totalRmb-currentRmb>0:
            totalRmb=totalRmb-currentRmb
            handTotal=handTotal+1
            buysell.append(index-start)
            myRmb.append(totalRmb+handTotal*100*price)
            print("总金额:" + str(totalRmb) + "   总手数" + str(handTotal)+"   账户总金额:"+str(totalRmb+handTotal*100*price))
        else:
            print("资金不足")
    
    
    #卖股票
    def Dosell(index,price):
        global buysell, myRmb
        global totalRmb, handTotal
        if handTotal>0:
            currentRmb=handTotal*100*price*0.998
            totalRmb=totalRmb+currentRmb
            buysell.append(index-start)
            myRmb.append(totalRmb)
            handTotal=0
            print("总金额:"+str(totalRmb)+"   总手数"+str(handTotal)+"   账户总金额:"+str(totalRmb))
        else:
            print("不用再往出卖了")
    
    
    #历史回测
    def calculateHistory(doBuy,doSell):
        bySort=doBuy.index
        bySell=doSell.index
        doBuy['could']=1
        doBuy['sort']=bySort
        doSell['could']=-1
        doSell['sort']=bySell
        temp=pd.concat([doBuy,doSell])
        wang=temp.sort_values(by="sort", ascending=True)
        for index, row in wang.iterrows():
            print(str(index)+"  "+str(row['could'])+"  "+str(row['sort'])+"   "+str(row['low']))
            if row['could']==1:
                Dobuy(index,float(row['close']))
            elif row['could']==-1:
                price=float(row['close'])
                Dosell(index,price)
    
    
    
    
    lg = bs.login()
    rs = bs.query_history_k_data_plus("sh.600567",
        "date,code,open,high,low,close,preclose,volume,amount,adjustflag,turn,tradestatus,pctChg,isST",
        start_date='1999-07-01', end_date='2020-10-24',
        frequency="d", adjustflag="3")
    
    
    #### 打印结果集 ####
    data_list = []
    while (rs.error_code == '0') & rs.next():
        data_list.append(rs.get_row_data())
    result = pd.DataFrame(data_list, columns=rs.fields)
    window=360
    start=len(result)-window
    #二维数组
    result=result.loc[:,['date','open','high','low','close','volume'] ]
    result=result[-window:]
    
    
    date_tickers=result.date.values
    result.date = range(0, len(result))  # 日期改变成序号
    matix = result.values  # 转换成绘制蜡烛图需要的数据格式(date, open, close, high, low, volume)
    xdates = matix[:,0] # X轴数据(这里用的天数索引)
    #总投资金额为5000元,买入信号出现时每次买一手。如果有卖出信号则全部卖出
    
    
    t3Price = talib.T3(result['close'], timeperiod=10, vfactor=0)
    Adxprice = talib.ADX(result['high'],result['low'],result['close'], timeperiod=5)
    Adxrprice = talib.ADXR(result['high'],result['low'],result['close'], timeperiod=5)
    emv,maemv,subemv=TEMV(result,5,10)
    
    
    buy,sell=BuySallForEmv(emv,maemv)
    realBuy=result.index.isin(buy)
    doBuy=result[realBuy]
    realSell=result.index.isin(sell)
    doSell=result[realSell]
    
    
    upperband, middleband, lowerband = talib.BBANDS(result['close'], timeperiod=5, nbdevup=2, nbdevdn=2, matype=0)
    # 设置外观效果
    plt.rc('font', family='Microsoft YaHei')  # 用中文字体,防止中文显示不出来
    plt.rc('figure', fc='k')  # 绘图对象背景图
    plt.rc('text', c='#800000')  # 文本颜色
    plt.rc('axes', axisbelow=True, xmargin=0, fc='k', ec='#800000', lw=1.5, labelcolor='#800000',
           unicode_minus=False)  # 坐标轴属性(置底,左边无空隙,背景色,边框色,线宽,文本颜色,中文负号修正)
    plt.rc('xtick', c='#d43221')  # x轴刻度文字颜色
    plt.rc('ytick', c='#d43221')  # y轴刻度文字颜色
    plt.rc('grid', c='#800000', alpha=0.9, ls=':', lw=0.8)  # 网格属性(颜色,透明值,线条样式,线宽)
    plt.rc('lines', lw=0.8)  # 全局线宽
    
    
    # 创建绘图对象和4个坐标轴
    fig = plt.figure(figsize=(16, 8))
    left, width = 0.05, 0.9
    ax1 = fig.add_axes([left, 0.6, width, 0.4])  # left, bottom, width, height
    ax2 = fig.add_axes([left, 0.5, width, 0.15], sharex=ax1)  # 共享ax1轴
    ax3 = fig.add_axes([left, 0.35, width, 0.15], sharex=ax1)  # 共享ax1轴
    ax4 = fig.add_axes([left, 0.2, width, 0.15], sharex=ax1)  # 共享ax1轴
    ax5 = fig.add_axes([left, 0.05, width, 0.15], sharex=ax1)  # 共享ax1轴
    plt.setp(ax1.get_xticklabels(), visible=False)  # 使x轴刻度文本不可见,因为共享,不需要显示
    plt.setp(ax2.get_xticklabels(), visible=False)  # 使x轴刻度文本不可见,因为共享,不需要显示
    plt.setp(ax3.get_xticklabels(), visible=False)  # 使x轴刻度文本不可见,因为共享,不需要显示
    
    
    ax1.xaxis.set_major_formatter(ticker.FuncFormatter(format_date))  # 设置自定义x轴格式化日期函数
    ax1.xaxis.set_major_locator(ticker.MultipleLocator(max(int(len(result) / 15), 5)))  # 横向最多排15个左右的日期,最少5个,防止日期太拥挤
    # # 下面这一段代码,替换了上面注释的这个函数,因为上面的这个函数达不到同花顺的效果
    opens, closes, highs, lows = matix[:, 1], matix[:, 4], matix[:, 2], matix[:, 3]  # 取出ochl值
    avg_dist_between_points = (xdates[-1] - xdates[0]) / float(len(xdates))  # 计算每个日期之间的距离
    delta = avg_dist_between_points / 4.0  # 用于K线实体(矩形)的偏移坐标计算
    barVerts = [((date - delta, open), (date - delta, close), (date + delta, close), (date + delta, open)) for date, open, close in zip(xdates, opens, closes)]  # 生成K线实体(矩形)的4个顶点坐标
    rangeSegLow = [((date, low), (date, min(open, close))) for date, low, open, close in  zip(xdates, lows, opens, closes)]  # 生成下影线顶点列表
    rangeSegHigh = [((date, high), (date, max(open, close))) for date, high, open, close in zip(xdates, highs, opens, closes)]  # 生成上影线顶点列表
    rangeSegments = rangeSegLow + rangeSegHigh  # 上下影线顶点列表
    print(rangeSegments)
    cmap = {
            True: mcolors.to_rgba('#000000', 1.0),
            False: mcolors.to_rgba('#54fcfc', 1.0)
       }  # K线实体(矩形)中间的背景色(True是上涨颜色,False是下跌颜色)
    inner_colors = [cmap[opn < cls] for opn, cls in zip(opens, closes)]  # K线实体(矩形)中间的背景色列表
    cmap = {True: mcolors.to_rgba('#ff3232', 1.0),
            False: mcolors.to_rgba('#54fcfc', 1.0)}  # K线实体(矩形)边框线颜色(上下影线和后面的成交量颜色也共用)
    updown_colors = [cmap[opn < cls] for opn, cls in zip(opens, closes)]  # K线实体(矩形)边框线颜色(上下影线和后面的成交量颜色也共用)列表
    #
    ax1.add_collection(LineCollection(rangeSegments, colors=updown_colors, linewidths=0.5,antialiaseds=False))
    # 生成上下影线的顶点数据(颜色,线宽,反锯齿,反锯齿关闭好像没效果)
    ax1.add_collection(PolyCollection(barVerts, facecolors=inner_colors, edgecolors=updown_colors, antialiaseds=False,linewidths=0.5))
    # 生成多边形(矩形)顶点数据(背景填充色,边框色,反锯齿,线宽)
    
    
    # 绘制均线
    mav_colors = ['#ffffff', '#d4ff07', '#ff80ff', '#00e600', '#02e2f4', '#ffffb9', '#2a6848']  # 均线循环颜色
    mav_period = [5, 10, 20, 30, 60, 120, 180]  # 定义要绘制的均线周期,可增减
    # mav_period = [5]  # 定义要绘制的均线周期,可增减
    n = len(result)
    for i in range(len(mav_period)):
        if n >= mav_period[i]:
            mav_vals = result['close'].rolling(mav_period[i]).mean().values
            ax1.plot(xdates, mav_vals, c=mav_colors[i % len(mav_colors)], label='MA' + str(mav_period[i]))
    for index, row in doBuy.iterrows():
        ax1.scatter(index-start, float(row['close']), color="Y", marker="*")
    for index, row in doSell.iterrows():
        ax1.scatter(index-start, float(row['close']), color="b", marker="^")
    
    
    calculateHistory(doBuy,doSell)
    ax1.plot(xdates,t3Price,label='t3price')
    ax1.set_title('sz.002918')  # 标题
    ax1.grid(True)  # 画网格
    ax1.legend(loc='upper left')  # 图例放置于右上角
    ax1.xaxis_date()  # 好像要不要效果一样?
    
    
    barVerts = [((date - delta, 0), (date - delta, vol), (date + delta, vol), (date + delta, 0)) for date, vol in zip(xdates, matix[:, 5])]
    # 生成K线实体(矩形)的4个顶点坐标
    ax2.add_collection(PolyCollection(barVerts, facecolors=inner_colors, edgecolors=updown_colors, antialiaseds=False,linewidths=0.5))
    # 生成多边形(矩形)顶点数据(背景填充色,边框色,反锯齿,线宽)
    if n >= 5:  # 5日均线,作法类似前面的均线
        vol5 = result['volume'].rolling(5).mean().values
        ax2.plot(xdates, vol5, c='y', label='VOL5')
    if n >= 10:  # 10日均线,作法类似前面的均线
        vol10 = result['volume'].rolling(10).mean().values
        ax2.plot(xdates, vol10, c='w', label='VOL10')
    ax2.yaxis.set_ticks_position('right')  # y轴显示在右边
    ax2.legend(loc='upper left')  # 图例放置于右上角
    ax2.grid(True)  # 画网格
    
    
    
    
    ax3.plot(xdates, Adxprice, c='w', label='Adxprice')
    ax3.plot(xdates, Adxrprice, c='b', label='Adxrprice')
    ax3.legend(loc='upper left')  # 图例放置于右上角
    ax3.grid(True)  # 画网格
    
    
    ax4.plot(xdates,emv,c='r',label='EMV')
    ax4.plot(xdates,maemv,c='g',label='MAEMV')
    ax4.axhline(0, ls='-', c='w', lw=0.5)  # 水平线
    ax4.legend(loc='upper left')  # 图例放置于右上角
    ax4.grid(True)  # 画网格
    
    
    ax5.axhline(10000, ls='-', c='w', lw=0.5)  # 水平线
    ax5.plot(buysell, myRmb, c='g', label='割韭菜')
    ax5.legend(loc='upper left')  # 图例放置于右上角
    ax5.grid(True)  # 画网格
    
    
    cursor = Cursor(ax1, useblit=True, color='w', linewidth=0.5, linestyle='--')
    cursor1 = Cursor(ax3, useblit=True, color='w', linewidth=0.5, linestyle='--')
    cursor2 = Cursor(ax4, useblit=True, color='w', linewidth=0.5, linestyle='--')
    
    
    # 登出系统
    bs.logout()
    
    
    plt.show()
    ‍

    展开全文
  • WeQuant交易策略—EMV

    2017-08-10 13:30:00
    EMV指标策略 简介 EMV(Ease of Movement Value, 简易波动指标),它是由RichardW.ArmJr.根据等量图和压缩图的原理设计而成, 目的是将价格与成交量的变化结合成一个波动指标来反映股价或指数的变动状况。 旨在...
  • 贵金属指标详解

    2012-10-10 13:40:55
    三、量价指标 OBV指标 ASI指标 EMV指标 WVAD指标 四、强弱指标 RSI指标 W%R指标 五、停损指标 SAR指标 六、超买超卖指标 KDJ指标 CCI指标 ROC指标 七、压力支撑指标 MIKE指标 布林线指标
  • 详解了常用指标的使用方法和计算方法 目录 MACD指标详解 2 DMI指标详解(趋向指标) 4 RSI指标详解(相对强弱指标) 6 EXPMA指标的使用方法 8 ...EMV指标详解(简易波动指标) 34 TRIX指标详解和应用 36
  • 引言:邢不行的系列帖子“量化小讲堂”,通过实际案例教初学者使用Python进行量化投资,了解行业研究方向,希望能对大家有帮助。...简易波动指标(EMV)策略在A股的实证上一期量化小讲堂向大家介绍...
  • 引言: 邢不行的系列帖子“量化小讲堂”,通过实际案例教初学者使用python进行量化投资,了解行业研究方向,希望能对大家有帮助。 ... 【必读文章】EOS期现套利,一周时间,15%无风险...简易波动指标(EMV)策略在A股...
  • 简易波动EMV策略

    2020-08-04 10:24:05
    与其他技术指标不同,简易波动(Ease of Movement Value)反映的是价格、成交量、人气的变化,它是一种将价格与成交量变化相结合的技术,它通过衡量单位成交量的价格变动,形成一个价格波动指标。当市场人气聚集,...
  • 指标 EMV 在输入参数中有时间帧选项。
  • 指标 EMV_Histogram 在输入参数中有时间帧选项。
  • pmp考试【5】emv期望货币价值计算

    万次阅读 2017-06-06 11:57:29
    EMV ,即 expected monetary value,EMV预期货币价值,是风险定量分析工具,决策树常用的一种计算 预期货币价值分析:(11.4.2.2 定量风险分析和建模技术)  当某些情况在未来可能发生或不发生时,计算平均结果的...
  • EMV非接触金融卡读卡器内一般同时有多个组织的读卡卡协议,如 MASTERCARD PayPass、VISA、AmexExpressPay、DISCOVER、INTERAC、JCB等。各个组织的卡一般都有不同的终端数据配置,即不同的CONFIGURE文件。如何存储...
  • 行情舒缓指标, 以彩色直方图的形式实现。
  • 一款信号量指标, 使用两条 EMV 指标, 基于价格序列的开盘价和收盘价。
  • 在听了易佳咨询骆老师的讲课后,回来做作业。要把P339的 决策树的灰色部分自己会计算,图是这样的: 这里有几个概念。...老外是资本主义社会,一切都喜欢用钱来测量,这个EMV也是如此, M是Monetary的
  • 终端风险管理的内容也是比较容易理解的的。 终端风险管理执行条件比较简单,只要AIP当做的标志位支持终端风险管理,则终端就会进行终端风险管理流程。否则,终端风险管理不执行。TVR的第四个字节全部是用了体现...
  • (十一)、EMV简易波动指标 19 (十二)、WAVD 威廉变异离散量 19 (十三)、RSI 相对强弱指标 19 (十四)、WR 威廉指标 19 (十五)、SAR 抛物线指标 19 (十六)、经典版KDJ 20 (十七)、CCI 商品路径指标...
  • MACD指标参数最佳设置及MACD指标是如何使用的 当我们打开交易软件时,指标名称旁边有一组数字,那是交易软件给定的指标默认参数。MACD也是如此,一般MACD的默认参数是(12,26,9)。这不是固定的,投资者可以根据需要...
  • 股市常用指标

    千次阅读 2019-01-25 01:57:31
    5.须长期使用EMV 指标才能获得最佳利润。   默认值 14、9 推荐值 11、7   VOL-TDX 对当天的最后一根日K线进行全天成交量预测,方便与以前的成交量进行对比     RSI 1.RSI>80...
  • 股票技术指标

    千次阅读 2013-03-11 21:44:32
    ...该指标是一种随股价波动幅度大小而变动的压力支撑指标,股价上方的压力称为“上限”,股价下方的支撑称为“下限”。第一条“上限”和第一条“下限”之间,我们设一条假想的中界线,股价位于中
  • 股票指标

    2013-10-23 23:41:54
    委比是衡量某一时段买卖盘相对强度的指标。 它的计算公式为: 委比=(委买手数-委卖手数)/(委买手数+委卖手数)×100% 委买手数:现在所有个股委托买入下三档的总数量。 委卖手数:现在所有个股委托卖出上三档的...
  • CCI指标详解及实战用法

    千次阅读 2017-04-14 10:09:13
    原文地址:CCI指标详解及实战用法作者:好过些博主 定义  CCI指标又叫顺势指标,其英文全名为Commodity Channel Index,是由美国股市分析家唐纳德•R.兰伯特(Donald R.Lambert)于20世纪80年代所创,是指导股市...
  • 炒股指标分析

    2009-09-10 11:12:21
    (一)MACD DMA TRIX WVAD EMV MACD——平滑移动平均 1.DIF 向上交叉MACD,买进;DIF 向下交叉MACD,卖出; 2.DIF 连续两次向下交叉MACD,将造成较大的跌幅; 3.DIF 连续两次向上交叉MACD,将造成...
  • 股票技术指标简读

    2013-03-05 15:10:08
    技术分析指标精解01 - DMA一、用途:该指标由两条基期不同的平均线组成,属于趋向指标的一种,功能与MACD相近。二、使用方法:1.实线向上交叉虚线,买进2.实线向下交叉虚线,卖出3.当DMA波峰呈现一浪比一浪低,而...
  • 经典技术指标

    2018-01-31 19:20:00
    4.简易波动指标EMV),是为数不多的考虑价量关系的技术指标。它刻画了股价在下跌的过程当中,由于买气不断的萎靡退缩,致使成交量逐渐的减少,EMV 数值也因而尾随下降,直到股价下跌至某一个合理支撑区,捡便宜货...
  • 股票技术指标精解

    万次阅读 2006-07-08 15:50:00
    技术指标精解 (1~25)技术指标精解:MIKE(麦克指标)(1) 一.用途:该指标是一种随股价波动幅度大小而变动的压力支撑指标,股价上方的压力称为“上限”,股价下方的支撑称为“下限”。第一条“上限”和第一条“下限...

空空如也

空空如也

1 2 3 4 5 ... 19
收藏数 374
精华内容 149
关键字:

emv指标