【量化交易】 策略基本框架 【002】

每天也要學習啊~

本文是量化交易零基礎入門教程中的一篇,點擊藍字鏈接可查看該系列詳情。


摘要

  • 策略編寫的基本框架及其實現
  • 回測的含義及其實現
  • 初步學習解決代碼錯誤
  • 週期循環的開始時間
  • 自測與自學

  • 通過前文對量化交易有了一個基本認識之後,我們開始學習量化交易。畢竟就像學游泳,有些東西講是講不懂,做過就會懂。

  • 由於本教程是基於聚寬量化交易平臺(www.joinquant.com),所以爲了後續的學習,最好去註冊一個聚寬量化交易平臺的賬號。

從一個非常簡單的交易策略開始

  • 先看一個非常簡單的交易策略:

      每天買100股的平安銀行。
    
  • 爲了讓這個策略能讓計算機執行,首先,要使策略符合 “初始化 + 週期循環” 框架,像這樣:

      初始化:選定要交易的股票爲平安銀行
      每天循環:買100股的平安銀行
    

什麼是 “初始化 + 週期循環” 框架?

  • 爲了將投資靈感高效地轉化成計算機可執行的量化策略,必須基於一種模式來寫,框架就是指這種模式。而此框架包含兩個部分即初始化與週期循環:

  • 初始化即指策略最開始運行前要做的事。比如,準備好要交易的股票。

  • 週期循環即指策略開始後,隨着時間一週期一週期地流逝時,每個週期要做的事。如例中,週期爲天,週期循環的則是每天買 100 股的平安銀行。

  • 能幫助你理解這一框架的是,其實人本身日常做交易就是符合 “初始化 + 週期循環” 框架的,初始化就是已存在人腦的交易思想與知識,週期循環就是每天或每分鐘地查看行情、判斷、下單等行爲。

如何把策略變成計算機可執行的程序?

  • 通過編程將策略寫成計算機可識別的代碼,具體說,我們這裏是用 python 這門編程語言。

  • 另外可以用聚寬的嚮導式策略生成器,這種方法是不需編程的,但靈活性上難免是遠不如寫代碼的。

那麼如何將策略寫成代碼?

  • 這並非三言兩語就能說清,尤其是對於沒有編程基礎的人。所以我們將通過後續的內容逐步地介紹。首先我們將學習 “初始化 + 週期循環” 框架代碼的寫法。

  • 寫法一

      def initialize(context):
          這裏是用來寫初始化代碼的地方,例子中就是選定要交易的股票爲平安銀行
    
      def handle_data(context,data):
          這裏是用來寫週期循環代碼的地方,例子中就是買100股的平安銀行
    
  • 寫法二

      def initialize(context):
          run_daily(period,time='every_bar')
          這裏是用來寫初始化代碼的地方,例子中就是選定要交易的股票爲平安銀行
    
      def period(context):
          這裏是用來寫週期循環代碼的地方,例子中就是買100股的平安銀行
    
  • 代碼應該往哪裏寫?

    • 來到聚寬網站後,通過導航欄 - 我的策略 - 我的策略進入策略列表,點擊新建策略 -
      1.jpg

    • 進入策略編輯頁,左側就是策略代碼編輯區域,初始會默認給你提供代碼模板,全刪除後寫入我們的代碼就好了。
      1.jpg

  • 兩種寫法用哪個好?

    • 寫法一是從前的老寫法,將逐步棄用,寫法二是聚寬系統改進後的新寫法,推薦使用寫法二

    • def、context 等都是什麼意思?

    • 其實是在調用聚寬提供好的函數,展開講很複雜,不理解的話先記住,後面的學習內容會讓你理解。

框架寫成代碼了,那例子的完整的代碼該怎麼寫呢?

  • 剩下的兩行代碼這麼寫。完全理解需要學習後續的內容,此處不要求理解。知道大概什麼樣子往哪裏寫即可。

  • 選定要交易的股票爲平安銀行:

      g.security = '000001.XSHE'
    
  • 買 100 股的平安銀行(市價單寫法):

      order(g.security, 100)
    
  • 以寫法二爲例把剩下的代碼補上後,完整代碼爲:

      def initialize(context):
          run_daily(period,time='every_bar')
          g.security = '000001.XSHE'
    
      def period(context):
          order(g.security, 100)
    

那麼現在這些代碼就可以運行了嗎?

  • 是的。以寫法二爲例,如圖把代碼寫到策略編輯區,設置好初始資金起止時間(比如初始資金 100000 元,起止時間 20160601-20161231),頻率設置成天。點擊編譯運行,運行結束後就可以看到結果了。
    設置並運行.png

  • 可以看到,若你 20160601 有初始資金 100000 元,每個交易日嘗試買 100 股的平安銀行,到 20161231,你的收益曲線將如圖中藍線般增長。圖中紅線是基準收益(默認是滬深 300 指數,代表整個市場增長水平)

  • 接下來,點擊運行回測,運行結束後就可以看到更爲詳細的結果,包括下單記錄、持倉記錄等。
    回測結果.png

策略出錯不能運行?

  • 策略不能運行時,日誌中會報錯並給出一定的提示信息,像這樣:
    缺少符號錯誤.png
  • 首先注意,右上角的箭頭按鈕能展開運行日誌。看到日誌中,最後一行是錯誤的提示信息:

      SyntaxError: invalid syntax
    
      漢義是 語法錯誤:不合法的語法。
    
  • 最後一行之前的是錯誤的位置信息,一般只看後面就行。

      File "user_code.py", line 1
          def initialize(context)
                                ^
    
  • 意思是文件 user_code.py(就是你的策略代碼)的第一行,“^” 符號指向的位置有錯。你到代碼中的這個位置看下,會發現少個冒號。

  • 爲了順利運行策略,需要耐心解決錯誤,但錯誤的原因極度的複雜多樣(所以日誌的報錯信息也多種多樣,不止圖上一種),故在此只針對例子講下新手容易犯的錯誤:

    • 符號要用英文輸入法。下圖,代碼第一行的冒號是中文的,所以出錯
      中文符號錯誤.png
    • 拼寫不要錯。下圖,security 拼寫錯了
      拼寫錯誤1.png
    • 縮進要對齊。下圖,縮進沒對齊。縮進的時候可以按鍵盤 tab 鍵或四個空格。
      縮進錯誤.png
  • 編程界往往把錯誤叫 bug,而不斷調試去除錯誤的過程叫 debug,做量化時也是時常聽到的說法,大家應該知道下。

  • 而且 debug 通常就是要耗費不低於寫 bug 寫代碼的時間的,所以會 debug 是很重要的能力,大家平時 debug 的時候不妨多思考下,如何更有效率的 debug。當然,我們後續也會介紹些 debug 的技巧。

回測、編譯運行、運行回測都是什麼意思?

  • 像剛剛那樣,用一段時間內的歷史的真實行情數據,來驗證一個確定的交易策略在這段時間表現如何,這個過程叫回測

  • 運行回測就是是字面意思,讓計算機運行這次回測,運行後會告訴你策略在這段時間表現情況,比如收益率、年化收益率、最大回撤、夏普比率等指標,而且一般也會包括下單記錄、持倉記錄等。

  • 編譯運行其實也是讓計算機運行這次回測,不過相比於點擊運行回測,編譯運行的結果比運行回測要簡單,只有收益率等指標,因此也速度更快。所以,當還不必要得到詳細的結果時,或只是想調試下策略的代碼,看是否無誤可運行時,編譯運行就比運行回測更方便。

週期循環具體是什麼時候開始的呢?

  • 如果策略頻率爲天,是每個交易日開始生效,從 9:30 直到 15:00(從股市開市到收市),所以例子中是每個交易日 9:30 開市循環就開始,一天一次地循環執行買入股票的操作。

  • 如果策略頻率爲分鐘,是每個分鐘開始時執行,所以例子中的買入股票的操作是每個交易日從 9:30:00 開始,然後 9:31:00,直到 14:59:00。接着下一天 9:30:00,如此一分鐘一次地循環執行的。
    minBar.png

  • 雖然頻率只有爲分鐘和每天可選,但通過不同的代碼可以實現按周按月週期循環,而且分鐘級別裏下單時間也是可以自己選的,不過代碼的寫法則與寫法一和寫法二那樣略有不同,後面會講到。

自測與自學

  • 按教程實踐下。
  • 通過搜索自學 K 線、bug、debug 的含義。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章