策略实作 - 葛兰碧八法

MoneyDJ理财网 - 葛兰碧八大法则

葛兰碧八法是根据移动平均线和股价之间的关系,来判断买入,卖出

葛兰碧八法并没有明确指明要用哪个指标当移动平均线,短期价位,
长期价位,以下的设定是我自己设的,大家可以视自己的需求去修改,主要精神还是那八点
,突破,支撑,假跌破,反弹,跌破,阻力,假突破,反转

  • 移动平均线:半年线(120天)
  • 短期价位:5日线
  • 长期价位:月线 (20日线)

买入

  1. 突破:半年线从下降转为水平或上升,短期价位突破长期价位上升
  2. 支撑:短期价位在长期价位上,有下跌但未跌破半年线
  3. 假跌破:短期价位跌破半年线,随即回升至半年线上
  4. 反弹:价位向下急跌,跌破半年线且远离,开始反弹上升又趋向半年线

卖出

  1. 跌破:半年线从上升转为水平或下跌,短期价位跌破长期价位
  2. 阻力:短期价位在半年线下,价位上升未能穿破半年线,再度反转向下
  3. 假突破:短期价位突破长期价位,又跌回长期价位下,半年线仍呈现下跌
  4. 反转:短期价位向上急涨,穿破半年线且远离,反转向下趋向半年线

优点

简单好用

缺点

讯号落後,急涨急跌不容易获利,盘整多空双巴

建议事项

  • 买点4, 卖点8,逆势操作,不建议使用
  • 买点2, 卖点6,不易判断,操作要小心
import backtrader as bt
import backtrader.Indicaters as btind

class RuleOfEight(bt.Strategy):
    params = (
        ('defaultSize', 1000),
        ('printLog', False),
    )

    def log(self, txt, dt = None, doPrint = False):
        if self.p.printLog or doPrint:
            dt = dt or self.data.datetime.date(0)
            print("%s %s" % (dt.isoformat(), txt))

    def __init__(self):
        self.sizer.setsizing(self.p.defaultSize)

        self.sma_half = btind.SimpleMovingAverage(self.data, period = 120)
        self.sma_long = btind.SimpleMovingAverage(self.data, period = 20)
        self.sma_short = btind.SimpleMovingAverage(self.data, period = 5)

        self.order = None

   
    def notify_order(self, order):
        if order.status in [order.Submitted, order.Accepted]:
            return

        if order.status in [order.Completed]:
            if order.isbuy():
                self.log("买入 价格: %.2f 成本: %.2f 手续费: %.2f" % (order.executed.price, order.executed.value, order.executed.comm))
            elif order.issell():
                self.log("卖出 价格: %.2f 成本: %.2f 手续费: %.2f" % (order.executed.price, order.executed.value, order.executed.comm))
        
        elif order.status in [order.Canceled, order.Margin, order.Rejected]:
            self.log("交易取消/余额不足/拒绝交易")
            

        self.order = None


    def notify_trade(self, trade):
        if not trade.isclosed:
            return
            
        self.log("交易收益: 毛利 %.2f 净利: %.2f" % (trade.pnl, trade.pnlcomm), doPrint = True)
    
    
    def next(self):
        if self.order:
            return

        
        # 半年线趋势向上 (5日内的半年线比较)
        halfUp = self.sma_half[-5] < self.sma_half[0]

        # 突破
        breakThrough = (self.sma_short[-1] < self.sma_long[-1]) and (self.sma_short[0] > self.sma_long[0])


        if not self.position:
            
            if halfUp and breakThrough:
                self.order = self.buy()

                if self.order is not None:
                    self.log("买入: %.2f 股数: %d" % (self.dataclose[0], self.order.size), doPrint = True)

        else:

            if not breakThrough and not halfUp:
                self.order = self.sell()

                if self.order is not None:
                    self.log("卖出: %.2f 股数: %d" % (self.dataclose[0], self.order.size), doPrint = True)
                    
    def stop(self):
        self.log("结束收益 %.2f" % self.broker.getvalue(), doPrint = True)

  • 永丰金证券(2890) 2018-01-01 ~ 2020-12-31
    可以看到在中间有一段急跌,这个策略就没有办法反应过来
    永丰金证券 2018-2020

  • 永丰金证券(2890) 2019-01-01 ~ 2021-10-10
    这种比较平稳的就很合适,不过 2021 台股大涨,基本上要获利应该很简单
    永丰金证券 2019-2021

今天就大致介绍一下一个简单的交易策略,因为只有使用移动平均线,所以使用起来相对简单,但是因为参数简单,所以很难判断遇到的状况到底是不是合用,赔钱的机会也是蛮高的。不过有这个简单的策略来热身,之後可以找一些相对报酬率高的策略来使用


<<:  Day 25 Redux 介绍

>>:  Day27:危机意识

Day 30: 给之後的时间

Hi all 谢谢KK那边认识到大家,可以一起组读书会、一起参加铁人赛. 铁人赛很烦,因为我去年第一...

第一次接触 Laravel

composer 安装法 composer global require laravel/insta...

Maven简介

Maven简介 Day08_Maven简介 ...

[进阶指南] 传送 Ref ( Day24)

传送 ref 是一种自动把 ref 从一个 component 传递到它底下的其中一个 child...

Innodb资料页结构-Part1(使用者纪录、空闲空间、页面中最小与最大的纪录)

前文提到页是Innodb的基本存取单位,一般为16kb,Innodb为了实现功能其实设计了许多不同类...