问题描述
1、我们远程有一个对应的研究mysql数据库,请问如果我在线的策略调用这个数据库,如何连接这个数据库,是否有相关文档可以参考?
解决方案
您好!关于在JoinQuant(聚宽)在线策略中连接外部MySQL数据库的问题,以下是详细的解答与替代方案:
1. 在线策略是否支持直接连接外网MySQL?
结论是:不支持直接连接。
出于平台安全性和沙盒环境的隔离机制,聚宽的在线回测环境和模拟交易环境严格限制了对外部网络的任意访问(包括屏蔽了常见的数据库端口如3306)。此外,根据聚宽API文档的说明,涉及到IO(如网络连接、数据库连接)的对象是不能被序列化的,这会导致模拟盘在每日保存状态时发生崩溃。
因此,您无法在在线策略代码中直接使用 pymysql 或 sqlalchemy 等库去直连您的远程MySQL数据库。
2. 替代解决方案
虽然不能直连数据库,但您可以通过以下两种标准方案来使用您的外部研究数据:
方案一:通过“投资研究”模块与文件读取(适用于在线回测/模拟)
您可以将MySQL中的数据导出为 csv 或 json 文件,然后上传到聚宽的**投资研究(研究环境)**的根目录中。在策略代码中,使用聚宽提供的 read_file API 来读取这些数据。
操作步骤:
- 将远程MySQL数据导出为
my_data.csv。 - 在聚宽网页端,进入“投资研究”,将
my_data.csv上传至根目录。 - 在策略代码中读取并解析:
import pandas as pd
from six import BytesIO
def initialize(context):
# 读取研究环境中的csv文件
body = read_file("my_data.csv")
# 解析为DataFrame
g.my_data = pd.read_csv(BytesIO(body))
log.info("外部数据加载成功!")
注:如果数据需要定期更新,您可以编写一个本地脚本,每天定时从MySQL拉取数据并利用聚宽的相关接口(或手动)更新到研究环境中。
方案二:使用本地 JQData(推荐用于复杂数据库交互)
如果您必须实时、高频地与您的远程MySQL数据库进行交互,最完美的解决方案是脱离聚宽在线环境,在本地部署量化程序。
聚宽提供了 JQData (jqdatasdk),允许您在本地 Python 环境中获取聚宽的全部行情和财务数据。在本地环境中,您拥有完全的网络权限,可以自由连接任何外部数据库。
操作步骤:
- 在本地安装 JQData:
pip install jqdatasdk - 在本地安装 MySQL 驱动:
pip install pymysql sqlalchemy - 在本地代码中同时调用聚宽数据和您的MySQL数据:
from jqdatasdk import *
import pymysql
import pandas as pd
# 1. 登录聚宽获取数据
auth('您的聚宽账号', '您的聚宽密码')
price_data = get_price('000001.XSHE', start_date='2023-01-01', end_date='2023-10-01')
# 2. 连接您的远程MySQL数据库
conn = pymysql.connect(host='您的数据库IP', user='用户名', password='密码', database='库名')
# 3. 读取您的研究数据
my_research_data = pd.read_sql("SELECT * FROM my_table", conn)
# 4. 在本地结合两者进行策略回测或分析...
总结
如果您希望继续使用聚宽的在线回测引擎,请采用方案一(文件上传+read_file);如果您需要高度灵活的数据库交互,建议采用方案二(本地JQData+本地回测框架)。