Python零基礎該如何學習
這篇文章經過敘述 [單股市均線戰略] 在 Ricequant 量化渠道的完成,了解渠道并迅速入門、創立自個的量化戰略代碼。
難易度:入門級
那么以下咱們就先從 [單股市均線戰略] 的代碼完成及進行日等級回測講起吧。
1 確定框架:
[單股票均線策略] 的主要策略框架: 5 日均線高于 30 天均線,則全倉買入股票 5 日均線低于 30 天均線,則賣出所持股票
從我們日常交易的角度,一般交易者的行為可以拆分以下兩部分:
1 選擇標的(初始化):
在交易之前,我們通常會先選定要交易的股票池或者單個股票
2 交易(每天盯盤)
我們會觀察該股票的五日均線和 30 日均線,并進行比較 如果該股票的五日均線在 30 天均線以上,則全倉買入股票 如果該股票的五日均線在 30 天均線以下,則全倉賣出(空倉)
那么程序中,我們是怎么做的呢?
先看看 Ricequant 平臺中對應的代碼框架會是怎么樣的吧:
definit(context):#程序的初始化,預設股票池、設置參數和變量。 只運行一次defhandle(context, bar_dict):#從回測的開始日期至結束日期,根據選擇的頻率(日、分鐘)循環運行
對照策略思路 及 Ricequant 代碼框架,你會發現我們可以很輕松地把 兩者結合起來
以上框架也是 Ricequant 平臺的最基本也最主要的框架,也就是
- 初始化
- 循環 - 根據選擇的頻率(日、分鐘)循環運行
2 初始化:
選擇標的:本策略的交易股票設定為 300059 ”東方財富“。
definit(context):? ?context.stock ="300059.XSHE"?# 存入目標股票 [東方財富 ]
延伸閱讀:
1 在 init 中實現程序的初始化,例如存入目標股票池,設置滑點、基準等參數以及設置其它變量。 context 是一個全局的容器,你可以通過它設置任何全局變量并初始化:如 context.stock 將會在后面代碼所被調用到。
2 代碼中 # 代表注釋,作為代碼說明,執行時會被跳過而不為程序所運行。
3 如何填寫股票代碼:你會發現策略代碼中 股票代碼后帶有后綴,那么它們分別代表什么呢?
后綴為
- XSHE 代表在深交所上市交易的股票
- XSHG 在上交所上市交易的股票
例子:
- 300059.XSHE 為深交所上市的東方財富
- 600000.XSHG 為上交所上市的浦發銀行
我們的代碼編輯器還提供了非常便利的股票代碼自動尋找和補全功能,在 Windows 中你可以用 ctrl+i , Mac 系統你可以用 cmd+i 激活證券代碼自動補全功能。如下圖:
3 獲取均價:
我們分別獲取該股票 5 日和 30 日的均價
# 用法:變量 = bar_dict[股票代碼].mavg(天數, frequency='day')# 獲取近五日股票收盤價均價,命名為 fast? ?fast= bar_dict[context.stock].mavg(5, frequency='day')# ?同上,獲取近二十日的收盤價均價,命名為 slow :? ?slow = bar_dict[context.stock].mavg(30, frequency='day')
4 判斷買賣條件:
獲得均價數據之后,我們就可以進行一個判斷決定是否買賣了:
iffast>slow:# 若快線在慢線之上則用所有現金買入該股票? ? ? ? ?#買入操作? ? ? ? ? ? ? ? ?eliffast<slow:# 若慢線在快線之上則清空所持股票? ? ? ? ? ?#賣出操作
在判斷之前,我們還漏了一步,那是什么呢?就是要知道我們有多少現金,那么在程序中是如何獲得現金的呢?我們使用以下代碼
# 用法:變量 = context.portfolio.cashcash= context.portfolio.cash#取得當前的現金量,命名為 cash
延伸閱讀: portfolio 中 包含所有的投資組合的信息,請參考文檔 -?Portfolio 對象
5 買入 /賣出:
在判定買賣的條件成立之后,我們會對股票進行買入或者賣出的操作:
#用法 order_value(股票代碼,買賣金額) ? 金額為正則為買入,負數則為賣出#將所有現金買入 300059 東方財富order_value(context.stock, cash)#用法: order_target_value(股票代碼,目標持倉比例) ? 比例在 1 與 0 之間#此處將持倉比例調整為 0 ,則等同于全部賣出order_target_percent(context.stock,0)
6 策略回測
以上,我們用幾行代碼就把策略的框架完整地搭建起來了,最終的完整代碼為:
definit(context):?#初始化? ?context.stock ="300059.XSHE"? ? ? ?#存入要交易的股票代碼defhandle_bar(context, bar_dict):? ? ? ?#每日循環運行 ?#獲取 30 日均線????slow = bar_dict[context.stock].mavg(30, frequency='day') ?#獲取 5 日均線????fast = bar_dict[context.stock].mavg(5, frequency='day') ?????cash = context.portfolio.cash ? ? ? ? ? ? ? ? ?#獲取持有現金金額????iffast>slow: ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?#判定買入條件????????order_value(context.stock, cash) ? ? ? ?#買入目標股票????eliffast<slow:????????order_target_percent(context.stock,0) ?#賣出目標股票
寫完了策略,那么我們接下去做什么呢? 先對我們的策略進行一次歷史回測,看看它的歷史表現是如何吧。
在策略編輯頁面右上方,選擇從 2015 年 1 月 4 日至 2016 年 10 月 4 日,用資金 10 萬元進行日回測吧,請點擊 運行回測
如代碼沒有問題,在數秒之后,我們就會拿到該策略的歷史表現結果:
我們可以看到回測詳情中有精致的圖表,詳細的各項風險收益指標、以及持倉、落單等詳情輔助你進一步了解你的策略的表現。
到這里,一個完整的從 [構建策略思路] 到 [策略代碼編寫] 到 [回測結果檢驗] 的流程就結束了。
7 從日回測到分鐘回測:
在循環部分, handle 函數根據選擇的頻率(日、分鐘)循環運行,在以上的日回測中, handle 內的代碼會每日被觸發一次
defhandle(context, bar_dict):
如果是進行分鐘回測或模擬實盤,那么這個 handle 里的代碼就會被每分鐘觸發一次;
因此,我們的代碼邏輯也勢必要進行一定的改進,使得策略按照我們的邏輯正常地運行。
我們先把修改好的代碼貼上來:
definit(context):? ?context.stock ="300059.XSHE"# 每日開盤前運行一次,可以進行選股、設置參數等行為 ? ?defbefore_trading(context):? ?# 設定并重置 context.fired 的值為 0? ?context.fired =0? ?#從回測的開始日期至結束日期,根據選擇的頻率(日、分鐘)循環運行defhandle_bar(context, bar_dict):? ?# 判定今日是否有下過單,若未下單則進行下列代碼的操作? ?if(context.fired ==0): ? ? ? ?slow = bar_dict[context.stock].mavg(30, frequency='day') ? ? ? ?fast = bar_dict[context.stock].mavg(5, frequency='day') ? ? ? ?cash = context.portfolio.cash ? ? ? ? ? ? ? ?iffast>slow: ? ? ? ? ? ?order_value(context.stock, cash) ? ? ? ?eliffast < slow: ? ? ? ? ? ?order_target_percent(context.stock,0) ? ? ? ?# 設置 fired 等于 1 ,表示執行完畢 ? ? ? ? ?? ? ? ?context.fired =1
可以看到這里改動并不多,
這里需要介紹到框架中常用到的函數 before_trading :
# 每日開盤前運行一次,可以進行選股、設置參數等行為 ? ?defbefore_trading(context):
我們在 before_trading 中設置一個變量命名為 fired ,賦值為 0
# 設定并重置 context.fired 的值為 0? ?context.fired =0
由于 before_trading 是每天開盤前運行一次,所以 context.fired 會被每天重置為 0
在 handle 函數中,我們加入了判斷,如 context.fired 為 0 ,則繼續執行下面的代碼,否則本次循環結束。
# 判定今日是否有下過單,若未下單則進行下列代碼的操作if(context.fired ==0):
并在執行完判斷和買賣操作之后,設定 context.fired 的值等于 1 ,使得當日余下的分鐘循環操作均被跳過。
# 設置 fired 等于 1 ,表示今天已下過單 ? ? ? ? ? ?context.fired =1
在完成以上代碼后,我們開始進行分鐘回測吧: 在策略編輯頁面右上方,選擇從 2015 年 1 月 4 日至 2016 年 10 月 4 日,用資金 10 萬元進行分鐘回測吧,請點擊 運行回測?
8 模擬交易:
模擬交易通過實時的分鐘切片數據進行撮合,也就是 handle 函數會每分鐘被觸發一次循環。在開啟你的策略的模擬交易之前,你必須要對它進行一次分鐘回測,才可以開啟模擬交易。 在上面分鐘回測之后,你可以在策略回測詳情頁面點擊 開啟模擬交易。然后你將在模擬交易列表中看到進行中的策略。
9 開啟微信通知,接收交易信號:
點擊導航欄中的 [我的策略] ,可以在 [模擬交易] 一欄看到創建的模擬交易,如下圖:
點擊右邊的微信通知開關,將 OFF 調至 ON ,并按照指示掃描二維碼,綁定微信,就能通過微信接收交易信號了。
當該策略進行買賣操作,你的微信會收到類似下圖的信號提醒。微信推送的延遲非常小,使得你能根據信號進行及時的下單操作。
是不是很輕松,數行代碼就可以把你的出資戰略成為代碼,我們都來試試吧!