3.量化交易策略基本框架


量化交易策略基本框架

摘要

  • 策略編寫的基本框架及其實現
  • 回測的含義及其實現
  • 初步學習解決代碼錯誤
  • 周期循環的開始時間
  • 自測與自學
  • 通過前文對量化交易有了一個基本認識之后,我們開始學習量化交易。畢竟就像學游泳,有些東西講是講不懂,做過就會懂。

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

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

      每天買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的含義。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM