java尝试编写macd,试验顶背离底背离

弧矢继承
• 阅读 5790

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指标的具体计算过程,直接谈一谈本次实验,小编给出策略思想并贴出两种策略分别的回溯效果。

实验采取的两种策略:

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

2.底背离买进,顶背离卖出。

第一种策略

代码如下:

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;
    }
}

回溯效果:

java尝试编写macd,试验顶背离底背离

第二种策略

代码如下:



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;
    }
}

回溯效果:

java尝试编写macd,试验顶背离底背离

相比之下MACD底背离、顶背离,这个逻辑还是蛮狠的。回撤也挺小。

Raquant镭矿论坛

点赞
收藏
评论区
推荐文章
Python进阶者 Python进阶者
3年前
按照A列进行分组并计算出B列每个分组的平均值,然后对B列内的每个元素减去分组平均值
大家好,我是皮皮。一、前言前几天在Python星耀交流群有个叫【在下不才】的粉丝问了一个Pandas的问题,按照A列进行分组并计算出B列每个分组的平均值,然后对B列内的每个元素减去分组平均值,这里拿出来给大家分享下,一起学习。二、解决过程这个看上去倒是不太难,但是实现的时候,总是一看就会,一用就废。这里给出【瑜亮老师】的三个解法,一起来看看吧!方法一:
Wesley13 Wesley13
3年前
java16
1:List的子类(掌握)(1)List的子类特点ArrayList:底层数据结构是数组,查询快,增删慢线程不安全,效率高Vector:底层数据结构是数组,查询快,增删慢线程安全,效率低LinkedList:底层数据结构是链表,查询慢,增删快线程不安全,效率高(2)ArrayListA:
Wesley13 Wesley13
3年前
SQL 如何计算每个分组的中位数
中位数是指一组数据排序以后,位于中间位置的数据值。如果数据个数是奇数,中位数就是最中间位置那个值;如果是偶数,则是中间位置那两个数的平均值。怎么查询出数据分组以后每个组的中位数呢?用SQL来解决这个问题是很有难度的!SQL的集合是无序的,没有数据位置的概念,需要人为地造出行号,但是要对各分组独立编行号也困难。后来在SQL2003标准中加入了窗口函
Karen110 Karen110
4年前
一篇文章带你了解Django ORM操作(高端篇)
前言上次两篇基本学完的DjangoORM各种操作,怎么查,各种查。感兴趣的小伙伴可以戳这两篇文章学习下,、。但是还是遗留了一些技能。,再来瞅瞅吧!查询聚合操作聚合操作,不要被名字吓到了,通常用在筛选完一些数据之后,求一下平均值了,什么的。例如:求所有书的总价格和平均价格原生sqlSELECTSUM(price)AS"所有书总价格",a
Karen110 Karen110
4年前
人工智能数学基础4:离差、平均差、方差、标准差、协方差、皮尔森相关系数
一、离差(Deviation)离差即标志变动度,又称“偏差”,是观测值或估计量的平均值与真实值之间的差,是反映数据分布离散程度的量度之一,或说是反映统计总体中各单位标志值差别大小的程度或离差情况的指标,常写作:即参与计算平均数的变量值与平均数之差。离差的性质有二:(1)离差的代数和等于0;(2)参与计算平均数的各变量值与平均数之差的平均和,小于这些变量值
Stella981 Stella981
3年前
R和python语言如何求平均值,中位数和众数
均值是通过取数值的总和并除以数据序列中的值的数量来计算。R语言平均值公式:mean(x,trim0,na.rmFALSE,...)\x<c(22,13,2,45,56,73,21,44,NA)\result.mean<mean(x,rim0.2,na.rmTRUE)rim0
Stella981 Stella981
3年前
Django ORM (四) annotate,F,Q 查询
annotate可以通过计算查询结果中每一个对象所关联的对象集合,从而得出总计值(也可以是平均值或总和),即为查询集的每一项生成聚合。fromdjango.shortcutsimportrender,HttpResponsefromapp01importmodelsfromapp01.modelsi
Wesley13 Wesley13
3年前
Vector, ArrayList, LinkedList 区别与用法
ArrayList和Vector是采用数组方式存储数据,此数组元素数大于实际存储的数据以便增加和插入元素,都允许直接序号索引元素,但是插入数据要设计到数组元素移动等内存操作,所以索引数据快插入数据慢,Vector由于使用了synchronized方法(线程安全)所以性能上比ArrayList要差,
Stella981 Stella981
3年前
JMeter聚合报告(Aggregate Report)理解
AggregateReport是JMeter常用的一个Listener,中文被翻译为“聚合报告”。    !(https://oscimg.oschina.net/oscnet/4d2ddcd0126629b158ceba312a3aaae3ac5.png)对于每个请求,它统计响应信息并提供请求数,平均值,最大,最小值,错误率,大约吞吐量
Stella981 Stella981
3年前
OpenCv 010
1前备知识(1)标准方差简单来说,标准差是一组数据平均值分散程度的一种度量。一个较大的标准差,代表大部分数值和其平均值之间差异较大;一个较小的标准差,代表这些数值较接近平均值。!(https://oscimg.oschina.net/oscnet/831617be65e39f584f9c64b298b
子桓 子桓
2年前
安卓文件传输不到mac电脑,怎么解决?
安卓文件传输不到mac电脑,怎么解决?别急,赶快入手MacDroidformac中文激活版,专业安卓设备文件传输助手,一款用于Mac和安卓设备之间传输文件的工具。它可以帮助用户在Mac电脑和安卓设备之间共享文件,包括音乐、照片、视频、文档等。以下是MacD