下載了rqalpha源代碼,不知道如何用ipython直接在源代碼中調試運行。?

python方面的新手,現在用的是ipython,因為該源代碼是以包的形式組織的,用%run .py只能運行文件模塊,不知道如何運行?而且我發現在講解python包安裝管理以及發布的資料相當少,希望大神推薦相關資料,謝謝


首先同意子明的回答,如果題主並不清楚如何在本地搭建相應的開發環境,估計直接用網站上的集成環境會更加好一些,畢竟和搭建環境和維護相比,相應數據的獲取與清洗和介面開發(rqalpha在數據上只是ricequant的一個子集)難度要大得多。

以下題歸正轉。

題主的問題並不是很明確,我就假設題主的問題是如何在ipython里跑以下的指令:

rqalpha run -f buy_and_hold.py -s 2014-01-01 -e 2016-01-01 -o result.pkl --plot

首先需要明白的是python是如何找到core package以外的library的。簡單來說,在Linux,Windows或者MacOS上,都有環境變數的概念,python依靠一個特殊的環境變數來載入外部lib,叫做pythonpath,外加安裝時特定設置來載入lib。如果題主使用了pip進行安裝,一般這些pip都是安排好,不需要額外的手動設置。如果萬一ipython找不到的話,就可以通過修改PYTHONPATH的方法讀取rqalpha module。

第二步是明白當我們在跑上面的命令時,究竟發生了什麼。以下用Linux為例,

shawn@shawn-VirtualBox:~/.rqalpha$ which rqalpha
/home/shawn/anaconda/bin/rqalpha
shawn@shawn-VirtualBox:~/.rqalpha$ cat /home/shawn/anaconda/bin/rqalpha
#!/home/shawn/anaconda/bin/python

# -*- coding: utf-8 -*-
import re
import sys

from rqalpha.__main__ import entry_point

if __name__ == "__main__":
sys.argv[0] = re.sub(r"(-script.pyw|.exe)?$", "", sys.argv[0])
sys.exit(entry_point())
shawn@shawn-VirtualBox:~/.rqalpha$

我們可以看到rqalpha其實就是一個python wrapper文件,把真正的參數和命令重新導向到rqalpha/__main__.py里的entry_point method。

打開rqalpha/__main__.py,我們能看到wiki上支持的指令在這裡都能找到,run, update_bundle, plot等等。不過那些method都帶有function decorator with click library,我沒有找到直接call這些函數的方法,所以我複製黏貼了run method, 把新的函數命名為run_direct,並且除去了那些function decorator,如下

def run_direct(strategy_file, start_date, end_date, output_file, plot, data_bundle_path, init_cash, progress):
"""run strategy from file
"""
if not os.path.exists(data_bundle_path):
print_("data bundle not found. Run `%s update_bundle` to download data bundle." % sys.argv[0])
return

with codecs.open(strategy_file, encoding="utf-8") as f:
source_code = f.read()

results_df = run_strategy(source_code, strategy_file, start_date, end_date,
init_cash, data_bundle_path, progress)

if output_file is not None:
results_df.to_pickle(output_file)

if plot:
show_draw_result(strategy_file, results_df)

做完這些之後,打開ipython notebook,就可以用以下的code跑示例指令了。

from datetime import datetime
from rqalpha.__main__ import run_direct
strategy_file = r"/home/shawn/dev/workspace/rqalpha/rqalpha/examples/buy_and_hold.py"
start_date = datetime(2014, 1, 1)
end_date = datetime(2016, 1, 1)
output_file = r"/home/shawn/dev/workspace/rqalpha_data/result.pkl"
plot = True
data_bundle_path = r"/home/shawn/.rqalpha"
init_cash = 100000
progress = True
res = run_direct(strategy_file, start_date, end_date, output_file, plot, data_bundle_path, init_cash, progress)

示例圖如下:

運用類似的邏輯和方法,你也可以直接運行rqalpha里其他的函數(在確保有合適的初始化的前提下)。如果一個函數沒有wrap在click decorator里的話,也不需要額外的複製一個同樣的函數並去除decorator了。

@王克勤 要不要我去ricequant也發一份,給我個置頂呀[chuckle]


RQAlpha 迭代速度比較快,所以直接在這裡黏貼的答案可能隨著迭代更新,就不再試用了,比如 @Shawn Gu 童鞋的答案。

建議直接查看 安裝指南 - rqalpha 2.0.x 文檔 來進行環境的搭建。當然,也有其他關於如何使用和擴展相關的信息。


如果不是為了構建自己的研究系統,不建議本地調試,很多api不全,初學者建議先去官網在線的去學習研究。


題主是否想直接使用 rqalpha 的數據,貌似沒有現成的?

閑著沒事分析了下 rqalpha 的代碼,自己包裝了下可以直接使用它的數據。

源碼在這裡: https://github.com/SixQuant/rqalpha-data 歡迎提問題以便改進它。

當然更歡迎給我加個 Star,效果如下:

另外,順便回答一下題主的問題-在 Jupyter 里直接用rqalpha回測:

  1. 用 %reload_ext rqalpha 命令載入 %%rqalpha命令
  2. 用 %%rqalpha 命令運行回測


提示「 global name "run_strategy" is not defined」


推薦閱讀:

如何制定python學習計劃?
如何閱讀goagent的代碼?
Python中Turtle模塊的基本指令都有哪些?
如何在同一程序中調用分別用python 2和python 3寫的多個第三方模塊?
為什麼C++讀取文件會比Python慢?

TAG:Python | Python入門 | 量化交易 |