WeQuant教程—1.4 實踐教學:比特幣量化定投

 在wequant.io,爲了讓讀者能直接體驗量化系統的魅力,咱們用前面的思路,實現了一套完整的量化系統和回測工具,這個系統很是簡單,用戶只須要把交易意志用策略表達出來,系統就能夠本身完成交易效果的回測,和實盤交易的接入。

咱們使用數字貨幣比特幣做爲量化交易標的。使用比特幣的好處有幾個:編程

  1. 品種單一,計價方式簡單;
  2. 24小時不間斷交易;
  3. 交易資金門檻低;
  4. 接口受權簡單。

接下來要作的,就是學習用WeQuant的標準,以完成一份有效的策略。咱們將以比特幣定投爲例(按期自動買入比特幣,來換取比特幣升值收益),做一個簡單的介紹。編程語言

基本名詞介紹

bar

這裏的bar不是指酒吧,是金融交易裏面的行情bar,是一個圖形概念。若是你多多少少看過交易的行情圖,橫向排列的高低不一樣的「小柱子」,每一根柱子都稱爲一個bar。函數

bar跟時間是高度關聯的。bar記錄了固定間隔內,從開始時間到結束時間,價格的信息,常規的bar會記錄以下價格信息:開始價格(開盤價)、結束價格(收盤價)、最高價、最低價。通常來講,bar還會附帶成交數量的信息。工具

bar在咱們的量化系統裏面有什麼用呢?除了提供基礎的價格信息,在WeQuant設計的量化系統裏面,策略是循環不間斷地運轉的,bar是循環的依據。學習

爲何須要bar來支持循環呢?咱們知道,bar是自然帶有時間屬性的信息合集,在圖形裏,左邊的bar比右邊的bar發生的更早,最右邊的bar反映的是當前最新的動態,因而,咱們能夠利用bar的時間屬性,讓程序從左往右依次讀取bar,來實現「從某時至某時」或者「實時不間斷」的信息獲取和計算的目的,既不遺漏,也不重複,時間間隔固定,因而咱們在寫策略的時候,能夠省略掉不少時間定義和處理的步驟,只須要關心在所讀取的當前的bar裏面,設計交易觸發條件「若是 => 那麼」——從而,整個策略的設計和編寫,因爲bar的循環的幫助,變得很是簡單。翻譯

bar就像老式時鐘的鐘擺,每擺一下,時間就往前進一格。只要bar不停地在更新和讀取,咱們的策略就會不斷地運行。bar跟前面幾篇文章提到的行情繫統,有極大的關聯。設計

bar自己有頻率的區分,區別就是每隔多少時長彙總一根bar。WeQuant提供分鐘、小時、天、周級別的bar,來知足執行頻率不一樣的策略的要求。目前WeQuant提供的bar,主要針對數字貨幣交易市場,因爲中間不休市,bar與bar之間所表示的時間區段是連續的,即緊密相連,不存在縫隙。接口

frequency

與bar密切相連,因爲bar表示的是固定時間間隔內的價格信息,這裏的frequency就是用來指定固定時間間隔有多長。ip

frequency有個正經的中文翻譯叫頻率,頻率的單位是赫茲(次/秒)。而咱們爲了省略換算的複雜(不少人算不過來),frequency設定的值僅做代指而非學術上的頻率值,例如當frequency爲1分鐘時,實際上咱們說的是給策略指定成「依據1分鐘時長的bar,每1分鐘執行一次策略,所換算出來的頻率值」。這段話獻給特別較真的朋友們。文檔

函數

這是編程語言的概念,不做累述。在WeQuant的策略模板裏面,只須要在策略裏定義清楚兩個函數,策略就能夠生效。具體是哪兩個函數須要定義,後文會做示例講解。

除了用戶須要本身編寫函數以外,WeQuant自己提供了一些列的函數來輔助完成策略的表達,包括但不限於獲取歷史數據、獲取賬號信息、操做訂單、計算和保存變量等等。詳細的定義和使用方法,請在須要的時候移步至專門的API文檔。

參數

因爲策略須要跟量化系統做整合,咱們要求在策略裏添加一些預設的但跟交易邏輯自己無關的變量,讓策略變得機器可讀,使用方法請看示例,詳細說明看API文檔。

一個基本的策略-比特幣定投

咱們對上文進行一個簡單的彙總,一個WeQuant標準的策略應該長這個樣子:

PARAMS = { "start_time": "2016-09-20 00:00:00", # 回測起始時間 "end_time": "2016-10-21 00:00:00", # 回測結束時間 "slippage": 0.02, # 設置滑點 "account_initial": {"huobi_cny_cash": 10000, "huobi_cny_btc": 3}, # 設置帳戶初始狀態}def initialize(context): context.frequency = "1d" context.benchmark = "huobi_cny_btc" context.security = "huobi_cny_btc"def handle_data(context): if context.account.huobi_cny_cash > 100: context.order.buy(context.security, cash_amount="100")

咱們看到,策略分紅三部分,分別定義PARAMS(參數)變量、initialize和handle_data函數(分別須要傳入context參數)。

  • PARAMS裏面定義回測的起始時間、結束時間、賬號初始資金和初始比特幣數量、滑點偏差率(就是交易過程產生的偏差,解釋另附);
  • initialize函數設置context變量,包括frequency、基準品種價格、操做品種、用戶自定義變量;
  • handle_data函數寫實際的策略邏輯,即每次讀取bar的時候,按照什麼條件觸發訂單。

這個策略什麼意思呢?刨除掉其餘設置的細節(想了解的話,請閱讀API文檔),咱們只看handle_data裏的內容:

def handle_data(context): # 若是火幣賬號裏面的現金餘額,大於用戶設定的閾值(設爲100), # 則觸發下單條件: if context.account.huobi_cny_cash > 100: # 按照市價購買100元金額的比特幣 context.order.buy(context.security, cash_amount="100")

代碼的意思是,天天,檢查帳戶裏是否是剩餘超過100塊錢,若是超過,則按照當前的價格買入100塊錢的比特幣。

這樣寫完之後,平臺就自動天天幫你買比特幣了,做爲一個自動化的定投策略,是否是很簡單?

實際的定投策略會比這個更智能一些,那只是下單邏輯有了一些變化,總體的結構仍是同樣的,此處爲了簡化教學目的。

在回測階段,這段代碼也是可用的,並且能夠從回測結果裏面看到,由於比特幣價格在上漲,因此這個定投策略也是掙錢的呢。

基本概念先介紹到這裏。若是但願看更復雜的策略,策略講堂裏面有目前主流經典教科書策略的比特幣版本,但願大家喜歡。

相關文章
相關標籤/搜索
本站公眾號
   歡迎關注本站公眾號,獲取更多信息