sponsored links

量化程式設計師小夥告訴你:均線策略真的有用嗎?

先說說常見的均線指標:ma5和ma10,學名是五日價格移動平均線和十日價格移動平均線,簡稱5日線和10日線。大部分人對這兩個均線很熟,但是它們的實際作用,眾說紛紜,褒貶各異。具體怎麼樣,我利用backtrader進行驗證。

backtrader是python開發的一個回測框架,簡單易用,是國外一個牛人開發的,文件也是英文的,本次做一個簡單的量化策略回測。

先來看看這個簡單的量化策略:

ma5上穿ma10買入,ma10下穿ma5賣出。

做出這個策略的買入賣出理由很簡單:5日線上穿10日線,股價處於強勢;10日線下穿5日線,股價處於弱勢。明白這個後,接下來就是編寫程式碼了。

第一步,安裝backtrader。

pip install backtrader

第二步,準備資料。

我已經利用之前的開原始碼提前下載了資料,以股票程式碼為名的csv檔案。

量化程式設計師小夥告訴你:均線策略真的有用嗎?


後復權的資料

每個csv檔案包含日期,開盤價,收盤價,最高價,最低價,成交量。

第三步,編寫程式碼。

首先編寫自己的策略類,引入backtrader,繼承裡面的策略類。這個地方我給自己的策略命名為MyStrategy,並且定義兩個變數分別代表需要的均線,比如5日均線和10日均線。

import backtrader as bt

class MyStrategy(bt.Strategy):
    # 均線引數,5日和10日
    params = (
        ('ma_1', 5),
        ('ma_2', 10),
    )

    def stop(self):
        print("結束了")

backtrader自帶了指標計算的公式,因此我們只需要呼叫即可,根據策略,我們應該要計算5日均線和10日均線,繼續在策略類裡面編寫,程式碼實現起來很簡單。backtrader真的很優秀。

    def __init__(self):
        self.dataclose = self.datas[0].close

        self.order = None
        self.buyprice = None
        self.buycomm = None

        # 五日移動平均線
        self.sma5 = bt.indicators.SimpleMovingAverage(period=self.params.ma_1)
        # 十日移動平均線
        self.sma10 = bt.indicators.SimpleMovingAverage(period=self.params.ma_2)

接下來實現買入賣出。按照策略,翻譯成通俗語言是:一,如果沒有倉位,當天ma5大於ma10,並且前一天ma5小於ma10買入;二,如果當前持倉,那麼當ma10大於ma5時就賣出。

backtrader給我們提供了對應的介面方法(notify_order、notify_trade、next),我們只需要編寫成這個策略的程式碼即可。明白這個後,程式碼應該這樣編寫:



    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))

                self.buyprice = order.executed.price
                self.buycomm = order.executed.comm
            else:  # 賣出
                self.log('執行賣出, 賣出價格: %.2f, 花費資金: %.2f, 手續費: %.2f' %
                         (order.executed.price,
                          order.executed.value,
                          order.executed.comm))

            self.bar_executed = len(self)

        # 訂單因為缺少資金之類的原因被拒絕執行
        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))

    def next(self):
        # self.log('收盤, %.2f' % self.dataclose[0])

        # 檢查是否正在準備下單,如果是則直接返回
        if self.order:
            return

        # 檢查是否持倉
        if not self.position:
            # 沒有倉位,執行買入條件判斷:
            if self.sma5[0] > self.sma10[0] and self.sma5[-1] < self.sma10[-1]:
                self.log('買入, %.2f' % self.dataclose[0])
                self.log('當前ma5:%.2f, 當前ma10: %.2f, 前一日ma5:%.2f, 前一日ma10: %.2f' %
                         (self.sma5[0], self.sma10[0], self.sma5[-1], self.sma10[-1]))
                # 買入
                self.order = self.buy()

        else:
            # 執行條件賣出
            if self.sma5[0] < self.sma10[0]:
                self.log('賣出, %.2f' % self.dataclose[0])

                # 賣出
                self.order = self.sell()

上面的程式碼裡面都有註釋,閱讀起來應該沒有難度。順便說一下,如果你們也編寫程式碼,最好也多寫點註釋,方便自己後面閱讀。有的人可能不信邪,半個月或者半年後,這個程式碼也許就沒人看得懂了[淚奔]。相信黃sir,保持這個習慣,你會收穫更多的尊重和成就。

策略類已經編寫完了,下一步是把csv的檔案資料載入進去執行。backtrader提供了很多載入的介面,非常方便,這裡我用的是載入pandas資料介面。當然也可以直接傳檔案路徑進去,因為我的csv檔案裡面有很多其他的資料,因此讀取後進行修改只加載基礎的資料即可。

    import pandas as pd

    df = pd.read_csv("000001.csv")
    new_df = df[["日期", "開盤", "收盤", "最高", "最低", "成交量"]]
    new_df.columns = ["trade_date", "open", "close", "high", "low", "volume"]
    new_df["trade_date"] = pd.to_datetime(new_df["trade_date"])
    new_df.set_index("trade_date", inplace=True)
    new_df['openinterest'] = 0

    cerebro = bt.Cerebro()
    # 載入我們的策略
    cerebro.addstrategy(MyStrategy)

    # 從2010-01-01到2021-12-17的資料進行回測
    data = bt.feeds.PandasData(
        dataname=new_df,
        fromdate=datetime.datetime(2010, 1, 1),
        todate=datetime.datetime(2021, 12, 17)
    )

    cerebro.adddata(data)

接下來設定初始金額和手續費。

    # 初始資金
    init_amount = 300000.0
    cerebro.broker.setcash(init_amount)

    # 設定每筆交易交易的股票數量
    cerebro.addsizer(bt.sizers.FixedSize, stake=100)

    # 手續費
    cerebro.broker.setcommission(commission=0.0)

最後,執行策略。

    # 執行策略
    cerebro.run()

    # 結果
    result_amount = cerebro.broker.getvalue()
    print('初始資金: %.2f' % init_amount)
    print('期末資金: %.2f' % result_amount)
    print('盈利: %.2f' % (float(result_amount) - init_amount))

一切順利,結果如下:

量化程式設計師小夥告訴你:均線策略真的有用嗎?

可以看到,對於000001,0手續費的情況下11年時間虧損了1176元。

當然,一個股票說明不了什麼,換成茅臺(600519)試試。

量化程式設計師小夥告訴你:均線策略真的有用嗎?


茅臺回測結果

總算看到好的結果了,盈利了。如果改動一下指標,比如5日均線換成3日均線,10日均線換成12日均線,結果如何呢?

量化程式設計師小夥告訴你:均線策略真的有用嗎?


3日均線和12日均線000001回測結果

量化程式設計師小夥告訴你:均線策略真的有用嗎?


3日均線和12日均線600519回測結果

可以看到,虧損減少了,盈利增加了。說明啥?常用的指標賺錢越來越難!通俗點講:大家都知道的,就是很難賺錢。和股票總數朝市場最小阻力方向執行異曲同工。

當然可以對全市場的股票進行回測,我們把相關程式碼封裝成一個函式,每次把股票程式碼傳進去,然後把結果存起來,感興趣的朋友可以先自己試試,如果你們想看結果,可以評論留言,想看的人多,下期我再發出來。

另外,黃sir拉了一個群,如果對量化投資感興趣可以私信我。備註,黃sir很帥,[做鬼臉]

好了,本期的測試就完成了,如果希望看到更多關於量化方面的內容,記得加一個關注,以免迷路。

分類: 數碼
時間: 2021-12-19

相關文章

無線自由、切換隨心、卓越效能,A4Tech雙飛燕無線鍵鼠套裝體驗

無線自由、切換隨心、卓越效能,A4Tech雙飛燕無線鍵鼠套裝體驗
鍵鼠裝置作為桌上型電腦.筆記本等的外設和補充,向來都是很多攢機者重視的一部分.尤其是在現在,移動辦公固然已經非常普遍,但是如果是進行交流溝通或者辦公輸入,有鍵鼠套裝的配備效率的提升不是一點半點. 也正 ...

石景山全面進入清盤期!長安雲尚僅剩10餘套房,手慢無

石景山全面進入清盤期!長安雲尚僅剩10餘套房,手慢無
9月10日,幸福裡獲悉,中海首鋼·長安雲尚僅剩十餘套下躍戶型在售,專案即將清盤. 從供應爆發到供應斷檔,石景山古城僅用了一年半,累計銷售超過3000套房.截至目前,古城板塊5個樓盤,只有最晚入市的中海 ...

為什麼手遊首充都是6元?

為什麼手遊首充都是6元?
氪金,來源於日語中的"課金"一詞,指使用真實貨幣在遊戲中購買道具或資源的行為. 氪金行為在一般情況下可以增加玩家的遊戲體驗,而一般此類遊戲都具有免費.手機端等特性,這也是手遊廠商盈 ...

國家對檳榔“下狠手”!一包賣到100元的檳榔,對國人危害多大?

國家對檳榔“下狠手”!一包賣到100元的檳榔,對國人危害多大?
"國家廣播電視總局"釋出重磅訊息!停止利用廣播電視和網路視聽節目宣傳推銷檳榔及其製品,這意味著是對"檳榔"的一次全面普查,這可以說是一個"雙面性&qu ...

微信最新提現券來了,限時免費,手慢無

微信最新提現券來了,限時免費,手慢無
文|電腦手機那些事兒 如今的微信活躍使用者已經超過了12億,越來越多的人都在使用微信,無論是聊天還是轉賬都很方便.隨著使用微信時間慢慢變長,我們微信錢包中的零錢也會慢慢變多,所以大多數人都會選擇將這些 ...

京東商城plus會員149元/年值不值得買?

京東商城plus會員149元/年值不值得買?
大家好,我是小周,有好物就離不開我的推薦! 說到京東商城plus會員,肯定是值得買呀. 尤其是10月8日plus主打時尚居家會員專享優惠,更有PLUS會員滿300減80折扣. 那就更加不容錯過了.為什 ...

海淀樹村新盤!圓明天頌預計10月開盤,共200餘套房源,手慢無

海淀樹村新盤!圓明天頌預計10月開盤,共200餘套房源,手慢無
9月2日,幸福裡獲悉,圓明天頌預計10月開盤,目前仍在蓄客中. 幸福裡點評: 圓明天頌置業顧問向幸福裡透露,預計10月開盤,樣板間仍在建設中,大機率也得趕在10月份. 專案總共200來套,主力戶型有四 ...

又一崗位出現人才“缺口”,平均月薪9660元還招不到人?為什麼?

又一崗位出現人才“缺口”,平均月薪9660元還招不到人?為什麼?
大家有沒有聽說過,做家政還有個本科專業?如今已經邁入了2021年的9月,又是一年的高校開學季,而在浙江省樹人大學,有一個新開設的專業,吸引了不少人的注意,那就是家政學本科專業. 在絕大多數人的印象中, ...

以“父”之名的奕炫MAX上市:能跑能裝,關鍵還省油

以“父”之名的奕炫MAX上市:能跑能裝,關鍵還省油
從小喜歡聽周杰倫的歌,其中的以父之名是自己感覺最好聽的一首,雖然對歌詞大意不是特別懂,但淺層次對父親這個角色的愛是表露無疑的,現如今自己也成為了一名父親,也深切體會到肩上的責任之重,在很多事情的考慮上 ...

中秋節怎少得了美酒助興,長安誰家無春酒,節日前還會有專屬福利

中秋節怎少得了美酒助興,長安誰家無春酒,節日前還會有專屬福利
在中華文化史甚至是世界文化史之中,就佔據著一個非常重要的角色.中秋佳節,親友團聚,置辦一桌酒席,備上幾壺美酒,賞月飲酒酬唱,良多趣味. 韓愈在<中秋夜贈張功曹>中吟道:一年月明今宵多--有 ...

終於集齊了12個水果塑膠筐,動動手自己diy個床鋪,可收納還環保

終於集齊了12個水果塑膠筐,動動手自己diy個床鋪,可收納還環保
榻榻米設計深深受大家的青睞,但大量使用木材的緣故,大家會害怕有甲醛等汙染物,這不聰明人還是很多的,這位達人利用12個廢舊籃筐diy了可收納.可睡覺的床鋪,媲美榻榻米,不花錢還環保~ 相比一般的榻榻米床 ...

魅族轉型蘋果配件廠?新機發佈會推出蘋果手機殼,售價89元

魅族轉型蘋果配件廠?新機發佈會推出蘋果手機殼,售價89元
昨天,魅族舉行了新品釋出會,除了正式推出了魅族18X.魅族18s系列等新機之外,還發布了iPhone 13,13 Pro,Pro Max的手機殼,售價均為89元.採用了熊貓元素設計,還經過了IML新工 ...

39元起 7款提升幸福感桌面好物推薦

39元起 7款提升幸福感桌面好物推薦
要知道,一套簡潔易用的桌面辦公物品不僅可以提升工作效率,還能讓你保持良好的心情,而這對於工作來說也是非常重要的.今天,我就把我自己和同事桌面上特別值得推薦的物品推薦給大家,看看有沒有大家需要的. 小米 ...

百元級數碼好物推薦!第二期

百元級數碼好物推薦!第二期
上次我們帶來了開學季的百元級數碼好物推薦,由於篇幅的限制有還會有一產品並未能割刀推薦,此次我們推出百元級數碼好物推薦第二期,希望能為大家的購買帶來幫助. 好物1:羅技G102二代遊戲滑鼠 羅技G102 ...

正倉院再考:唐人“臥讀”,不勞於手?

正倉院再考:唐人“臥讀”,不勞於手?
揚之水 一年一度的"正倉院展"10月30日將在日本奈良國立博物館展出,第73回展覽共有55件寶物,其中8件為首展,重點展品包括樂器.筆墨紙硯.經卷.染織品.文書.佛具等. 學者揚之 ...

立面軟裝知識庫——牆面材料大盤點

立面軟裝知識庫——牆面材料大盤點
老菜入行裝飾材料也有十幾年了算是經驗豐富的老鳥了,只是這麼多年的工作下來感觸最深的是市場的變化真的太快,材料日新月異的更替,各種產品的特性還都不一樣.今天就跟大家盤點下常用的牆面裝飾方式,來給夥伴們做 ...

綠聯小海豚TWS耳機:小巧舒適,百元價效比好耳機

綠聯小海豚TWS耳機:小巧舒適,百元價效比好耳機
相比有線耳機,無線耳機沒有了線材的束縛,攜帶更加方便,經過多年的技術積累,無線耳機在音質上有了長足進步,目前市面上的無線耳機琳琅滿目,在激烈的競爭下價格越來越親民,今天三爺為大家分享一款近期推出的價效 ...

家裝行業格局風雲變幻,安樂窩整裝脫穎而出
2020年上半年的疫情對整個家裝行業造成了不可忽視的影響,挑戰帶來的是機遇與變革:行業格局洗牌,過時的商業模式遭到淘汰,新的模式受到追捧,家裝企業不再因循守舊,開始擁抱技術與創新.隨著疫情的緩和,家裝 ...

200+買個手機殼值得嗎?好看防摔耐用的決色iPhone 13手機殼體驗

200+買個手機殼值得嗎?好看防摔耐用的決色iPhone 13手機殼體驗
安卓手機這兩年的進步挺不錯的,但不可否認是,隨著時間的推移,相比蘋果系,同期上市的手機流暢度方面的差距會越來越明顯.比如樓主手上18年上市的iPhone XR和三星Note 9,三星Note 9打開個 ...

花費不到9萬元!我自己裝完140㎡的房子,老公:幸好沒請裝修公司

花費不到9萬元!我自己裝完140㎡的房子,老公:幸好沒請裝修公司
前不久我寫的裝修公司和游擊隊選擇哪一個更好,引起了廣泛的探討,大部分人覺得裝修游擊隊更加省錢,於是選擇游擊隊.其實除了裝修公司和游擊隊還有一個選擇,那就是自己裝修. 前不久我家剛買一套140㎡的房子, ...