iT邦幫忙

2021 iThome 鐵人賽

DAY 25
0
永豐金融APIs

永豐金融APIs - 從零開始到放棄!?系列 第 25

策略實作 - 葛蘭碧八法

  • 分享至 

  • xImage
  •  

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

今天就大致介紹一下一個簡單的交易策略,因為只有使用移動平均線,所以使用起來相對簡單,但是因為參數簡單,所以很難判斷遇到的狀況到底是不是合用,賠錢的機會也是蠻高的。不過有這個簡單的策略來熱身,之後可以找一些相對報酬率高的策略來使用


上一篇
Backtrader - sizer
下一篇
資料儲存 - SqlAlchemy
系列文
永豐金融APIs - 從零開始到放棄!?30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言