摘要
- 策略編寫的基本框架及其實現
- 回測的含義及其實現
- 初步學習解決代碼錯誤
- 周期循環的開始時間
- 自測與自學
-
通過前文對量化交易有了一個基本認識之后,我們開始學習做量化交易。畢竟就像學游泳,有些東西講是講不懂,做過就會懂。
從一個非常簡單的交易策略開始
-
先看一個非常簡單的交易策略:
每天買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股的平安銀行
-
代碼應該往哪里寫?
-
來到聚寬網站后,通過導航欄-我的策略-我的策略進入策略列表,點擊新建策略-
-
進入策略編輯頁,左側就是策略代碼編輯區域,初始會默認給你提供代碼模板,全刪除后寫入我們的代碼就好了。
-
-
兩種寫法用哪個好?
-
寫法一是從前的老寫法,將逐步棄用,寫法二是聚寬系統改進后的新寫法,推薦使用寫法二。
-
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),頻率設置成天。點擊編譯運行,運行結束后就可以看到結果了。
-
可以看到,若你20160601有初始資金100000元,每個交易日嘗試買100股的平安銀行,到20161231,你的收益曲線將如圖中藍線般增長。圖中紅線是基准收益(默認是滬深300指數,代表整個市場增長水平)
-
接下來,點擊運行回測,運行結束后就可以看到更為詳細的結果,包括下單記錄、持倉記錄等。
策略出錯不能運行?
- 策略不能運行時,日志中會報錯並給出一定的提示信息,像這樣:
-
首先注意,右上角的箭頭按鈕能展開運行日志。看到日志中,最后一行是錯誤的提示信息:
SyntaxError: invalid syntax 漢義是 語法錯誤:不合法的語法。
-
最后一行之前的是錯誤的位置信息,一般只看后面就行。
File "user_code.py", line 1 def initialize(context) ^
-
意思是文件user_code.py(就是你的策略代碼)的第一行,“^”符號指向的位置有錯。你到代碼中的這個位置看下,會發現少個冒號。
-
為了順利運行策略,需要耐心解決錯誤,但錯誤的原因極度的復雜多樣(所以日志的報錯信息也多種多樣,不止圖上一種),故在此只針對例子講下新手容易犯的錯誤:
- 符號要用英文輸入法。下圖,代碼第一行的冒號是中文的,所以出錯
- 拼寫不要錯。下圖,security拼寫錯了
- 縮進要對齊。下圖,縮進沒對齊。縮進的時候可以按鍵盤tab鍵或四個空格。
- 符號要用英文輸入法。下圖,代碼第一行的冒號是中文的,所以出錯
-
編程界往往把錯誤叫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,如此一分鍾一次地循環執行的。
- 雖然頻率只有為分鍾和每天可選,但通過不同的代碼可以實現按周按月周期循環,而且分鍾級別里下單時間也是可以自己選的,不過代碼的寫法則與寫法一和寫法二那樣略有不同,后面會講到。
自測與自學
- 按教程實踐下。
- 通過搜索自學K線、bug、debug的含義。