DevelStudio使用指南

本章将为您介绍如何基于DevelStudio进行策略和插件的开发以及策略仿真

Previous page Next page

DevelStudio介绍

DevelStudio是一个整合了策略研发工具PyThunder,以及策略开发相关的常见Python/C++库、网页版IDE、网页版策略仿真平台的集成开发环境

  • PyThunder:基于Python的策略仿真工具箱,可以对自定义的Native策略Remote策略进行历史数据仿真验证。它提供一系列的原语接口,您可以根据实际情况构建仿真流程。
  • ThirdPart LibrariesDevelStudio已经集成了matplotlib、pandas等常见科学计算和图标绘制第三方库
  • VSCode:网页版集成开发环境,您可以在任何地方使用任何设备随时登录进行开发
  • Jupyter:交互式Python开发环境,便于创建和共享程序文档,支持实时代码,数学方程,可视化和 Markdown。 方便您进行Tick数据清理和转换,数值模拟,统计建模,策略仿真等

环境准备

DevelStudio可以运行在任何Linux发行版中,通过Docker进行部署,需要安装并启动Docker。 这里我们以Ubuntu为例:

$ sudo apt-get install docker.io
$ sudo systemctl start docker

然后我们进入DevelStudio下载页面,下载DevelStudio最新的镜像并载入。

$ wget "http://images.thunder-trader.com/1.81/develstudio.1.81.docker.tar.gz"
$ sudo docker load < develstudio.1.81.docker.tar.gz

通过docker images命令查看您当前所有的镜像,列表中存在thundertrader/develstudio并且为预期的版本,则代表镜像安装成功

$ sudo docker images
REPOSITORY                 TAG       IMAGE ID       CREATED        SIZE
thundertrader/develstudio  1.81      159d9c446ae2   24 hours ago   470MB

启动DevelStudio

我们通过下述命令启动DevelStudio容器:

$ sudo docker --privileged -d run -p ${Your VSCode Port}:80 -p ${Your Jupyter Port}:81 -v ${Your Project directory}:${Project directory in docker container} thundertrader/develstudio:1.81

上述命令中涉及到的参数:

  • --privileged:开启管理员模式
  • ${Your VSCode Port}:您登陆VSCode的端口,可以是任意可用的自定义端口,例如8080。当您在浏览器中登陆VSCode时需要使用该端口,例如http://127.0.0.1:8080
  • ${Your Jupyter Port}:您登陆Jupyter的端口,可以是任意可用的自定义端口,例如8181/当您在浏览器中登陆Juputer时需要使用该端口,例如http://127.0.0.1:8081
  • ${Your Project directory}:您的项目空间,可以是您磁盘上的任何一个目录,上述命令会将该目录映射到Docker容易内部的${Project directory in docker container}。注意该目录必须是完整的Linux路径,例如/home/user_a/cpp_project_a,使用相对路径会导致容器启动失败。
  • ${Project directory in docker container}:您的项目目录被映射到容器中的该目录。您可以登录VSCode后通过该目录访问您的项目文件,可以是任意完整的Linux路径,比如/cpp_project_a_map,同样需要注意该目录必须是完整路径,使用相对路径会导致容器启动失败。
如果您对Docker比较熟悉,那将会很容易理解上述命令以及参数的含义。DevelStudio内部分别在80和81端口绑定了VSCode和Jupyter,您通过-p参数分别将这两个端口映射到了容器外部的真实端口。同样,-v参数实现了容易内外目录的映射。您可以通过访问Docker官方文档来了解更多内容。
DataCenter启动参数--privileged虽然是可选的,但是它对我们为您提供充分的售后服务和技术支持非常重要,建议您打开该参数从而使DataCenter获取管理员权限。DataCenter需要对/proc/sys/kernel/core_pattern文件进行必要的修正,从而当DataCenter发生故障时,coredump文件中的栈帧诊断信息可以被正确保存并上报给我们。当然如果您对此比较熟悉,也可以打开/thunder-crash目录进行自助故障排查。

上述命令中,您可以选择只打开VSCode端口,或者只打开Jupyter端口,亦或全部打开,这取决于您的使用场景。同样,您可以使用多个-v参数将您多个磁盘目录映射到Docker容器中,这样访问会更加便捷。

这里给出一个完整的例子:

$ sudo docker run --privileged -d -p 8080:80 -p 8181:81 -v /home/user_a/cpp_project_a:/cpp_project_a_map thundertrader/develstudio:1.81

通过上述的命令,您启动的DevelStudio容器分别在http://127.0.0.1:8080http://127.0.0.1:8081打开了VSCodeJuputer,并且通过/cpp_project_a_map可以访问宿主机的/home/user_a/cpp_project_a目录。

如果您完成了上述操作但是仍然无法登录VSCode或者Jupyter,可能是因为您的Linux服务器有存在防火墙安全配置阻止了您的访问请求。您可以在Q&A环节查看如何解除防火墙限制。

DevelStudio使用引导

使用VSCode网页版进行开发

您可以通过浏览器打开http://${Your id address}:${Your VSCode Port}来访问网页版本IDE进行策略、插件的开发与调试。比如在上面的例子中,打开http://127.0.0.1:8080即可看到IDE的登录界面。

默认系统密码是thunderpass,登录后可看到IDE的工作区界面。

../develstudio-vscode.png

如何修改默认的登录密码:
您可以在容器启动命令最后添加IDE登录密码,实现重新设置默认密码的目的,例如 sudo docker run --privileged -d -p 8080:80 -p 8181:81 -v /home/user_a/cpp_project_a:/cpp_project_a_map thundertrader/develstudio:1.81 mynewpassword 其中`mynewpasswrod`就是您的新密码。

我们在DevelStudo默认内置了thunder-devel开发接口定义以及一个示例策略strategy101:

  • /thunder-devel: ThunderTrader开发接口
  • /strategy101: 一个示例策略的实现

这里以strategy101策略为例展示如何编译策略:

# cd /strategy101
# mkdir build
# cd build
# cmake ..
# make -j2

如果上述命令全部都成功执行,您可以在build目录下看到编译好的策略strategy_strategy101.so

使用Jupyter进行交互式科学计算

您可以通过浏览器打开http://${Your id address}:${Your Jupyter Port}来访问Jupyter进行科学计算与策略仿真。比如在上面的例子中,打开http://127.0.0.1:8081即可看到jupyter操作界面。 我们可以通过File/New/Notebook新建工作区。

../develstudio-new-terminal.png

载入并查看历史行情数据

#!/usr/bin/python
# -*- coding: <encoding name> -*-

import pythunder.tickutils as ptu
import matplotlib.pyplot as plt

ticks = ptu.load_from_data_center("sfit.future.ag2502", "20241201", "20241215", "http://192.168.3.44:90")
plt.plot([t.last_price for t in ticks])

上述代码我们从数据中心http://192.168.3.44:90加载合约sfit.future.ag2502从20241201到20241215的行情数据,并绘制last_price价格曲线。

../develstudio-tickplot.png

对策略进行仿真交易

#!/usr/bin/python
# -*- coding: <encoding name> -*-
import pythunder.simulator as sim

tick_config = (["sfit.future.ag2502", "sfit.future.ag2503"], ("20241224", "20241224"))
simulator = sim.Simulator("/strategy101/build/strategy_strategy101.so", tick_config, "http://192.168.3.44:90")
result = simulator.simulate()
res.show_metric({"size":(40, 15), "dpi": 200})

可以看到我们生成的策略Metrics。

../develstudio-strategy-metric-plot.png

您可以在/strategy101/simulate.ipynb中看到完整的实例。

使用Terminal

我们可以通过File/New/Terminal新建Terminal。

../develstudio-new-terminal.png

Jupyter Notebook使用/bin/sh作为默认Terminal,我们可以通过bash命令,打开/usr/bin/bash作为我们的Terminal。

../develstudio-using-terminal.png

PyThunder使用指南

Tick数据处理

下载pythunder-tickutils.ipynb

引入pythunder.tickutils

import pythunder.tickutils as ptu

__DATA_CENTER_ = "http://192.168.3.44:90"

通过tickutils.load_from_data_center函数可以从数据中心(DataCenter)载入我们录制的历史行情数据,至少需要4个参数,第5个参数是可选的

  • 参数1:合约名字。可以是一个字符串,也可以是一个list。当取值为字符串是该字符串必须代表一个合约名称,如果是list则其中每一个元素都需要是字符串并且取值为一个合约名字。例如”sfit.future.ag2501”或者[“sfit.future.ag2501”, “sfit.future.ag2501”]。当取值为list时,会同时载入多个合约并将数据进行合并,同时会设置tick的slot取值,该值与合约名称在list中出现的位置保持一致。
  • 参数2:起始时间,格式为YYYYMMDD
  • 参数3:结束时间(包含),格式为YYYYMMDD
  • 参数4:DataCenter地址
  • 参数5:tick缓存目录,默认为/tmp。该参数是可选的

载入单个合约

ag2501_ticks = ptu.load_from_data_center("sfit.future.ag2501", "20241226", "20241227", __DATA_CENTER_)
print(len(ag2501_ticks))

50126

载入多个合约

ag2501_ag2502_ticks = ptu.load_from_data_center(["sfit.future.ag2501","sfit.future.ag2502"], "20241226", "20241227", __DATA_CENTER_)
print(len(ag2501_ag2502_ticks))

182842

通过save_to_file函数可以将数据存储到指定的文件

ptu.save_to_file(ag2501_ag2502_ticks, "/root/ag2501_ag2501.data")

通过load_from_file可以读取磁盘上存储的tick文件

ticks = ptu.load_from_file("/root/ag2501_ag2501.data")
print(len(ticks))

182842

通过align函数生成多个时间戳对齐的tick序列

tick_serials = ptu.align(ag2501_ag2502_ticks)
print(len(tick_serials))

2

在一个坐标系中同时绘制多条序列

import matplotlib.pyplot as plt
plt.plot([t.last_price for t in tick_serials[0]])
plt.plot([t.last_price for t in tick_serials[1]])

../develstudio-plot-multi-serials.png