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

实验采取的两种策略:

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

回溯效果:

图片描述

第二种策略

代码如下:



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

回溯效果:

图片描述

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

Raquant镭矿论坛

MACD顶背离背离是指在技术分析中,价格的趋势与MACD指标的趋势出现分歧的现象,通常被用来预测市场可能的转折点。 在编写Python程序来识别MACD顶背离背离时,需要首先计算出价格的移动平均线差异(MACD)和其信号线,然后将这些值与价格本身的高点和低点进行比较,以识别背离现象。 以下是一个简单的示例程序,它使用了pandas和matplotlib库来计算MACD并识别背离: ```python import pandas as pd import matplotlib.pyplot as plt import numpy as np from pandas_datareader import data as pdr # 获取股票数据,这里以苹果公司为例 df = pdr.get_data_yahoo('AAPL') # 计算MACD exp1 = df['Close'].ewm(span=12, adjust=False).mean() exp2 = df['Close'].ewm(span=26, adjust=False).mean() macd = exp1 - exp2 signal = macd.ewm(span=9, adjust=False).mean() # 计算背离 def detect_divergences(prices, macd, signal): peaks = prices['High'].rolling(window=2).apply(lambda x: x[1] < x[0]).astype(int).diff().fillna(0).astype(bool) valleys = prices['Low'].rolling(window=2).apply(lambda x: x[1] < x[0]).astype(int).diff().fillna(0).astype(bool) divergences = pd.DataFrame(index=prices.index) # 背离 for index in peaks[peaks==1].index: if macd[index] > macd[index-1]: divergences.loc[index, 'Bullish_Divergence'] = 'Potential_Buy' # 顶背离 for index in valleys[valleys==1].index: if macd[index] < macd[index-1]: divergences.loc[index, 'Bearish_Divergence'] = 'Potential_Sell' return divergences divergences = detect_divergences(df, macd, signal) df = df.join(divergences) # 绘制图表 fig = plt.figure(figsize=(14,7)) ax1 = fig.add_subplot(111, ylabel='Price in $') df['Close'].plot(ax=ax1, color='black', lw=2.) ax2 = ax1.twinx() df['MACD'].plot(ax=ax2, color='red', lw=2.) df['Signal_Line'].plot(ax=ax2, color='blue') plt.show() # 注意:这个程序仅作为示例,实际交易中需要更严格的逻辑来确认背离 ``` 在使用此代码之前,请确保你已经安装了pandas, matplotlib, numpy和pandas_datareader库。此程序仅作为一个基础的示例,实际应用中可能需要更多的逻辑来确认背离,并结合其他因素如成交量、其他技术指标等来做出更准确的预测。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值