1. 程式人生 > >JQData + matplotlib 實現回測日誌的交易細節視覺化 量化資料介面

JQData + matplotlib 實現回測日誌的交易細節視覺化 量化資料介面

原文:https://zhuanlan.zhihu.com/p/49051899
前言:

做量化交易的朋友都知道回測的重要性,回測結果是衡量一個量化交易策略是否靠譜的重要依據。回測平臺會按歷史行情資料模擬成交,並將回測結果彙總成報告。

在很多時候,僅有一份回測的最終結果是不夠的。比如說當我們發現結果不符合策略的設計預期時,就需要對部分或全部股票的買賣操作進行檢查確認。通常我們要翻閱回測平臺給出的回測日誌,找到有待檢查確認的買賣交易,根據其品種、時間週期和交易時間翻查當時的歷史行情,而這時又往往需要開啟第三方行情軟體,輸入該品種的交易程式碼,調整K線圖到特定的時間週期(比如60分鐘圖),再在時間軸上定位至相應的日期,然後檢視該筆交易發生當時的行情走勢是否符合你的策略預期。整個過程操作起來很麻煩,如果你的電腦只有一個顯示屏,還得在回測平臺和第三方行情軟體之間來回切換,效率極低。

通過解析回測日誌,可以提取出交易程式碼和交易時間等資訊,再利用JQData的本地資料下載功能,結合matplotlib這一常用繪圖工具庫,可以實現自動獲取行情資料然後在螢幕上繪製相應的K線圖,並直接定位到圖上的特定日期附近,這樣就能快速方便地視覺化覆盤回測日誌中的每筆交易,直觀地來檢驗每一筆交易是否符合預期。

整個專案全部用python語言來編寫,以下分幾個部分簡要介紹實現的方法:

一.解析回測日誌:

在策略的程式碼中可以加入日誌資訊來詳細記錄每筆買/賣操作,比如像這樣:

買入:log.info(“Buying %s” % (security))
賣出:log.info(“Selling %s” % (security))
如此一來,JoinQuant的回測日誌中將會包含每筆買賣操作的詳細資訊,回測結束後在“日誌輸出”一欄下面可以找到很多買入,賣出的日誌資訊,例如:

2017-06-20 09:30:00 - INFO - Buying 000002.XSHE
2017-06-26 09:30:00 - INFO - Selling 000002.XSHE

將這些日誌依照橫線和空格等特徵關鍵字split之後,可以很容易的提取出時間、買賣方向以及品種程式碼等有用的資訊。

注意:如果你想使用來自其他回測平臺的日誌,可能還需要將提取出的品種程式碼轉換為JQData相容的格式,JQData提供了一個API可以實現這種轉換:normalize_code,詳見官方文件。

考慮到回測日誌可能包含很多次的買入和賣出,所以還設計了連續輸入模式,並做了一定的容錯處理,可以將多行日誌一次性複製貼上進來。

二.獲取資料:

提取出交易程式碼和時間等資訊之後,就可以呼叫JQData的get_price函式獲取該股票的歷史行情資料。get_price函式的引數較多,其中security是必填的,即股票的交易程式碼(JQData格式)。start_date和end_date兩個引數為股票的上市和退市日期,可以通過get_security_info函式查得。然後根據策略執行的頻率選擇frequency引數,如果是日線的話就用預設值’daily’,引數fq使用預設值’pre’即前復權。注意一定要加上skip_paused=True,來跳過停牌時期。

除了歷史行情資料之外,聚寬還提供了財務資料、經濟基本面資料以及一些特色因子資料等,可供下載。如果你的策略中用到了這些資料,希望在覆盤時與行情資料一併展示,可以呼叫JQData提供的相應API來獲取。

參考API文件>>

三.繪圖:

有了資料,接下來就可以繪圖了,這裡我們用到了matplotlib以及它的一個擴充套件庫mpl_finance來實現。如果是初次使用的話需執行以下命令安裝:

python -mpip install -U matplotlib
python -mpip install https://github.com/matplotlib/mpl_finance/archive/master.zip
使用時需在程式碼中匯入相應的module

import numpy
import matplotlib.ticker as ticker
import matplotlib.pyplot as plt
from mpl_finance import candlestick_ohlc
首先建立一個figure,採用3x1柵格佈局(grid)

fig = plt.figure()
grid = plt.GridSpec(3, 1, hspace=0.15)
上方主圖佔2個grid,下方副圖佔1個grid,兩者共享X座標軸,底部適當留出空白

main_ax = plt.subplot(grid[0:2,0])
extra_ax = plt.subplot(grid[2,0], sharex=main_ax)
fig.subplots_adjust(bottom=0.2)
接下來先畫主圖,主圖顯示K線和買賣點

candlestick2_ohlc(main_ax, o, h, l, c, width=0.6, colorup=‘red’, colordown=‘cyan’)
main_ax為subplot返回的主圖Axes例項,o、h、l、c分別為開高低收資料序列,陽線顏色用紅色,陰線用青藍色,與國內行情軟體通常預設的設定一致。

然後根據日誌中提取出的買賣方向和時間資訊,在主圖上用箭頭標註出相應的買入點和賣出點。

extra_ax.arrow(x, y, 0, dy, color=clr, width=0.4)
x和y為箭頭起點的座標,dy為y軸方向箭頭的長度,由於箭頭方向只可能是向上或者向下,所以x軸方向長度dx為0,clr為箭頭的顏色,向上箭頭和向下箭頭可以被設定為不同的顏色,width是箭頭的寬度,設定為0.4。

主圖下方為副圖,可跟據策略的具體需要安排顯示的內容,比如偏重技術分析的可以顯示成交量或其他一些副圖指標,偏重資金面的話可以顯示主力資金流向或龍虎榜資料等資訊,偏重基本面的可以顯示財務指標等。通過JQData提供的豐富的API可以方便地獲取這些資料,再用matplotlib的bar, plot等函式展現出來。

以成交量為例,先宣告兩個列表分別表示柱子實體顏色和邊框顏色:

c=[]
ec=[]

然後遍歷一遍成交量,當前K線的成交量大於前一根的,邊框設為紅色,實體設為黑色。當前K線成交量小於前一根的話,邊框和實體都設為青藍色:

for i in range(n):
    if i == 0:
        c.append('black')
        ec.append('red')
    else:
        if v[i] > v[i - 1]:
            c.append('black')
            ec.append('red')
        else:
            c.append('cyan')
            ec.append('cyan')

最後呼叫bar函式,傳入x軸座標、成交量、實體顏色以及邊框顏色等4個數列:

extra_ax.bar(range(n), v, color=c, edgecolor=ec)

繪製出來的效果是這樣子的,圖中白色和黃色的箭頭指出了策略的買點和賣點,一目瞭然:

在這裡插入圖片描述
總結

以上介紹了用JQData + matplotlib實現快速方便地查看回測日誌中的交易細節,具體的程式碼可以訪問https://github.com/zc8424/VisualizeThemAll獲得,目前還只是實現了一些基本的功能,未來藉助JQData強大的API還將做進一步的深入開發。大家如果感興趣的話請關注此專案,歡迎多提意見和建議。
原文:https://zhuanlan.zhihu.com/p/49051899