Jupyter Notebook實現從IB介面歷史資料獲取,寫入資料庫,策略回測和實盤交易

張國平發表於2019-10-10

剛好有個同學問怎麼實現IB盈透歷史資料獲取,和策略回測和實盤交易。想著熟悉vnpy2.0操作,就用Jupyter Notebook都是跑了一邊。VNPY2.0的整體架構設計很有擴充套件性,而且呼叫也比起v1.0先進清晰很多,引擎載入呼叫非常方便。

講講注意點:

  1. IB 盈透介面歷史資料大多是要收費訂閱的,如果收費會有報錯資訊提示,這裡找個免費的作為使用。另外vnpy是按照最大6個月曆史資料設計的。
  2. 資料庫定義有個小坑,我是用mongodb的,在第一次填寫 trader/setting.py中密碼寫錯了,後面在trader/setting.py改發現怎麼也改不好;原來當第一次維護後,配置會寫入.vntrader/vt_setting,之後系統只會去.vntrader/vt_setting讀取。去改vt_setting,而不是trader/setting.py。
  3. 使用CtaStrategyApp支援加入新策略,系統會自動輸出json保持策略資訊;所以第二次執行程式碼時候,會提示已經有了,不是問題。
  4. 我在程式碼裡面把回測和實盤放在一次,如果直接跑下來可能會報錯,建議跑實盤時候先註釋的回測。
  5. 使用script_engine訂閱歷史資料是是預設從rqdata獲取,vnpy v2.07 IB介面已經提供歷史資料獲取,這裡建立HistoryRequest用main_engine來獲取,

為了方便貼出來,改成.py程式碼格式,直接跑也沒有問題。

from vnpy.app.script_trader import init_cli_trading
from vnpy.app.script_trader.cli import process_log_event
from vnpy.gateway.ib import IbGateway
from time import sleep
from datetime import datetime
import pandas as pd
# 連線到伺服器
setting = {
    "TWS地址": "127.0.0.1",
    "TWS埠": 7497,
    "客戶號":8 #每個連結用一個獨立的連結號,一個IBAPI支援32個來同時連結
}
engine = init_cli_trading([IbGateway]) #返回Script_engine 示例,並且給main_engine註冊了gateway
engine.connect_gateway(setting, "IB") #連結
# 查詢資金 - 自動
sleep(10)
print("***查詢資金和持倉***")
print(engine.get_all_accounts(use_df = True))
# 查詢持倉
print(engine.get_all_positions(use_df = True))
# 訂閱行情
from vnpy.trader.constant import Exchange
from vnpy.trader.object import SubscribeRequest
# 從我測試直接用Script_engine有問題,IB的品種太多,get_all_contracts命令不行,需要指定具體後才可以,這裡使用main_engine訂閱
req1 = SubscribeRequest("12087792",Exchange.IDEALPRO) #建立行情訂閱
engine.main_engine.subscribe(req1,"IB")
# 使用script_engine訂閱歷史資料是從rqdata獲取,vnpy v2.07已經提供歷史資料獲取,這裡建立HistoryRequest來獲取,
# 查詢如果沒有endtime,預設當前。返回歷史資料輸出到資料庫和csv檔案
# 關於api更多資訊可以參見 
print("***從IB讀取歷史資料, 返回歷史資料輸出到資料庫和csv檔案***")
from vnpy.trader.object import HistoryRequest
from vnpy.trader.object import Interval
start = datetime.strptime('20190901', "%Y%m%d")
historyreq = HistoryRequest(
   symbol="12087792",
   exchange=Exchange.IDEALPRO,
   start=start,
   interval=Interval.MINUTE
)
# # 讀取歷史資料,並把歷史資料BarData放入資料庫
bardatalist = engine.main_engine.query_history(historyreq,"IB")
from vnpy.trader.database import database_manager
database_manager.save_bar_data(bardatalist)
# 把歷史資料BarData輸出到csv
pd.DataFrame(bardatalist).to_csv("C:\Project\\"+ str(historyreq.symbol) + ".csv" , index=True, header=True)
print("History data export to CSV")
# # 參考backtesting.ipynb, 使用自帶的雙均線策略回測,10日上穿60日做多,否則反之
print("***從資料庫讀取歷史資料, 進行回測***")
from vnpy.app.cta_strategy.backtesting import BacktestingEngine
from vnpy.app.cta_strategy.strategies.double_ma_strategy import (
   DoubleMaStrategy,
)
btengine = BacktestingEngine() #新建回測引擎
btengine.set_parameters(
    vt_symbol="12087792.IDEALPRO",
    interval="1m",
    start=datetime(2019, 9, 1),
    end=datetime(2019, 10, 5),
    rate = 0,
    slippage=0.00005,
    size=1000,
    pricetick=0.00005,
    capital=1_000_000,
)
btengine.add_strategy(DoubleMaStrategy, {"fast_window":10, "slow_window": 60})
btengine.load_data()
btengine.run_backtesting()
df = btengine.calculate_result()
btengine.calculate_statistics()
btengine.show_chart()
# 給script_engine載入雙均線策略,實盤執行
print("***從資料庫讀取準備資料, 實盤執行***")
# 使用cta交易引擎
from vnpy.app.cta_strategy import CtaStrategyApp
from vnpy.app.cta_strategy.base import EVENT_CTA_LOG
engine.event_engine.register(EVENT_CTA_LOG, process_log_event)
cta_engine = engine.main_engine.add_app(CtaStrategyApp) #加入app
cta_engine.init_engine()
cta_engine.add_strategy("DoubleMaStrategy","DoubleMaStrategy_IB_12087792_v1", "12087792.IDEALPRO",{"fast_window":10, "slow_window": 50})
sleep(10)
cta_engine.init_strategy("DoubleMaStrategy_IB_12087792_v1")
sleep(10)
cta_engine.start_strategy("DoubleMaStrategy_IB_12087792_v1")


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/22259926/viewspace-2659446/,如需轉載,請註明出處,否則將追究法律責任。

相關文章