精华内容
下载资源
问答
  • macd策略
    2020-10-29 22:03:58

    商品期货Python版MACD策略(教学)

    商品期货Python版MACD策略(教学)

    Author: 小小梦, Date: 2020-06-30 14:02:19

    Tags: Python MACD

    商品期货Python版MACD策略(教学)

    策略仅作教学使用。

    如有问题欢迎留言。

    商品期货策略,不支持数字货币。

    '''backtest

    start: 2020-03-01 00:00:00

    end: 2020-06-29 00:00:00

    period: 1h

    basePeriod: 1m

    exchanges: [{"eid":"Futures_CTP","currency":"FUTURES"}]

    '''

    # 全局变量

    ChartCfg = {

    '__isStock': True,

    'title': {

    'text': 'Python MACD 策略图表'

    },

    'yAxis': [{

    'title': {'text': 'K线'},

    'style': {'color': '#4572A7'},

    'opposite': False

    }, {

    'title': {'text': '指标轴'},

    'opposite': True

    }],

    'series': [{

    'type': 'candlestick',

    'name': '当前周期',

    'id': 'primary',

    'data': []

    }, {

    'type': 'line',

    'id': 'dif',

    'name': 'DIF',

    "yAxis" : 1,

    'data': []

    }, {

    'type': 'line',

    'id': 'dea',

    'name': 'DEA',

    "yAxis" : 1,

    'data': []

    }, {

    'type': 'line',

    'id': 'macd',

    'name': 'MACD',

    "yAxis" : 1,

    'data': []

    }]

    }

    IDLE = -1

    def trade(direction, amount, price):

    if direction == IDLE and amount > 0:

    exchange.SetDirection("buy")

    exchange.Buy(price, abs(amount))

    elif direction == IDLE and amount < 0:

    exchange.SetDirection("sell")

    exchange.Sell(price, abs(amount))

    if direction == PD_LONG or direction == PD_LONG_YD:

    exchange.SetDirection("closebuy_today" if direction == PD_LONG else "closebuy")

    exchange.Sell(price, abs(amount))

    elif direction == PD_SHORT or direction == PD_SHORT_YD:

    exchange.SetDirection("closesell_today" if direction == PD_SHORT else "closesell")

    exchange.Buy(price, abs(amount))

    def updatePos():

    while True:

    orders = _C(exchange.GetOrders)

    if len(orders) == 0:

    break

    for i in range(len(orders)):

    exchange.CancelOrder(orders[i].Id, orders[i])

    Sleep(1000)

    pos = _C(exchange.GetPosition)

    if len(pos) == 0:

    return IDLE, 0

    return pos[0].Type, pos[0].Amount

    def main():

    global ChartCfg

    state = IDLE

    preTime = 0

    chart = Chart(ChartCfg)

    chart.reset()

    while True:

    if exchange.IO("status"):

    info = _C(exchange.SetContractType, Symbol)

    while True:

    r = _C(exchange.GetRecords)

    if len(r) > FastPeriod and len(r) > SlowPeriod and len(r) > SignalPeriod:

    break

    # 计算指标

    macd = TA.MACD(r, FastPeriod, SlowPeriod, SignalPeriod)

    if macd[0][-3] is None or macd[1][-3] is None:

    continue

    LogStatus(_D(), "已经连接")

    # 画图

    for i in range(len(r)):

    if r[i]["Time"] == preTime:

    chart.add(0, [r[i]["Time"], r[i]["Open"], r[i]["High"], r[i]["Low"], r[i]["Close"]], -1)

    chart.add(1, [r[i]["Time"], macd[0][i]], -1)

    chart.add(2, [r[i]["Time"], macd[1][i]], -1)

    chart.add(3, [r[i]["Time"], macd[2][i]], -1)

    elif r[i]["Time"] > preTime:

    chart.add(0, [r[i]["Time"], r[i]["Open"], r[i]["High"], r[i]["Low"], r[i]["Close"]])

    chart.add(1, [r[i]["Time"], macd[0][i]])

    chart.add(2, [r[i]["Time"], macd[1][i]])

    chart.add(3, [r[i]["Time"], macd[2][i]])

    preTime = r[i]["Time"]

    # 检测交易信号

    if macd[0][-2] < 0 and macd[1][-2] < 0 and macd[0][-3] < macd[1][-3] and macd[0][-2] > macd[1][-2] and (state != PD_LONG and state != PD_LONG_YD):

    # 平空仓,开多仓 或者 开多仓

    state, amount = updatePos()

    if state == PD_SHORT or state == PD_SHORT_YD:

    trade(state, amount, r[-1]["Close"] + info["PriceTick"] * SlidePoint)

    elif state == IDLE:

    trade(state, Amount, r[-1]["Close"] + info["PriceTick"] * SlidePoint)

    elif macd[0][-2] > 0 and macd[1][-2] > 0 and macd[0][-3] > macd[1][-3] and macd[0][-2] < macd[1][-2] and (state != PD_SHORT and state != PD_SHORT_YD):

    # 平多仓,开空仓 或者 开空仓

    state, amount = updatePos()

    if state == PD_LONG or state == PD_LONG_YD:

    trade(state, amount, r[-1]["Close"] - info["PriceTick"] * SlidePoint)

    elif state == IDLE:

    trade(state, -Amount, r[-1]["Close"] - info["PriceTick"] * SlidePoint)

    else :

    LogStatus(_D(), "未连接")

    Sleep(500)

    相关内容

    更多内容

    更多相关内容
  • 【量化投资】成功率极高的MACD策略python编程实现
  • MACD策略的matlab全程代码,清楚的秒回macd用于matlab软件实现的全过程
  • 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 = '...

    概念介绍

    • 移动平均值(EMA)

       EMA(12)=前一日EMA(12)×11/13+今日收盘价×2/13
       EMA(26)=前一日EMA(26)×25/27+今日收盘价×2/27
      

      计算移动均值是一个不断累加并调整系数的过程。与传统均值的区别在于:移动均值参考到该股票自上市以来每一天的收盘价,并在每次累计上新的收盘价时,弱化之前收盘价的比重,以实现动态累计的效果。

    • 离差值(DIF)

       DIF=今日EMA(12)-今日EMA(26)
      

      离差值是双均线策略的核心指标。计算离差值的意义在于:反映该股票的发展势头。理论上,当DIF>0,则发展势头向好。

    • 离差平均值(EMA)

       今日DEA(MACD)=前一日DEA×8/10+今日DIF×2/10
      
    • MACD柱

       MACD柱值=(DIF-DEA)×2
      

      此处做差的原理与DIF相同,这里的DIF也就相当于周期为1日的DEA。因此,如果说DIF的正负是衡量发展势头是否向好,那么MACD柱则反应发展势头有多猛,数学意义相当于对DIF求导。

    • 几个参数之间的关系
      0

    对该指标的一些想法与分析

    1、移动平均线的优势

    • 参考到更多的历史数据
    • 动态赋权:近则影响大,远则影响小

    2、分析股票主要有两个角度:长期和短期。如均线只能反映股票的历史价格,但通过两条不同周期的均线比较,从而判断当前参数近期内的发展趋势。MACD柱的原理同理。

    3、为什么需要MACD指标?MACD是对股价的抽象,意在发现其涨跌周期律。那么如何来进行高层抽象呢?其主要通过平均不同周期做差这两个操作来实现。

    • 平均是将新数据与历史数据进行合并,起到过滤噪声、平缓变化的作用。由于每日收盘价太过起伏,对近期股价的判断具有较高的随机性。所以我们进行一次抽象,计算平均值,应用均线策略来帮助判断。但均线策略仍具有较高的随机性,所以对均线再做平均,即对股价的二次抽象,得到MACD指标。
    • 不同周期做差用于判断参数的发展势头。新股价的合并对不同周期参数产生不同影响,根据运算规则可知,对短期参数必然影响更大。而长期参数则可视为参考对象,其变化为必然变化,短期参数变化-必然变化=超额变化,也就是我们所说的趋势

    4、根据第三点的阐述,可知MACD的作用原理在于通过两层抽象来尝试挖掘股价的周期变化律。因此MACD的提出是基于这样一个假设的:股价存在涨跌周期律。而事实上我们也会发现:尽管每日收盘价是阴晴不定的,就算昨天涨今天也可能跌,具有跳跃性,但MACD柱都是渐变的,类似于正弦函数。理论而言,这具有合理性也我们的常识一致,因为势头由盛转衰、由衰转盛都不是突变的,但股价涨跌是突变的,致使在实际操作上存在问题。

    5、第四点提出:由于MACD成立存在假设,所以理论与实际存在偏差。具体而言,其偏差主要体现在滞后性。当一只股票上涨一段时间后开始下跌,但下跌后的股价仍高于历史平均,就会使得DIF和DEA仍在上涨,导致MACD无法捕捉到这段下跌趋势。为了补足这个缺陷,在交易时合理的买入点为DIF超过DEA时产生的金叉,但合理的卖出点应为MACD柱的最高点

    6、缺陷情况补充:先下跌在上涨,综合第五点即为两种极值情况;适用情况:先平滑再上涨。

    MACD策略回测

    常规MACD策略为在0轴上金叉买入,在0轴之下死叉卖出

    策略模板代码

    import numpy as np
    import pandas as pd
    # 导入技术分析库
    import talib as tb
    
    def initialize(context):# 初始化
        g.security = '600160.XSHG'# 股票代码,XSHG:上海证券交易所,XSHE:深圳证券交易所
    def handle_data(context, data):# 每日循环
        prices = attribute_history(g.security, 300, '1d', ['close'])
        price = np.array(prices['close'])
        cash = context.portfolio.cash# 取得当前的现金
        
        DIF, DEA, MACD = tb.MACD(
            price, 
            fastperiod=12, 
            slowperiod=26, 
            signalperiod=9)
                
        # 在0轴上金叉买入
        if DIF[-1] > 0 and DEA[-1] > 0:
            if (DIF[-2] <= DEA[-2]) and (DIF[-1] > DEA[-1]):
                order_value(g.security, cash)
        # 在0轴之下死叉卖出
        elif DIF[-1] < 0 and DEA[-1] < 0:
            if (DIF[-2] >= DEA[-2]) and (DIF[-1] < DEA[-1]):
                order_target(g.security, 0)
    

    经过上述分析,我认为将卖出点设置为MACD柱最高点更为合适,即将上面代码的卖出部分改为

    	# 在MACD最高点卖出
        if MACD[-1] < MACD[-2] * 0.95:
            order_target(g.security, 0)
    

    以下为对部分行业的股票进行回测的结果
    回测时间:2018/1/1-2020/3/1
    基准收益:-2.25%

    房地产股

    股票代码股票名称传统策略修改策略
    000002万科A8.78%3.78%
    000402金融街-23.48%5.27%
    002146荣盛发展7.57%8.64%
    600048保利地产14.02%-2.70%

    银行股

    股票代码股票名称传统策略修改策略
    601398工商银行-12.35%-6.00%
    601328交通银行-7.95%-0.37%
    601288农业银行-9.57%3.76%
    601818光大银行-12.09%-2.67%

    医药股

    股票代码股票名称传统策略修改策略
    000538云南白药-20.76%-2.45%
    600276恒瑞医药62.98%1.20%
    601607上海医药0.00%0.00%
    600056中国医药-48.37%-11.24%

    在几组简单的测试条件下,修改策略在多数情况表现优于传统策略,但似乎也失去了一次大赚的机会。总体而言,修改策略相对传统策略更为保守和稳健。当然,上述测试尚不完全,有待进一步测试完善。

    展开全文
  • Python 量化投资实战教程(2) —MACD策略(+26.9%) Python 量化投资实战教程(3) —A股回测MACD策略 Github仓库:https://github.com/Ckend/pythondict-quant 上一回,我们基于简单的MACD策略回测了华正新材这只股票的...

    量化投资系列文章:

    Backtrader 教程 — Python 量化投资实战教程(1)

    Python 量化投资实战教程(2) —MACD策略(+26.9%)

    Python 量化投资实战教程(3) —A股回测MACD策略

    Github仓库:https://github.com/Ckend/pythondict-quant


    上一回,我们基于简单的MACD策略回测了华正新材这只股票的收益率,发现效果非常好,收益达到了26.9%,但这个策略放到其他股票上会不会有这么高的收益呢?我们今天就来试试看这个策略在不考虑基本面,只考虑技术面的情况下,在A股上的平均表现。

    为了回测该策略在A股上的平均表现,我们从A股随机选取了1000只股票,使用MACD策略回测其2010年1月1日至今,使用MACD策略进行投资的表现。其中,以一万元作为本金,佣金为万分之五,每次交易100股。

    最终发现,使用该策略最终亏损的股票有626只,盈利的有372只,有2只股票数据不足被去除。最高盈利有84%,最差亏损也达-34%。盈利超过10%的股票有30只,亏损超过30%的有29只。并总结了这30只盈利超过10%的股票的特点。

    下面是用Python和backtrader分析这些股票的详细教程。在公众号后台回复:量化投资3 可获得本文全部代码及数据。本系列文章github仓库:
    https://github.com/Ckend/pythondict-quant

    1.准备

    开始之前,你要确保Python和pip已经成功安装在电脑上噢,如果没有,请访问这篇文章:超详细Python安装指南 进行安装。如果你用Python的目的是数据分析,可以直接安装Anaconda:Python数据分析与挖掘好帮手—Anaconda

    Windows环境下打开Cmd(开始—运行—CMD),苹果系统环境下请打开Terminal(command+空格输入Terminal),准备开始输入命令安装依赖。

    当然,我更推荐大家用VSCode编辑器,把本文代码Copy下来,在编辑器下方的终端运行命令安装依赖模块,多舒服的一件事啊:Python 编程的最好搭档—VSCode 详细指南。

    在终端输入以下命令安装我们所需要的依赖模块:

    pip install backtrader
    

    看到 Successfully installed xxx 则说明安装成功。

    2.改造策略

    最方便的回测股票数据的形式是将股票数据存储在MySQL数据库中,每次回测从数据库中拉取数据即可。但为了能够方便地让大家复现实验,我们将这些股票的数据以文件的形式存储下来。

    策略上,我们不需要做改变,但是需要将运行策略的这一部分封装起来,用于批量执行策略:

    def run_cerebro(stock_file, result):
        """
        运行策略
        :param stock_file: 股票数据文件位置
        :param result: 回测结果存储变量
        """
        
        cerebro = bt.Cerebro()
    
        cerebro.addstrategy(TestStrategy)
    
        # 加载数据到模型中
        data = bt.feeds.GenericCSVData(
            dataname=stock_file,
            fromdate=datetime.datetime(2010, 1, 1),
            todate=datetime.datetime(2020, 4, 25),
            dtformat='%Y%m%d',
            datetime=2,
            open=3,
            high=4,
            low=5,
            close=6,
            volume=10,
            reverse=True
        )
        cerebro.adddata(data)
    
        # 本金10000,每次交易100股
        cerebro.broker.setcash(10000)
        cerebro.addsizer(bt.sizers.FixedSize, stake=100)
    
        # 万五佣金
        cerebro.broker.setcommission(commission=0.0005)
    
        # 运行策略
        cerebro.run()
    
        # 剩余本金
        money_left = cerebro.broker.getvalue()
    
        # 获取股票名字
        stock_name = stock_file.split('\\')[-1].split('.csv')[0]
    
        # 将最终回报率以百分比的形式返回
        result[stock_name] = float(money_left - 10000) / 10000
    

    然后遍历所有股票,运行策略,结果保存在result变量中:

    files_path = 'stocks\\'
    result = []
    
    # 遍历所有股票数据
    for stock in os.listdir(files_path):
        modpath = os.path.dirname(os.path.abspath(sys.argv[0]))
        datapath = os.path.join(modpath, files_path + stock)
        print(datapath)
        try:
            run_cerebro(datapath, result)
        except Exception as e:
            print(e)
    

    最后,我们使用pickle将变量结果保存为文件,以方便后续分析:

    f = open('./batch_macd_result.txt', 'wb')
    pickle.dump(result, f)
    f.close()
    

    随后,我们就可以随意分析这个结果,而不用重新跑一遍策略了。

    3.结果分析

    接下来,使用最简单的方法分析结果:

    import pickle
    
    # 加载保存的结果
    f = open('./batch_macd_result.txt', 'rb')
    data = pickle.load(f)
    f.close()
    
    # 计算
    pos = []
    neg = []
    ten_pos = []
    ten_neg = []
    for result in data:
        res = data[result]
        if res > 0:
            pos.append(res)
        else:
            neg.append(res)
    
        if res > 0.1:
            ten_pos.append(result)
        elif res < -0.1:
            ten_neg.append(result)
    
    max_stock = max(data, key=data.get)
    
    print(f'最高收益的股票: {max_stock}, 达到 {data[max_stock]}')
    print(f'正收益数量: {len(pos)}, 负收益数量:{len(neg)}')
    print(f'+10%数量: {len(ten_pos)}, -10%数量:{len(ten_neg)}')
    print(f'收益10%以上的股票: {ten_pos}')
    

    随机抽取的1000千股票,回测结果如下:

    D:\\CODE\\stock\\backtrader>python analysis.py
    最高收益 600745.SH, 达到 0.8413365999999998
    正收益数量: 372, 负收益数量:626
    +10%数量: 30, -10%数量:29
    收益10%以上的股票: \['000403.SZ', '000858.SZ', '002271.SZ', '002311.SZ', '002475.SZ', '002555.SZ', '002568.SZ', '002605.SZ', '002714.SZ', '300007.SZ', '300136.SZ', '300220.SZ', '300347.SZ', '300476.SZ', '300482.SZ', '300566.SZ', '300601.SZ', '300613.SZ', '300630.SZ', '300725.SZ', '600570.SH', '600585.SH', '600745.SH', '601231.SH', '601799.SH', '603297.SH', '603378.SH', '603655.SH', '603737.SH', '603823.SH'\]
    

    显然,在不考虑基本面的情况下,该策略的收益并不高,因此不建议用该策略进行A股整体回测并作交易。但是我们可以观察一下收益10%以上的股票的基本面特点。

    你会发现大部分使用MACD策略收益10%以上的股票,其同比年利润增长都是大于0的,只有2只股票例外。此外,大部分股票平均年利润同比增长都在20%到30%左右,而且不会有太大的波动。

    所以,MACD策略只有在股票的基本面优秀的情况下,才能发挥最大的价值。而在股票基本面比较差的情况下,这个策略的表现非常差,因此对于投机者而言,它并不是一个好的策略,但是对于价值投资者而言,其具备一定的参考价值。

    好了,我们关于MACD策略的分析就到这里,如果大家有进一步的兴趣的话,记得关注Python实用宝典哦,我们将每周更新一期量化投资相关的推送,希望大家喜欢,本文的代码及数据,请在公众号后台回复:量化投资3 下载。

    我们的文章到此就结束啦,如果你希望我们今天的Python 实战教程,请持续关注我们,如果对你有帮助,麻烦在下面点一个赞/在看哦,有任何问题都可以在下方留言区留言,我们都会耐心解答的!


    Python实用宝典
    不只是一个宝典
    欢迎关注公众号:Python实用宝典

    原文来自Python实用宝典:Python 量化投资实战教程(3) —A股回测MACD策略

    Python实用宝典

    展开全文
  • 上一回,我们基于简单的MACD策略回测了华正新材这只股票的收益率,发现效果非常好,收益达到了26.9%,但这个策略放到其他股票上会不会有这么高的收益呢?我们今天就来试试看这个策略在不考虑基本面,只考虑技术面的...

    上一回,我们基于简单的MACD策略回测了华正新材这只股票的收益率,发现效果非常好,收益达到了26.9%,但这个策略放到其他股票上会不会有这么高的收益呢?我们今天就来试试看这个策略在不考虑基本面,只考虑技术面的情况下,在A股上的平均表现。

    为了回测该策略在A股上的平均表现,我们从A股随机选取了1000只股票,使用MACD策略回测其2010年1月1日至今,使用MACD策略进行投资的表现。其中,以一万元作为本金,佣金为万分之五,每次交易100股。

    最终发现,使用该策略最终亏损的股票有626只,盈利的有372只,有2只股票数据不足被去除。最高盈利有84%,最差亏损也达-34%。盈利超过10%的股票有30只,亏损超过30%的有29只。并总结了这30只盈利超过10%的股票的特点。

    下面是用Python和backtrader分析这些股票的详细教程。在公众号后台回复:量化投资3 可获得本文全部代码及数据。本系列文章github仓库:https://github.com/Ckend/pythondict-quant

    1.准备

    开始之前,你要确保Python和pip已经成功安装在电脑上噢,如果没有,请访问这篇文章:超详细Python安装指南 进行安装。如果你用Python的目的是数据分析,可以直接安装Anaconda:Python数据分析与挖掘好帮手—Anaconda

    Windows环境下打开Cmd(开始—运行—CMD),苹果系统环境下请打开Terminal(command+空格输入Terminal),准备开始输入命令安装依赖。

    当然,我更推荐大家用VSCode编辑器,把本文代码Copy下来,在编辑器下方的终端运行命令安装依赖模块,多舒服的一件事啊:Python 编程的最好搭档—VSCode 详细指南。

    在终端输入以下命令安装我们所需要的依赖模块:

     

    pip install backtrader

    看到 Successfully installed xxx 则说明安装成功。

    2.改造策略

    最方便的回测股票数据的形式是将股票数据存储在MySQL数据库中,每次回测从数据库中拉取数据即可。但为了能够方便地让大家复现实验,我们将这些股票的数据以文件的形式存储下来。

    策略上,我们不需要做改变,但是需要将运行策略的这一部分封装起来,用于批量执行策略:

     

    def run_cerebro(stock_file, result):
        """
        运行策略
        :param stock_file: 股票数据文件位置
        :param result: 回测结果存储变量
        """
     
        cerebro = bt.Cerebro()
        cerebro.addstrategy(TestStrategy)
        # 加载数据到模型中
        data = bt.feeds.GenericCSVData(
            dataname=stock_file,
            fromdate=datetime.datetime(2010, 1, 1),
            todate=datetime.datetime(2020, 4, 25),
            dtformat='%Y%m%d',
            datetime=2,
            open=3,
            high=4,
            low=5,
            close=6,
            volume=10,
            reverse=True
        )
        cerebro.adddata(data)
        # 本金10000,每次交易100股
        cerebro.broker.setcash(10000)
        cerebro.addsizer(bt.sizers.FixedSize, stake=100)
        # 万五佣金
        cerebro.broker.setcommission(commission=0.0005)
        # 运行策略
        cerebro.run()
        # 剩余本金
        money_left = cerebro.broker.getvalue()
        # 获取股票名字
        stock_name = stock_file.split('\\')[-1].split('.csv')[0]
        # 将最终回报率以百分比的形式返回
        result[stock_name] = float(money_left - 10000) / 10000

    然后遍历所有股票,运行策略,结果保存在result变量中:

     

    files_path = 'stocks\\'
    result = []
    # 遍历所有股票数据
    for stock in os.listdir(files_path):
        modpath = os.path.dirname(os.path.abspath(sys.argv[0]))
        datapath = os.path.join(modpath, files_path + stock)
        print(datapath)
        try:
            run_cerebro(datapath, result)
        except Exception as e:
            print(e)

    最后,我们使用pickle将变量结果保存为文件,以方便后续分析:

     

    f = open('./batch_macd_result.txt', 'wb')
    pickle.dump(result, f)
    f.close()

    随后,我们就可以随意分析这个结果,而不用重新跑一遍策略了。

    3.结果分析

    接下来,使用最简单的方法分析结果:

     

    import pickle
    # 加载保存的结果
    f = open('./batch_macd_result.txt', 'rb')
    data = pickle.load(f)
    f.close()
    # 计算
    pos = []
    neg = []
    ten_pos = []
    ten_neg = []
    for result in data:
        res = data[result]
        if res > 0:
            pos.append(res)
        else:
            neg.append(res)
        if res > 0.1:
            ten_pos.append(result)
        elif res < -0.1:
            ten_neg.append(result)
    max_stock = max(data, key=data.get)
    print(f'最高收益的股票: {max_stock}, 达到 {data[max_stock]}')
    print(f'正收益数量: {len(pos)}, 负收益数量:{len(neg)}')
    print(f'+10%数量: {len(ten_pos)}, -10%数量:{len(ten_neg)}')
    print(f'收益10%以上的股票: {ten_pos}')

    随机抽取的1000千股票,回测结果如下:

     

    D:\CODE\stock\backtrader&gt;python analysis.py
    最高收益 600745.SH, 达到 0.8413365999999998
    正收益数量: 372, 负收益数量:626
    +10%数量: 30, -10%数量:29
    收益10%以上的股票: ['000403.SZ', '000858.SZ', '002271.SZ', '002311.SZ', '002475.SZ', '002555.SZ', '002568.SZ', '002605.SZ', '002714.SZ', '300007.SZ', '300136.SZ', '300220.SZ', '300347.SZ', '300476.SZ', '300482.SZ', '300566.SZ', '300601.SZ', '300613.SZ', '300630.SZ', '300725.SZ', '600570.SH', '600585.SH', '600745.SH', '601231.SH', '601799.SH', '603297.SH', '603378.SH', '603655.SH', '603737.SH', '603823.SH']

    显然,在不考虑基本面的情况下,该策略的收益并不高,因此不建议用该策略进行A股整体回测并作交易。但是我们可以观察一下收益10%以上的股票的基本面特点。

    你会发现大部分使用MACD策略收益10%以上的股票,其同比年利润增长都是大于0的,只有2只股票例外。此外,大部分股票平均年利润同比增长都在20%到30%左右,而且不会有太大的波动。

    所以,MACD策略只有在股票的基本面优秀的情况下,才能发挥最大的价值。而在股票基本面比较差的情况下,这个策略的表现非常差,因此对于投机者而言,它并不是一个好的策略,但是对于价值投资者而言,其具备一定的参考价值。

    好了,我们关于MACD策略的分析就到这里,如果大家有进一步的兴趣的话,记得关注Python实用宝典哦,我们将每周更新一期量化投资相关的推送,希望大家喜欢,本文的代码及数据,请在公众号后台回复:量化投资3 下载。

    我们的文章到此就结束啦,如果你喜欢今天的 Python 教程,请持续关注Python实用宝典。

    有任何问题,可以在公众号后台回复:加群,回答相应验证信息,进入互助群询问。

    原创不易,希望你能在下面点个赞和在看支持我继续创作,谢谢!

    展开全文
  • 这一次,让我们把策略变得复杂一点,使用MACD策略的信号线交叉交易法: 本系列教程源代码Github仓库:https://github.com/Ckend/pythondict-quant 1.原理 为了解释MACD的原理,我们需要先了解指数移动平均线(下...
  • Python 量化投资实战教程(2) —MACD策略(+26.9%) Python 量化投资实战教程(3) —A股回测MACD策略 Github仓库:https://github.com/Ckend/pythondict-quant 上次,我们简单地用Python 和 backtrader 使用最简单的...
  • function MACD(freq,shareNum)%%买卖原则为:%dif-dea均为正,且dif上扬,买入信号参考。%dif-dea均为负,且dif下跌,卖出信号参考。targetList = traderGetTargetList();%获取目标资产信息HandleList = ...
  • MACD多品种止盈止损策略.py
  • 在这一节,我们引入库import talib,因为这个库里有很多的技术指标,可以直接引用,不用自己再编指标函数,非常的方便,只要一个语句macd, macdsignal, macdhist = talib.MACD(ma, fastperiod=12, slowperiod=26, ...
  • python实现MACD均线择时策略

    千次阅读 多人点赞 2020-11-01 20:48:33
    今天我们将以MACD为例,探究如何利用技术指标进行策略的构建与实现。 > MACD的组成 MACD(Moving Average Convergence and Divergence)即指数平滑移动平均线,由Geral Appel 于1970年提出,属于大势趋势类指标,...
  • 经典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线的策略。目前也就觉得macd线简单好用。先放一个简单的策略——移动均线策略。这个策略是由下向上超过均线就买入,相反就...
  • MACD策略深测

    2020-04-14 22:39:15
    此次测试主要有两个角度:①MACD策略有效性随大盘波动影响的测试;②参数设置对MACD策略的影响测试。 这是2014年以来A股指数的周线图,可以看到在红框部分起伏非常大,设置为大盘波动期的参考对象(2014/8/1-2016/2...
  • 上次,我们简单地用backtrader和最简单的买入卖出策略进行了一次量化投资分析:这一次,让我们把策略变得复杂一点,使用MACD策略的信号线交叉交易法: 本系列教程源代码Github仓库:...我们需要先了解指数移动平均线(下...
  • MACD择时策略

    2021-09-15 23:45:08
    一、MACD择时策略: 1.买入规则:DIF上穿DEA,买入股票 2.卖出规则:DIF下穿DEA,卖出股票 3.止损价:max(移动止损,固定止损) 移动止损:ma - std 固定止损:开仓价 - 开仓的std ''' import tushare as ts ...
  • MACD指标策略

    2021-04-12 09:45:56
    # 初始化此策略 # 设置我们要操作的股票池, 这里我们只操作一支股票 g.security = '600570.SS' set_universe(g.security) def handle_data(context, data): security = g.security # 得到五日均线价格 ...
  • MACD称为异同移动平均线,是从双指数移动平均线发展而来的,由快的指数移动平均线(EMA12)减去慢的指数移动平均线(EMA26)得到快线DIF,再用2×(快线DIF-DIF的9日加权移动均线DEA)得到MACD柱。MACD的意义和双...
  • matlab macd投资策略MACD称为指数平滑移动平均线,是从双指数移动平均线发展而来的,由快的指数移动平均线(EMA12)减去慢的指数移动平均线(EMA26)得到快线DIF,再用2×(快线DIF-DIF的9日加权移动均线DEA)得到...
  • 商品期货Python版MACD策略(教学)商品期货Python版MACD策略(教学)Author: 小小梦, Date: 2020-06-30 14:02:19Tags: Python MACD商品期货Python版MACD策略(教学)策略仅作教学使用。如有问题欢迎留言。商品期货...
  • 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 ...
  • MACD指标定义 MACD称为异同移动平均线,是从双指数移动平均线发展而来的,由快的指数移动平均线(EMA12)减去慢的指数移动平均线(EMA26)得到快线DIF,再用2×(快线DIF-DIF的9日加权移动均线DEA)得到MACD柱。MACD...
  • MACD均线择时策略是十分基础的策略,适合咱们这种新手学习,这篇博客就分享一下基于聚宽实现MACD均线择时策略。 代码: 注:需要到聚宽的量化平台去运行。 # MACD均线择时策略 ''' 筛选出符合: 10<市盈率...
  • 量化交易-MACD策略学习

    千次阅读 2018-11-04 15:45:25
    MACD的基本概念,可以参考 https://www.joinquant.com/post/7095?f=18newyearjx ,感谢 Quant中找米吃的阿鼠 和 聚宽小秘书 Thanks♪(・ω・)ノ 我认为MACD不适合采用轮动策略,经过回测,我将策略改成以下模式:
  • 1.平滑异同移动平均线定义 平滑异同移动平均线...Signal(DEM或DEA或MACD) (红线): 计算macd9天均值,公式:Signal(DEM或DEA或MACD):EMA(MACD,9) Histogram (柱): 计算macd与signal的差值,公式:Histogram:MACD-S
  • 在开始我在Python 库中使用MACD指标stockstats.我想知道,如果我有一个特定股票的100个OHLC条目,我怎样才能使用MACD输出来产生信号,无论我应该买入还是卖出或持有?在图表中,可以想象,但在编程方面我如何得到这个想法...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 2,637
精华内容 1,054
关键字:

macd策略