十行代碼帶你量化交易入門


https://zhuanlan.zhihu.com/p/23367387

使用聚寬來開始策略。

 

說起量化交易入門,很多時候得到的答案都是長長的書單,讓人望而卻步。

這里,就為新手准備了這篇文章--十行代碼帶你量化交易入門

數據獲取,策略回測,行情鏈接,交易信號,直接體驗整個量化交易的核心流程,立刻學會並跟着做起來!


這里,就為新手准備了這篇文章--十行代碼帶你量化交易入門

學習內容:

  • 學會寫一個簡單的量化交易策略
  • 理解策略的基本框架
  • 學會建立連接實盤的模擬交易,並使其自動發送交易的信號到微信

首先,進入JoinQuant,點擊導航欄我的策略,新建策略,進入策略編輯畫面,如圖。 
左側是編寫策略代碼,右側是策略運行結果。我們就在左側寫策略代碼。

下面教你用10行代碼寫個量化交易策略——單股票均線策略

1 確定策略內容與框架

若昨日收盤價高出過去20日平均價今天開盤買入股票 
若昨日收盤價低於過去20日平均價今天開盤賣出股票

只操作一只股票,很簡單對吧,但怎么用代碼說給計算機聽呢?

想想人是怎么操作的,應該包括這樣兩個部分

  1. 既然是單股票策略,事先決定好交易哪一個股票。
  2. 每天看看昨日收盤價是否高出過去20日平均價,是的話開盤就買入,不是開盤就賣出。每天都這么做,循環下去

對應代碼也是這兩個部分

def initialize(context):
    用來寫最開始要做什么的地方
def handle_data(context,data):
    用來寫每天循環要做什么的地方

答疑與延伸:

  • def后面的空格和最后的冒號不能少!
  • 符號都要用英文輸入法!
  • 為什么這么寫?就這么規定的,先別管了。
  • handle_data 按天循環時,如此處,其中的操作都是在9:30執行。
  • 毫無編程基礎?,絲毫不懂變量,函數,if else的,還是先到量化課堂的編程部分學習下python語言吧。

幾乎所有策略都基於這個基本的策略框架:先初始化,然后循環操作
初始化,即最開始要做的事情,如選定股票,設置變量、參數等等 
周期循環:即每個周期要做的事情,如計算指標,買入賣出等,周期可能是分鍾,天等,本文策略的周期是一天。當你要做一些盤中短線操作的時候,周期就要調成分鍾,先別着急會遇到的。

2 初始化

我們要寫設置要交易的股票的代碼,比如 兔寶寶(002043)

def initialize(context):
    g.security = '002043.XSHE'# 存入兔寶寶的股票代碼

答疑與延伸:

  • “g.”是什么?全局變量前都要寫”g.”,全局變量就是全局都能用的變量,一般變量只能在該函數下使用。如security不加”g.”,只能在第一部分即initialize里用,不能在第二部分handle_data里用。不懂什么是變量的,到量化課堂的python編程里學習下基礎內容,或者問問度娘。
  • “XSHE”是什么? 股票代碼使用時要加后綴,深交所股票代碼后綴為 “.XSHE “,上交所股票代碼后綴為 “.XSHG”。
  • 代碼中“#”是什么?”#“后的內容都是注釋,是為代碼做說明的,不會被計算機當做代碼處理。

3 獲取收盤價與均價

首先,獲取昨日股票的收盤價

# 用法:變量 = data[股票代碼].close
last_price = data[g.security].close# 取得最近日收盤價,命名為last_price

然后,獲取近二十日股票收盤價的平均價

# 用法:變量 = data[股票代碼].mavg(天數,‘close’)
# 獲取近二十日股票收盤價的平均價,命名為average_price
average_price = data[g.security].mavg(20, 'close')

答疑與延伸:

4 判斷是否買賣

數據都獲取完,該做買賣判斷了

# 如果昨日收盤價高出二十日平均價, 則買入,否則賣出
if last_price > average_price:
    買入
elif last_price < average_price:
    賣出

問題來了,現在該寫買賣下單了,但是拿多少錢去買我們還沒有告訴計算機,所以每天還要獲取賬戶里現金量。

# 用法:變量 = context.portfolio.cash
cash = context.portfolio.cash# 取得當前的現金量,命名為cash

答疑與延伸:

這句看着有點復雜,先記住吧。然后我們看看買入賣出怎么寫。

5 買入賣出

# 用法:order_value(要買入股票股票的股票代碼,要多少錢去買)
order_value(g.security, cash)# 用當前所有資金買入股票
# 用法:order_target(要買賣股票的股票代碼,目標持倉金額)
order_target(g.security, 0)# 將股票倉位調整到0,即全賣出

答疑與延伸:

  • 為什么沒有指定交易價格?此策略是按天回測進行的且使用的較為簡單的市價單下單方法,交易價格為開盤價(加上滑點)
  • 無法交易的情況?漲跌停,停牌,T+1制度等無法交易的情況,系統會自動使下單不成交並在日志中發出警告。
  • 滑點是什么?
  • 下單方法有哪些?

6 策略代碼寫完,進行回測

把買入賣出的代碼寫好,策略就寫完了,如下

def initialize(context):#初始化
    g.security = '002043.XSHE'# 股票名:兔寶寶
def handle_data(context, data):#每日循環
    last_price = data[g.security].close# 取得最近日收盤價
    # 取得過去二十天的平均價格
    average_price = data[g.security].mavg(20, 'close')
    cash = context.portfolio.cash# 取得當前的現金
    # 如果昨日收盤價高出二十日平均價, 則買入,否則賣出。
    if last_price > average_price:
        order_value(g.security, cash)# 用當前所有資金買入股票
    elif last_price < average_price:
        order_target(g.security, 0)# 將股票倉位調整到0,即全賣出

現在,在策略回測界面右上部,設置回測時間從20140101到20160601,設置初始資金100000,設置回測頻率,然后點擊運行回測。

答疑與延伸:

  • 什么是回測?回測是量化交易策略研究中的關鍵,是指給定一段時間的歷史數據(如此處是20140101到20160601的每日數據),計算機按照所編寫的策略進行模擬仿真交易,以測試策略效果好壞。

如果你代碼沒有問題,就會順利的進行回測,回測結果如下圖: 
至此,你就完成了一個簡單策略的回測了。

答疑與延伸:

  • 如何根據回測結果評價策略好壞?很初級地講,有三: 
    1. 盈利能力:策略收益與年化收益高,則說明盈利能力強。盈利能力不行說啥都沒用。
    2. 盈利穩定性:最大回撤要低。最大回撤是指最大虧損幅度,50%則意味着歷史上看最大虧損率為50%。
    3. 回測可靠性:交易次數要多。交易次數越多意味着經歷了越多次的檢驗,回測的結果也越可靠。 
      更多說明見:風險指標說明
  • 這個策略回撤大,交易次數少,只交易一只股票,並不靠譜。但是結構簡單適合新手入門理解整個流程。

7 建立模擬交易,使策略和行情實時連接自動運行

策略寫好,回測完成,點擊回測結果界面(如上圖)右上部紅色模擬交易按鈕,新建模擬交易如下圖。寫好交易名稱,設置初始資金,數據頻率,此處是每天,設置好后點提交。

答疑與延伸:

  • 模擬交易創建成功后,需要等待A股至少開盤一次,才能查看模擬交易結果。

8 開啟微信通知,接收交易信號

點擊聚寬導航欄我的交易,可以看到創建的模擬交易,如下圖。點擊右邊的微信通知開關,將OFF調到ON,按照指示掃描二維碼,綁定微信,就能微信接收交易信號了。 
當策略買賣操作,微信會收到信號提醒類似下圖。

答疑與延伸:

  • 能不能自動下單?目前不能,國家管制。你可根據信號手動下單買賣,施行策略。

自測與自學

  1. 能否理解整個策略框架。
  2. 能否成功編寫單股票均線策略,成功回測,建立模擬,開啟微信通知。
  3. 能否理解年化收益,最大回撤。
  4. 瀏覽JoinQuant 導航欄-幫助-常見問題

之后的文章,將在本文的基礎上,進行深入和擴展,比如多股票,指標獲取,大盤擇時等,旨在幫助對量化交易有興趣的人快速入門,能夠自主實現自己心中的想法與策略。

本篇文章和后續將收錄到 量化交易&寬客 - 知乎專欄 , 敬請關注:)

更多進階內容可以到 量化課堂 - JoinQuant 學習,特點是講解細致,代碼規范,可以在聚寬實踐演練。

都看到這里了,不點個贊嘛:)

推薦閱讀:

聚寬新手指南 - JoinQuant,干貨,答疑,指路,一應俱全。


免責聲明!

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



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