V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
raquant
V2EX  ›  Java

Java 验证 MACD 底背离是否真的有效

  •  
  •   raquant · 2017-03-24 10:57:58 +08:00 · 2161 次点击
    这是一个创建于 2827 天前的主题,其中的信息可能已经有所发展或是发生改变。

    Java 验证 MACD 底背离是否真的有效

    MACD 是查拉尔·阿佩尔(Geral Appel)于 1979 年提出的,由一快及一慢指数移动平均( EMA )之间的差计算出来。“快”指短时期的 EMA ,而“慢”则指长时期的 EMA ,最常用的是 12 及 26 日 EMA ;

    一般 MACD 的值是 12 日的平均值与 26 日平均值的差; SIGNAL 是 MACD9 日平均值; HISTOGRAM 是 MACD 与 SIGNAL 的差。

    公式如下:

    • MACD : EMA(C,12)-EMA(C,26);

    • Signal : EMA(MACD,9);

    • Histogram : MACD-Signal;

    顶背离和底背离的概念:

    MACD 指标的背离就是指 MACD 指标的图形的走势正好和 K 线图的走势方向正好相反。MACD 指标的背离有顶背离和底背离两种。

    ( 1 )顶背离

    当股价 K 线图上的股票走势一峰比一峰高,股价一直在向上涨,而 MACD 指标图形上的由红柱构成的图形的走势是一峰比一峰低,即当股价的高点比前一次的高点高、而 MACD 指标的高点比指标的前一次高点低,这叫顶背离现象。顶背离现象一般是股价在高位即将反转转势的信号,表明股价短期内即将下跌,是卖出股票的信号。

    ( 2 )底背离

    底背离一般出现在股价的低位区。当股价 K 线图上的股票走势,股价还在下跌,而 MACD 指标图形上的由绿柱构成的图形的走势是一底比一底高,即当股价的低点比前一次低点底,而指标的低点却比前一次的低点高,这叫底背离现象。底背离现象一般是预示股价在低位可能反转向上的信号,表明股价短期内可能反弹向上,是短期买入股票的信号。

    在这里,我们忽略 MACD 指标的具体计算过程,直接谈一谈本次实验,小编给出策略思想并贴出两种策略分别的回溯效果。

    实验采取的两种策略:

    • 快线向上突破慢线时,表明股市处于一种强势之中,股价将再次上涨,我们选择买进股票,反之,当慢线向上突破快线时,表明股市处于可能跌入弱市的状态,我们选择卖出股票;

    • 底背离买进,顶背离卖出。

    第一种策略 代码如下:

    class MyStrategy extends Strategy {
        private double prevDelta = 0;
        String stock1 = "sha-601318";
        MACDFactor fMacd = new MACDFactor(12, 26, 9);
      
        public void init(BackTestContext context) {
            universe.add(stock1);
        }
         
        public void prepare(BackTestContext context) {
        }
         
        public void handleData(BackTestContext context, BarData data) throws Exception {
            double macdOut = fMacd.get(stock1, MACDFactor.RET_MACD);
            double macdSignal = fMacd.get(stock1, MACDFactor.RET_MACD_SIGNAL);
            double delta = macdOut - macdSignal;
           
            record("macd", macdOut);
            record("macd_signal", macdSignal);   
            record("macd_hist",delta);
            if (prevDelta > 0 && delta < 0) {
                log.info("Sell at "+""+context.now+delta);
                orderTargetPercent(stock1, 0, "Sell all.");
            } else if (prevDelta < 0 && delta > 0) {
                log.info("Buy at "+context.now+delta);
                orderPercent(stock1, 80, "Buy in.");
            }
            prevDelta = delta;
        }
    }
              
    

    回溯效果:

    第二种策略 代码:

    class MyStrategy extends Strategy {
        private double prevDelta = 0;
        private double prevClose = 0;
        private double countA = 0;
        private double countB = 0;
        String stock1 = "sha-601318";
        MACDFactor fMacd = new MACDFactor(12, 26, 9);
       
        public void init(BackTestContext context) {
            universe.add(stock1);
        }
         
        public void prepare(BackTestContext context) {
        }
         
        public void handleData(BackTestContext context, BarData data) throws Exception {
            log.info("time: "+context.now);
           
            double delta = fMacd.get(stock1, MACDFactor.RET_MACD_HIST);
            record("macd_hist", delta);
            if (delta < prevDelta && data.get(stock1).close > prevClose) {
                countB = 0;
                if(countA%5 == 0 && countA != 0 ){
                    log.info("Sell at "+context.now+" "+delta);
                    orderTargetPercent(stock1, 0, "Sell all.");
                }
                else{
                    countA += 1;
                }          
            }else if (delta > prevDelta && data.get(stock1).close < prevClose){
                countA = 0;
                if(countB%5 == 0 && countB != 0 ){
                    log.info("Buy at "+context.now+" "+delta);
                    orderPercent(stock1, 80, "Buy in.");
                }else{
                    countB += 1;
                }      
            }    
            prevDelta = delta;
            prevClose = data.get(stock1).close;
        }
    }
    

    回溯效果:

    如果你是程序员,也可以进去 Raquant 镭矿 自己试试哦!

    第 1 条附言  ·  2017-03-24 14:45:24 +08:00
    <a href="http://www.raquant.com/?pk_campaign=v2ex">raquant</a>
    vjnjc
        1
    vjnjc  
       2017-03-24 11:24:14 +08:00
    我以为是一个算法,类似 MD5 的。。。
    austinchou0126
        2
    austinchou0126  
       2017-03-24 17:06:57 +08:00 via iPhone
    就一回测算法墨迹半天...另外还有推广嫌疑,也是没谁了
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2910 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 34ms · UTC 14:27 · PVG 22:27 · LAX 06:27 · JFK 09:27
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.