精华内容
下载资源
问答
  • macd策略代码
    2021-03-13 10:03:22

    function MACD(freq,shareNum)%

    %买卖原则为:

    %dif-dea均为正,且dif上扬,买入信号参考。

    %dif-dea均为负,且dif下跌,卖出信号参考。

    targetList = traderGetTargetList();

    %获取目标资产信息

    HandleList = traderGetHandleList();

    %获取账户句柄

    for i=1:length(targetList);

    %--------------------仓位、K线、当前bar的提取-----------------------------%

    %获取当前仓位

    [marketposition,~,~]=traderGetAccountPosition(HandleList(1),targetList(i).Market,targetList(i).Code);

    %策略中每次取数据的长度

    lags=300;

    barnum=traderGetCurrentBar(targetList(i).Market,targetList(i).Code);

    if(barnum

    continue;

    end

    %获取K线数据

    [time,open,high,low,close,volume,turnover,openinterest] = traderGetKData(targetList(i).Market,targetList(i).Code,'min',freq, 0-lags, 0,false,'FWard');

    % [Dtime,Dopen,Dhigh,Dlow,Dclose,Dvolume,Dturnover,Dopeninterest] = traderGetKData(targetList(k).Market,targetList(k).Code,'day',1,0-dlags, 0,false,'FWard');

    %-------------------------交易逻辑-------------------------------%

    %得到MACD指标

    [ema12]=traderEMA(12,targetList(i).Market,targetList(i).Code,'day',1, 0-lags, 0,false,'FWard');

    [ema26]=traderEMA(26,targetList(i).Market,targetList(i).Code,'day',1, 0-lags, 0,false,'FWard');

    dif=ema12-ema26;

    dea=zeros(length(dif),1);

    for j=2:length(dif)

    dea(j,1)=2/10*dif(j,1)+8/10*dea(j-1,1);%在DEA里,C=DIF,N=9,所以EMA(DIF,9)=2/10*今天的DIF+8/10*昨天的DIF

    end

    macd=(dif-dea)*2;

    %macd=MACD(close,12,26,9);

    %交易条件

    con1= dif(end)>dif(end-1) &&dif(end)>dea(end); %MACD金叉:DIF由下向上突破DEA,为买入信号。

    con2= dif(end)

    con3= macd(end)>0&macd(end-1)<0;%MACD值由负变正,市场由空头转为多头。

    con4= macd(end-1)>0&macd(end)<0;%MACD值由正变负,市场由多头转为空头。

    con5= dif(end)>0&&dea(end)>0 && dif(end)>dea(end);  %DIF与DEA均为正值,即都在零轴线以上时,大势属多头市场,DIFF向上突破DEA,可作买。

    con6= dif(end)<0&&dea(end)<0&&dif(end)

    if marketposition==0 && con1;

    orderID1=traderBuy(HandleList(1),targetList(i).Market,targetList(i).Code,shareNum,0,'market','buy1');%开多单

    % traderStopLossByOrder(HandleList(1),orderID1,stopTar,'Percent','market','stoplossS');%对订单百分比止损

    %traderStopTrailingByOrder(HandleList(1),orderID1,profitTar,'Percent',pct,'Percent','market','trailingS');%对订单百分比跟踪止盈

    end

    if marketposition==0 && con2;

    orderID2=traderSellShort(HandleList(1),targetList(i).Market,targetList(i).Code,shareNum,0,'market','sell1');%开空单

    %traderStopLossByOrder(HandleList(1),orderID2,stopTar,'Percent',shareNum,'market','stoplossB');%对订单百分比止损

    %traderStopTrailingByOrder(HandleList(1),orderID2,profitTar,'Percent',pct,'Percent','market','trailingB');%对订单百分比跟踪止盈

    end

    if marketposition>0&&con3 && con6;

    traderSellShort(HandleList(1),targetList(i).Market,targetList(i).Code,shareNum,0,'market','sell1');%开空单

    end

    if marketposition<0&&con4 && con5;

    traderBuyToCover(HandleList(1),targetList(i).Market,targetList(i).Code,shareNum,0,'market','buy1');

    end

    end

    end

    更多相关内容
  • MACD策略的matlab全程代码,清楚的秒回macd用于matlab软件实现的全过程
  • 解释: 下面定义了四个函数。但是,其实只用了第一个函数,跟最后一个函数。这两个函数是必有的。 多定义的这几个函数 getPrice,跟getRolling 也是比较简单的。 除开这两个自定的函数外...代码 import talib ...

    解释:

    • 下面定义了四个函数。但是,其实只用了第一个函数,跟最后一个函数。这两个函数是必有的。
    • 多定义的这几个函数 getPrice,跟getRolling 也是比较简单的。
    • 除开这两个自定的函数外,另外两个函数,相信,看到了我做的注释之后,看起来会简单很多。(后续,如果想看对于这个两个自定函数的分析。除了看上面的注释之外,我在最后也会做解释的~

    代码

    import talib
    
    # 初始化函数
    def init(context):  # 设置参数
        context.s1 = "000001.XSHE" 
        context.SHORTPERIOD = 12 # EMA 快
        context.LONGPERIOD = 26  # EMA 慢
        context.SMOOTHPERIOD = 9
        context.OBSERVATION = 100  # 查看的天数,这个在后面会用到
    
    
    # 用户自定义函数
    def getPrice():  # 封装好米矿的API,这里是获取数据
      stocks_name='沪深300'
      start_date='2016-10-01'
      end_date='2017-10-13'
    #   fields=['ClosingPx']
      #选择沪深300里面所有的股票代码
      stocks=index_components(stocks_name)
      #正式获取股票价格
      stock_price=get_price(stocks,start_date=start_date,end_date=end_date,fields=fields)
      #获得沪深300指数
      benchmark_name='399300.XSHE'
      benchmark_price=get_price(benchmark_name,start_date=start_date,end_date=end_date,fields=fields)
      return stock_price,benchmark_price,stocks
    
    
    
    #  用户自定义函数  
    def getRolling(data,shortPeriod,longPeriod):  # 这里假设的是data是一个dataframe.
      for i in range(len(data.ix[1])):
        col=data.ix[:,i]
        name=data.columns[i]
        data[name+'_'+str(shortPeriod)+'days']=col.rolling(window=shortPeriod).mean()
        data[name+'_'+str(longPeriod)+'days']=col.rolling(window=longPeriod).mean()
      return data
    
    #  上面两个用户自定义函数,在这个策略中都没有用到~
    
    # 操作函数
    def handle_bar(context, bar_dict):
        prices = history_bars(context.s1, context.OBSERVATION, '1d', 'close')
        # 得到目前前 OBSERVATION天的日收盘价
    
        macd, signal, hist = talib.MACD(prices, context.SHORTPERIOD, context.LONGPERIOD, context.SMOOTHPERIOD)
        # 这里的返回值 macd 就是离差值DIF = EMA12 - EMA26
        # 这里的返回值 signal 就是离差平均值DEA 
    
        ## [-1]得到的是当前的值, [-2]是指前一天的数值
        if macd[-1] - signal[-1] > 0 and macd[-2] - signal[-2] < 0:
            # 满仓入股
            order_target_percent(context.s1, 1)  # 仓位调整,肠胃的目标比例价值为目标
            # 投资组合中的百分比
            # logger.info(context.introduction)
            context.day = 0
    
        if macd[-1] - signal[-1] < 0 and macd[-2] - signal[-2] > 0:
            # 获取该股票的仓位
            curPosition = context.portfolio.positions[context.s1].quantity
            # context.portfolio是类自带元素(同样是一个类)类内元素,通过之前设计股票代码来进行寻找(寻找的函数就是positions).通过quantity 来进行查询量
            # 清仓
            if curPosition > 0:
                order_target_value(context.s1, 0)  # 仓位调整,价值调整。后面是目标价值(在投资中)
    

    自定义函数解释

    获得价格的函数

    # 用户自定义函数
    def getPrice():  # 封装好米矿的API,这里是获取数据
      stocks_name='沪深300'
      start_date='2016-10-01'
      end_date='2017-10-13'
    #   fields=['ClosingPx']
      #选择沪深300里面所有的股票代码
      stocks=index_components(stocks_name)
      #正式获取股票价格
      stock_price=get_price(stocks,start_date=start_date,end_date=end_date,fields=fields)
      #获得沪深300指数
      benchmark_name='399300.XSHE'
      benchmark_price=get_price(benchmark_name,start_date=start_date,end_date=end_date,fields=fields)
      return stock_price,benchmark_price,stocks
    
    • 这个函数用了一些简单的API。分别是:index_components, 跟get_price
    • get_price, 这个函数就是字面意思,获取价格。前面放的是股票的代码。 然后设置起始日期跟终止日期。最后一个fields是返回字段名称。然后这里的这个代码那选择了注释的原因是,米矿的API做了修改。不再是ClosingPx,而是close,这样来表示收盘价。 为什么要设置这个呢?主要是数据会比较多,所以建议还是选择好特定的列嘛。这样会比较简单。还有其他的意思。这个可以在API中查,还是很详细的~
    • index_components : 是获取一个指数的所有股票代码。这里用的是查沪深300的所有股票代码

    getRolling函数

    • 这里其实是假设用到了pandas库的。很明显,data.ix[] 这是pandas中dataFrame的典型函数。(当然啦,也不排除是其他库的可能,但用Python的经验告诉我,这就是pandas)
    • dataframe的组成那些,我就不在这里多嘴了。如果不嫌弃,大家也可以在我的数据分析可以博客分栏中可以找到吧。当然网上玩pandas比我玩的溜的大神也是一大把的 hh
    • 这个函数主要用了dataframe.ix[]函数。dataframe.columns函数。Series.rolling函数。
    • 具体的话,可以在pandas官网上查,或者百度,google都可以。pandas官网,点击访问
    #  用户自定义函数  
    def getRolling(data,shortPeriod,longPeriod):  # 这里假设的是data是一个dataframe.
      for i in range(len(data.ix[1])):
        col=data.ix[:,i]
        name=data.columns[i]
        data[name+'_'+str(shortPeriod)+'days']=col.rolling(window=shortPeriod).mean()
        data[name+'_'+str(longPeriod)+'days']=col.rolling(window=longPeriod).mean()
      return data
    

    希望,看到这篇博文能给一部分人帮助,成为一个又一个Quanter吧~

    附上一篇关于rolling函数的解析~
    https://blog.csdn.net/wj1066/article/details/78853717

    展开全文
  • MACD简单策略(R语言代码

    千次阅读 2020-02-03 23:18:18
    在《R的极客理想》中看到一个MACD的简单策略。觉得还行,记下来以后优化用。我添加了一些注释帮助大家理解证券交易和R语言代码。 安装需要的包 一次都装上,备用 > pkgs <- c("quantmod","zoo","xts","TTR",...

    在《R的极客理想》中看到一个MACD的简单策略。觉得还行,记下来以后优化用。我添加了一些注释帮助大家理解证券交易和R语言代码。

    安装需要的包

    一次都装上,备用

    > pkgs <- c("quantmod","zoo","xts","TTR","PerformanceAnalytics","ggplot2")
    > install.packages(pkgs)
    
      There is a binary version available but the source version is later:
        binary source needs_compilation
    zoo  1.8-6  1.8-7              TRUE
    
      Binaries will be installed
    ……
    trying URL 'https://mirrors.tongji.edu.cn/CRAN/bin/windows/contrib/3.6/ggplot2_3.2.1.zip'
    Content type 'application/zip' length 3974945 bytes (3.8 MB)
    downloaded 3.8 MB
    
    package ‘quantmod’ successfully unpacked and MD5 sums checked
    package ‘zoo’ successfully unpacked and MD5 sums checked
    package ‘xts’ successfully unpacked and MD5 sums checked
    package ‘TTR’ successfully unpacked and MD5 sums checked
    package ‘PerformanceAnalytics’ successfully unpacked and MD5 sums checked
    package ‘ggplot2’ successfully unpacked and MD5 sums checked
    
    The downloaded binary packages are in
        C:\Users\chang\AppData\Local\Temp\RtmpygTUIm\downloaded_packages
    > 

    下载股价数据

    载入quantmod包,数据源是Yahoo,当然外国网站,你懂的,有时候不是能用的。下载全球五大指数数据。

    指数名称
    英文简称
    标普500
    GSPC
    日经225
    N225
    恒生指数
    HSI
    富时新加坡指STI数
    STI
    上证指数
    SSE

    file

    > library(quantmod)
    载入需要的程辑包:xts
    载入需要的程辑包:zoo
    
    载入程辑包:‘zoo’
    
    The following objects are masked from ‘package:base’:
    
        as.Date, as.Date.numeric
    
    Registered S3 method overwritten by 'xts':
      method     from
      as.zoo.xts zoo 
    载入需要的程辑包:TTR
    Registered S3 method overwritten by 'quantmod':
      method            from
      as.zoo.data.frame zoo 
    Version 0.4-0 included new data defaults. See ?getSymbols.
    > options(stringsAsFactors = FALSE)
    > # 指定股票代码,从yahoo下载
    > # 开始日期,自动判断最近交易日,不用自己费心
    > symbols <- c("^GSPC","^N225","^HSI","^STI","000001.SS")
    > suppressWarnings(getSymbols(symbols,src = "yahoo",from="2012-01-01"))
    > 
    ‘getSymbols’ currently uses auto.assign=TRUE by default, but will
    use auto.assign=FALSE in 0.5-0. You will still be able to use
    ‘loadSymbols’ to automatically load data. getOption("getSymbols.env")
    and getOption("getSymbols.auto.assign") will still be checked for
    alternate defaults.
    
    This message is shown once per session and may be disabled by setting 
    options("getSymbols.warning4.0"=FALSE). See ?getSymbols for details.
    
    [1] "^GSPC"     "^N225"     "^HSI"      "^STI"      "000001.SS"
    > head(`000001.SS`)
               000001.SS.Open 000001.SS.High 000001.SS.Low 000001.SS.Close 000001.SS.Volume 000001.SS.Adjusted
    2012-01-04       2211.995       2217.520      2168.644        2169.390            49200           2169.390
    2012-01-05       2160.897       2183.404      2145.556        2148.452            58800           2148.452
    2012-01-06       2148.147       2164.322      2132.626        2163.395            50600           2163.395
    2012-01-09       2164.741       2226.218      2148.453        2225.890            76800           2225.890
    2012-01-10       2221.832       2288.628      2218.275        2285.744           109600           2285.744
    2012-01-11       2282.913       2290.644      2265.185        2276.046            84400           2276.046

    处理股价数据

    > # 准备用收益率替代指数价格,方便对比比较
    > df <- merge(GSPC$GSPC.Adjusted,N225$N225.Adjusted,HSI$HSI.Adjusted,STI$STI.Adjusted,`000001.SS`$`000001.SS.Adjusted`)
    > names(df) <- c("GSPC","N225","HSI","STI","SSE")
    > head(df)
                  GSPC    N225      HSI     STI      SSE
    2012-01-03 1277.06      NA 18877.41 2688.36       NA
    2012-01-04 1277.30 8560.11 18727.31 2711.02 2169.390
    2012-01-05 1281.06 8488.71 18813.41 2713.02 2148.452
    2012-01-06 1277.81 8390.35 18593.06 2715.59 2163.395
    2012-01-09 1280.70      NA 18865.72 2691.28 2225.890
    2012-01-10 1292.08 8422.26 19004.28 2719.83 2285.744
    > g <- ggplot(aes(x = Index,y = Value,color = Series),data = fortify(df,melt = TRUE))   geom_line(size = 1)   scale_y_continuous(breaks = seq(1000,30000,4000))   ggtitle("Gloabel Index")
    > g

    file

    很明显,直接的价格无法比较,所以我们都转化为收益率。顺便算一下年收益率。

    > library(PerformanceAnalytics)
    
    载入程辑包:‘PerformanceAnalytics’
    
    The following object is masked from ‘package:graphics’:
    
        legend
    
    > ret_df <- Return.calculate(df,method="discrete")
    > chart.CumReturns(ret_df,legend.loc = "topleft",main="Cumulative Daily Returns for Gloable Index")
    > Return.annualized(ret_df)
                           GSPC      N225        HSI        STI       SSE
    Annualized Return 0.1157303 0.1510661 0.05739009 0.03016343 0.0374123
    > 

    file

    指数年收益率
    GSPC0.1157303
    N2250.1510661
    HSI
    0.05739009
    STI
    0.03016343
    SSE
    0.0374123

    MCAD策略

    这个策略很简单,就是一根30日简单均线的趋势跟踪策略。

    ># MACD模型
    >MACD <- function(dt,n=30){
      names(dt) <- c('close')
      #均线
      dat <- na.locf(dt) #na.locf删掉数据里面的所有NA
      dat$ma <- SMA(dat$close,n)
      #买卖信号
      sig_buy <- which(dat$ma-dat$close>0)
      sig_sell <- which(dat$ma-dat$close<0)
      sig_buy <- sig_buy[which(diff(sig_buy)>1)]
      sig_sell <- sig_sell[which(diff(sig_sell)>1)]
      if(first(sig_sell)<first(sig_buy)) sig_sell <- sig_sell[-1]
      if(last(sig_sell)<last(sig_buy)) sig_buy <- sig_buy[-length(sig_buy)]
      trade_dat <- do.call(rbind.data.frame,apply(cbind(sig_buy,sig_sell), 1, function(row){
      dt[row[1]:row[2],]
          }))
      ret_trade <- Return.calculate(trade_dat,method="discrete")
      return(ret_trade)
      }
    > #用MACD计算一遍历史数据,计算每日收益
    > macd_ret <- lapply(df,function(col) MACD(col,30))
    > #算年收益率
    > t(do.call(rbind.data.frame,lapply(macd_ret, Return.annualized)))
               GSPC      N225       HSI        STI       SSE
    close 0.2082891 0.1823697 0.1879596 0.03251933 0.1429962
    > 

    指数指数年收益率MACD策略年收益率
    GSPC0.1157303
    0.2082891
    N2250.1510661
    0.1823697
    HSI
    0.057390090.1879596
    STI
    0.030163430.03251933
    SSE
    0.0374123
    0.1429962

    改善明显啊 。

    从2012年到2020年,居然美股达到了年化20%的收益率。巴菲特啊。日本和香港也能18%。A股票也很争气,14%相当漂亮啊。

    补充说明

    感谢阅读,欢迎关注和留言

    展开全文
  • python实现MACD均线择时策略

    千次阅读 多人点赞 2020-11-01 20:48:33
    今天我们将以MACD为例,探究如何利用技术指标进行策略的构建与实现。 > MACD的组成 MACD(Moving Average Convergence and Divergence)即指数平滑移动平均线,由Geral Appel 于1970年提出,属于大势趋势类指标,...

    本文采用了聚宽平台接口进行量化策略设置:

    1 确定策略内容

    在之前的教程中,我们学习了如何通过财务指标等对股票进行筛选等操作。今天我们将以MACD为例,探究如何利用技术指标进行策略的构建与实现。

    > MACD的组成
    MACD(Moving Average Convergence and Divergence)即指数平滑移动平均线,由Geral Appel 于1970年提出,属于大势趋势类指标,它由***长期慢速均线DEA,短期快线的DIF,红色能量柱(多头),绿色能量柱(空头)、0轴(多空分界线)***五部分组成,即“两线两柱一轴”组合起来形成。

    gaitubao_com_14957648667277.jpeg

    在图中表示出来则为:
    gaitubao_com_14957632961470.jpg

    图中水平线为零轴,又称多空分水岭,顾名思义上方为多头势力较强,下方则为空头势力较强。
    当短期快线DIF值和长期慢线DEA值上穿零轴,同时零轴之上出现红色柱状体,表示股价趋势当时属于多头市场,投资者可以考虑持股待涨。
    DIF值和DEA值下穿零轴,同时零轴之下出现绿色柱状体,则表示股价趋势当时属于空头市场,投资者应当空仓持币,规避风险。

    > MACD思想————均线位置与买卖时机判断
    MACD是从双指数移动平均线发展而来的,由快的指数移动平均线(EMA12)减去慢的指数移动平均线(EMA26)得到快线DIF,再用2×(快线DIF-DEA)得到MACD柱。MACD的意义和双移动平均线相似,即由快、慢均线的离散、聚合来显示当前的多空状态和股价可能的发展变化趋势并对买进、卖出时机作出研判,但MACD阅读起来更方便。
    总体而言:
    当MACD从负数转向正数,即买入信号
    当MACD从正数转向负数,即卖出信号
    当MACD以大角度变化,表示快的移动平均线和慢的移动平均线的差距非常迅速的拉开,代表了一个市场大趋势的转变

    > DIF与DEA金叉的使用
    当白线即短期快线DIF向上穿过黄色的长期慢线DEA时,即“快线高于慢线”,属于做多金叉信号。然而实际中需要进行**“金叉+零轴”**的综合考虑。

    当零轴之下出现金叉时,股价属于弱势市场,金叉为弱势金叉,股价极有可能短期弱势反弹或暂时止跌后再度夭折,一般没有做多价值。
    当零轴之上发生金叉时,股价属于强势市场,金叉为强势金叉,股价后市成功惯性上攻的概率较高。若零轴之上出现二次金叉信号时,又称零上二次红金叉,属于股价强势中的强势,此时跟进做多,股价往往容易出现加速上涨。属于短线极佳买点。
    gaitubao_com_14957675709948.jpg

    > DIF与DEA死叉的使用
    当白线即短期快线DIF向下穿过黄色的长期慢线DEA时,即“快线低于慢线”,属于做空死叉信号。死叉同样需要结合零轴。

    当零轴之上出现死叉时,一般认为是股价上升趋势途中的短暂回调,后市股价仍有再次走强的可能。
    当零轴之下发生死叉时,一般认为是股价下跌趋势途中的继续回调,后市股价惯性下跌的概率较高,尤其是MACD零轴之下出现二次死叉时,股价更容易出现加速下跌行情,所以零轴之下,无论出现的是一次死叉或二次死叉,投资者都应当空仓观望,静观其变。

    策略内容
    了解了MACD的基本情况,我们就能够制定本次利用技术指标构建的策略内容。

    基本思路:

    • 筛选出符合:
      10<市盈率(pe_ratio)<40, 市净率(pb_ratio)❤️, 净利润环比增长率(inc_net_profit_annual)>0.3,净资产收益率(roe)>15的股票,按照销售毛利率进行降序排列,选取前50只
    • 买入:DIF从下而上穿过DEA,即形成金叉
    • 卖出:DIF从上往下穿过DEA,即形成死叉
    • 十天一次调仓

    翻译成计算机语言即:
    1.运用get_fundalmentals函数查询相关财务数据并筛选出符合条件的股票
    2.运用talib读取MACD相关指标数值
    3.利用if条件语句以及andor逻辑语句进行买入卖出条件设置

    2 基本框架构建

    在之前的教程中,我们基本上已经整理出交易之前策略构成的基本框架。下面我们对这一内容再次进行细化:
    首先是initialize()函数的设置。这里我们沿用之前的做法,将其分为多个自定义函数的形式:

    def initialize(context):
        set_params()    #设置相关参数
        set_backtest()  #设置回测基本数据
        run_daily(trade, 'every_bar')
    
    def set_params():
        g.days=0        #起始日期为0
        g.refresh_rate=10   #调仓周期设置为10日
    
    def set_backtest():
        set_benchmark('000905.XSHG')        #将基准设置为中证500
        set_option('use_real_price', True)  #开启动态复权
        log.set_level('order', 'error')     #设定报错等级
    
    

    以及对滑点、手续费、过滤停牌、退市及ST股票的设置

    #每天开盘前要做的事情
    def before_trading_start(context):
        set_slip_fee(context)
    
    # 根据不同的时间段设置滑点与手续费
    def set_slip_fee(context):
        set_slippage(FixedSlippage(0.02)) 
    
        dt=context.current_dt
        if dt>datetime.datetime(2013,1, 1):
            set_order_cost(OrderCost(open_tax=0, close_tax=0.001, open_commission=0.0003, close_commission=0.0003, close_today_commission=0, min_commission=5), type='stock')
        else:
            set_order_cost(OrderCost(open_tax=0, open_commission=0.003,close_commission=0.003, close_tax=0.001,min_commission=5), type='stock')
    
    # 过滤停牌、退市和ST股票
    def paused_filter(security_list):
        current_data = get_current_data()
        security_list = [stock for stock in security_list if not current_data[stock].paused]
        return security_list
    
    def delisted_filter(security_list):
        current_data = get_current_data()
        security_list = [stock for stock in security_list if not '退' in current_data[stock].name]
        return security_list
    
    def st_filter(security_list):
        current_data = get_current_data()
        security_list = [stock for stock in security_list if not current_data[stock].is_st]
        return security_list
    
    

    3 MACD数据读取

    根据我们策略的内容,我们采用的思路是:筛选出股票池中质量较高的股票–>查询MACD指数–>买入卖出条件
    再次复习我们熟悉的选股方法:财务指标。这里我们挑选出符合:
    10<市净率(pe_ratio)<40,每股盈余(eps)>0.3,净资产收益率(roe)>15,净利润环比增长率>0.3,并按照市净率进行升序排列,取前五十只。

    stock_to_choose = get_fundamentals(query(
            valuation.code, valuation.pe_ratio, 
            valuation.pb_ratio,valuation.market_cap, 
            indicator.eps, indicator.inc_net_profit_annual
        ).filter(
            valuation.pe_ratio < 40,
            valuation.pe_ratio > 10,
            indicator.eps > 0.3,
            indicator.inc_net_profit_annual > 0.30,
            indicator.roe > 15
        ).order_by(
            valuation.pb_ratio.asc()
        ).limit(
            50), date=None)
    
    

    将筛选后得到股票代码放置在stockpool的list列表中,以便之后对列表进行循环。

        stockpool = list(stock_to_choose['code'])  #将筛选出的股票代码存入list中
        stockpool = paused_filter(stockpool)
        stockpool = delisted_filter(stockpool)
        stockpool = st_filter(stockpool)    #过滤停牌、退市及ST股票
        long_list = []     #买入列表
        short_list = []    #卖出列表
        hold = []          #持有列表
    
    

    对于筛选出来的股票依次读取MACD数据。这里就需要用到talib库中MACD函数。TA-Lib中文全称为技术分析库,是一个广泛用在程序化交易中进行金融市场数据的技术分析的函数库。它提供了多种技术分析的函数,包含多种指标如ADX, MACD, RSI, 布林轨道等等,可以极大地方便我们量化投资中编程工作。

    Talib中的MACD函数使用时格式为:

    MACD(price, fastperiod=12, slowperiod=26, signalperiod=9)
    
    

    传入函数的三个参数分别为短线周期、长线周期以及MACD的移动平滑周期。这里我们使用最常用的(12,26,9)组合。MACD()函数返回值共有三个,分别为DIF,DEA和MACD

    if g.days%g.refresh_rate == 0:
            for stock in stockpool:
                prices = attribute_history(stock,300, '1d',['close'])       #取较长周期的数据,这里为300日
                price = array(prices['close'])                              #将price一列函数格式变为array
                macd_tmp = talib.MACD(price, fastperiod=12, slowperiod=26, signalperiod=20)   #将参数传入MACD函数中
                DIF = macd_tmp[0]           #返回的数据分别为短期慢线DIF、长期快线DEA及MACD
                DEA = macd_tmp[1]
                MACD = macd_tmp[2]
    
    

    答疑与延伸:
    -为什么要通过macd_tmp[0]来读取数据? 因为MACD返回的是一个包括三个元素的序列array,和从list中取元素类似,我们通过在其后加上0的方式分别取第一个元素和第二个元素。
    -为什么要选取300日的历史数据? MACD存在一个问题,即若选取时间较短,则可能出现不收敛的状况,因此这里我们选取300日的数据。

    4 买入卖出条件设置

    策略中我们要判断长线和短线的位置问题。这里我们做一些简化,判断当日和三日前的MACD正负情况。
    当日MACD为正且三日前MACD为负–>金叉形成 买入
    当日MACD为负且三日前MACD为正–>死叉形成 卖出

    将股票代码通过append()函数放在相应的买卖列表当中。

                if MACD[-1] > 0 and MACD[-4] < 0:
                    long_list.append(stock)       #将出现金叉的股票代码放入long_list中
                elif MACD[-1] < 0 and MACD[-4] > 0:
                    short_list.append(stock)      #将出现死叉的股票代码放入short_list中
                stockset = list(context.portfolio.positions.keys())   #获得当前持仓状况
    
    

    当对筛选后保留的股票进行循环之后,符合条件的股票已经被放入买入或卖出列表中。下面查看当前所持有的股票,如果在卖出列表当中则全部卖出,不是则保留,并将股票代码放入hold[]列表中

                for stock in stockset:
                    if stock in short_list:
                        order_target_value(stock, 0)      #卖出在short_list中的股票
                    else:
                        hold.append(stock)                #保留不在short_list中的股票并将代码放在hold[]中,表示可以继续持有
    
    

    买入long_list中除去已持有的股票:

            buy_list = []                  #设定一个新的空的list代表需要买入的股票
            for stock in long_list:
                if stock not in hold:
                    buy_list.append(stock) #把在long_list中目前未持有的股票放入buy_list中代表接下来需要买入的股票
    
    

    将可用资金根据股票数量进行均分。为避免出现除数为0的状况在这里进行一个判断。

            if len(buy_list)==0:    #如果要买入列表股票数量为0
                Cash = context.portfolio.available_cash
            else:
                Cash = context.portfolio.available_cash/len(buy_list)
                for stock in buy_list:
                    order_target_value(stock, Cash)        
            g.days = 1         
        else:
            g.days += 1        #天数+1进行调仓周期的循环
    
    

    策略完成,进行回测

    把买入卖出的代码写好,策略就写完了,完整代码如下:

    import pandas as pd
    import numpy as np
    import talib  ## 使用talib计算MACD的参数
    
    def initialize(context):
        set_params()
        set_backtest()
        run_daily(trade, 'every_bar')
    
    def set_params():
        g.days=0    
        g.refresh_rate=10 
    
    def set_backtest():
        set_benchmark('000905.XSHG') 
        set_option('use_real_price', True)  
        log.set_level('order', 'error')
    
    #每天开盘前要做的事情
    def before_trading_start(context):
        set_slip_fee(context)
    
    # 根据不同的时间段设置滑点与手续费
    def set_slip_fee(context):
        set_slippage(FixedSlippage(0.02)) 
    
        dt=context.current_dt
        if dt>datetime.datetime(2013,1, 1):
            set_order_cost(OrderCost(open_tax=0, close_tax=0.001, open_commission=0.0003, close_commission=0.0003, close_today_commission=0, min_commission=5), type='stock')
        else:
            set_order_cost(OrderCost(open_tax=0, open_commission=0.003,close_commission=0.003, close_tax=0.001,min_commission=5), type='stock')
    
    # 过滤停牌、退市、ST股票
    def paused_filter(security_list):
        current_data = get_current_data()
        security_list = [stock for stock in security_list if not current_data[stock].paused]
        return security_list
    
    def delisted_filter(security_list):
        current_data = get_current_data()
        security_list = [stock for stock in security_list if not '退' in current_data[stock].name]
        return security_list
    
    def st_filter(security_list):
        current_data = get_current_data()
        security_list = [stock for stock in security_list if not current_data[stock].is_st]
        return security_list
    
    #######进行操作的过程#######   
    def trade(context):
        stock_to_choose = get_fundamentals(query(
            valuation.code, valuation.pe_ratio, 
            valuation.pb_ratio,valuation.market_cap, 
            indicator.eps, indicator.inc_net_profit_annual
        ).filter(
            valuation.pe_ratio < 40,
            valuation.pe_ratio > 10,
            indicator.eps > 0.3,
            indicator.inc_net_profit_annual > 0.30,
            indicator.roe > 15
        ).order_by(
            valuation.pb_ratio.asc()
        ).limit(
            50), date=None)
    
        stockpool = list(stock_to_choose['code'])
        stockpool = paused_filter(stockpool)
        stockpool = delisted_filter(stockpool)
        stockpool = st_filter(stockpool)
    
        long_list = []
        short_list = []
        hold = []
    
        if g.days%g.refresh_rate == 0:
            for stock in stockpool:
                prices = attribute_history(stock,300, '1d',['close'])
                price = array(prices['close'])
                macd_tmp = talib.MACD(price, fastperiod=12, slowperiod=26, signalperiod=20)
                DIF = macd_tmp[0]
                DEA = macd_tmp[1]
                MACD = macd_tmp[2]
    
                # 判断MACD走向
                if MACD[-1] > 0 and MACD[-4] < 0:
                    long_list.append(stock)
                elif MACD[-1] < 0 and MACD[-4] > 0:
                    short_list.append(stock)
    
            stockset = list(context.portfolio.positions.keys())
    
            for stock in stockset:
                if stock in short_list:
                    order_target_value(stock, 0) 
                else:
                    hold.append(stock)#如果不在卖出列表里则持有
    
            buy_list = []
            for stock in long_list:
                if stock not in hold:
                    buy_list.append(stock)#新增的买入股票
    
            if len(buy_list)==0: 
                Cash = context.portfolio.available_cash
            else:
                Cash = context.portfolio.available_cash/len(buy_list)
                for stock in buy_list:
                    order_target_value(stock, Cash)        
            g.days = 1
        else:
            g.days += 1
    
    展开全文
  • 经典MACD交易策略

    2021-04-23 13:56:02
    经典MACD交易策略经典MACD交易策略Author: Hukybo, Date: 2019-10-25 16:43:14Tags: MACD Python摘要相信做过交易的人对MACD都不陌生,这是一个非常古老的技术指标,它是由查拉尔·阿佩尔(Geral Appel)在上个世纪70...
  • MACD策略学习

    千次阅读 2020-04-08 00:33:08
    MACD策略回测 常规MACD策略为在0轴上金叉买入,在0轴之下死叉卖出 策略模板代码 import numpy as np import pandas as pd # 导入技术分析库 import talib as tb def initialize(context):# 初始化 g.security = '...
  • python实现MACD.py

    2020-05-20 16:46:58
    python实现MCDA模型,使用python以类的方式实现MACD。用实例化的方式创建模型使用,其中MACD模型需要实时传入三个数据模型会自动计算实时的MACD值。
  • MACD择时策略

    2021-09-15 23:45:08
    一、MACD择时策略: 1.买入规则:DIF上穿DEA,买入股票 2.卖出规则:DIF下穿DEA,卖出股票 3.止损价:max(移动止损,固定止损) 移动止损:ma - std 固定止损:开仓价 - 开仓的std ''' import tushare as ts ...
  • 上一回,我们基于简单的MACD策略回测了华正新材这只股票的收益率,发现效果非常好,收益达到了26.9%,但这个策略放到其他股票上会不会有这么高的收益呢?我们今天就来试试看这个策略在不考虑基本面,只考虑技术面的...
  • python实现MACD策略背离点的判断

    千次阅读 2020-01-10 14:22:36
    MACD策略python实现背离点的判断 话不多说直接贴代码和运行结果!! ****运行环境:**PyCharm2017.1 import baostock as bs import pandas as pd import talib as ta import matplotlib.pyplot as plt def ...
  • backtrader由德国工程师开发,拥有股票的回测,检测交易策略,支持期货实时交易,对于股票交易还在完善,我尝试了pylagotrade,vn.py,发现backtrader功能强大,交易策略全面,一直想用zipline写交易策略,但是一直...
  • Python 量化投资实战教程(2) —MACD策略(+26.9%) Python 量化投资实战教程(3) —A股回测MACD策略 Github仓库:https://github.com/Ckend/pythondict-quant 上一回,我们基于简单的MACD策略回测了华正新材这只股票的...
  • Python 量化投资实战教程(2) —MACD策略(+26.9%) Python 量化投资实战教程(3) —A股回测MACD策略 Github仓库:https://github.com/Ckend/pythondict-quant 上次,我们简单地用Python 和 backtrader 使用最简单的...
  • MACD均线择时策略是十分基础的策略,适合咱们这种新手学习,这篇博客就分享一下基于聚宽实现MACD均线择时策略代码: 注:需要到聚宽的量化平台去运行。 # MACD均线择时策略 ''' 筛选出符合: 10<市盈率...
  • 量化交易-MACD策略学习

    千次阅读 2018-11-04 15:45:25
    MACD的基本概念,可以参考 https://www.joinquant.com/post/7095?f=18newyearjx ,感谢 Quant中找米吃的阿鼠 和 聚宽小秘书 Thanks♪(・ω・)ノ 我认为MACD不适合采用轮动策略,经过回测,我将策略改成以下模式:
  • %%此程序用来计算MACD指标并对其有效性进行回测检验%%原始数据命名为stk_clpr,且第一列为收盘价,第二列为交易日期%% 计算相关指标(这里也可编一个函数),第一天初始化:DIFF=DEA=MACD=0,EMAshort=EMAlong=第一天的...
  • MACD指标定义 MACD称为异同移动平均线,是从双指数移动平均线发展而来的,由快的指数移动平均线(EMA12)减去慢的指数移动平均线(EMA26)得到快线DIF,再用2×(快线DIF-DIF的9日加权移动均线DEA)得到MACD柱。MACD...
  • 代码: # 导入函数库 from jqdata import * # 初始化函数,设定基准等等 def initialize(context): # 设定沪深300作为基准 set_benchmark('000300.XSHG') # 开启动态复权模式(真实价格) set_option('use_real_...
  • MACD日回测代码以及MACD的计算方法

    万次阅读 2017-09-13 19:56:55
    开始学习期货的量化交易,从米筐API上拷贝的一个关于股指期货主力合约日级别MACD日回测的入门代码: 首先,先看一下关于MACD的介绍以及计算方式:MACD称为指数平滑移动平均线,是从双指数移动平均线发展而来,由快...
  • Python量化交易 MACD计算
  • 这一次,让我们把策略变得复杂一点,使用MACD策略的信号线交叉交易法: 本系列教程源代码Github仓库:https://github.com/Ckend/pythondict-quant 1.原理 为了解释MACD的原理,我们需要先了解指数移动平均线(下...
  • 量化策略开发,高质量社群,交易思路分享等相关内容
  • 我试图了解库存数据并在python中实现它.在开始我在Python 库中使用MACD指标stockstats.我想知道,如果我有一个特定股票的100个OHLC条目,我怎样...示例代码如下:import pandas as pdfrom stockstats import StockData...
  • macd, macd_signal, macd_hist = talib.MACD(closes, fastperiod=12, slowperiod=26, signalperiod=9) # 金叉,满仓买入 if short_ma[-2] [-2] and short_ma[-1] > long_ma[-1]: order_percent(symbol=bar...
  • 一千多个MT4学习源码,各种策略合集,共同学习
  • 从数学角度来分析,MACD指标是根据均线的构造原理,对股票收盘价进行平滑处理,计算出算术平均值以后再进行二次计算,它是属于趋向类指标。 MACD指标是由三部分构成的,分别是:DIF(离差值,也叫差离值)、DEA...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 784
精华内容 313
关键字:

macd策略代码