
我是一个从聚宽平台起步的个人量化玩家,A 股策略为主,在平台上写了两年策略,今年把整套研究和实盘链路搬到了自己的云服务器上。
这篇教程帮你解决的问题:聚宽/米筐上写好的策略,能不能脱离平台的在线环境,在自己服务器上跑? 答案是能——用官方的数据 SDK(聚宽 jqdatasdk、米筐 rqdatac)在自己机器上取数,策略逻辑本地运行。跟着做完,你会得到一套"数据从平台来、策略在自己服务器跑"的本地化方案,回测想跑多久跑多久,没人管你的内存和时长。
先说清楚一个前提:平台的核心价值是数据和社区,策略搬出来不等于抛弃平台,而是把"算"这件事拿回自己手里。
先声明,我很感谢聚宽,我的量化启蒙就是在上面完成的,免费数据、在线回测、社区帖子,小白入门没有比这更友好的了。
但玩得越深,两个天花板越明显:
第一次被卡是去年底。我想做一个全市场 5000 多只股票、10 年日线的横截面因子回测,在线环境跑了 40 多分钟,内存超了,回测直接被杀掉。平台的在线回测有内存和时长限制,这我懂,平台要控制成本。但我的研究需求是真实的。
第二次是今年年初。我想把策略信号对接到自己的实盘提醒系统,在线环境不支持随便装第三方库,也不能 7×24 挂着我的自定义进程。
那段时间我的工作流特别拧巴:在聚宽网页上写策略→回测被杀→砍股票池砍年限→再跑→好不容易跑通了,想把每日信号导出来发到自己邮箱,还得绕好几道。有天晚上我盯着"内存超出限制"的红字提示,突然意识到自己像在别人的客厅里练举重——地方挺好,但举重点就有人来提醒你小心地板。
群里一个老哥点醒我:聚宽和米筐都有本地数据 SDK,数据授权跟着账号走,策略在哪跑是你自己的事。我一查,还真是。当晚就决定了:搞一台自己的服务器,把"算"搬回家。
我的本地化方案一句话概括:jqdatasdk/rqdatac 负责取数,本地数据库负责存,策略代码在我自己的服务器上跑。
服务器是腾讯云轻量应用服务器,2 核 4G 的 Ubuntu 实例(数据本地落库建议 4G 起步),一天不到一块钱的量级。架构长这样:
聚宽/米筐数据服务器
↓ (jqdatasdk / rqdatac 按授权取数)
我的云服务器:数据同步脚本 → Parquet/数据库本地存储
↓
回测引擎(本地,不限内存不限时)/ 每日信号脚本(crontab 定时)关键认知:SDK 取数有流量配额,所以绝不能每次回测都现拉数据,必须本地化存储,一次拉取、反复使用。 这是整套方案的核心思想。
上周六下午开始折腾。装聚宽 SDK 一行命令:
pip install jqdatasdk然后写了个测试脚本,验一下账号和数据通不通:
import jqdatasdk as jq
jq.auth('你的聚宽手机号', '你的密码')
df = jq.get_price('000001.XSHE', start_date='2024-01-01',
end_date='2024-12-31', frequency='daily')
print(df.tail())跑通的那一刻还是挺惊喜的——我在自己服务器上,拿到了和平台网页里一模一样的平安银行日线数据。米筐的 rqdatac 同理,pip install rqdatac 然后 rqdatac.init() 初始化授权,API 设计略有差异但思路一样。
对比之前在平台网页上的体验:点"运行回测"→排队→跑一半被杀→改小范围→再排队。现在本地脚本想跑多大跑多大,那个 40 分钟被杀的全市场回测,在我 2 核 4G 的小服务器上跑了 50 多分钟,跑完了。看着终端里打印出完整结果的那一刻,感觉像是从合租房搬进了自己的房子。
这是最重要的一步,也是最体现"本地化"价值的一步。
我写了一个数据同步脚本,核心逻辑是增量更新:每张表记录最后更新日期,每次只拉新数据。股票日线库我用的 Parquet 文件按年分区存储(够用且简单),分钟线和财务数据用的 DuckDB。
# 伪代码示意核心逻辑
last_date = read_last_update_date('daily_prices')
new_data = jq.get_price(stock_list, start_date=last_date,
end_date=today, frequency='daily')
append_to_parquet(new_data, partition_by='year')
write_last_update_date('daily_prices', today)如您需求,可以到腾讯官网购买体验:
腾讯云国内官网云服务器大促活动:https://cloud.tencent.com/act/pro/featured-202607?fromSource=gwzcw.17760458.17760458.17760458
腾讯云国际站云服务器促销活动:https://www.tencentcloud.com/act/pro/promo?fromSource=intl.17760459.17760459.17760459
然后 crontab 里挂一个任务,每个交易日收盘后自动同步:
30 16 * * 1-5 /home/ubuntu/data/venv/bin/python /home/ubuntu/data/sync_daily.py首次全量拉取我挑了个周末跑,10 年全市场日线拉了大半天(注意控制频率,别打满配额)。之后每天增量同步只要一两分钟。
落库之后回测完全走本地数据,不消耗任何 SDK 配额,回测一百遍都免费。这就是本地化部署的精髓:平台的配额只花在"新数据"上。
上线第二周,踩了个实打实的坑。
那天我同时开了三个终端调试策略,每个脚本启动都会 jq.auth() 登录一次。开到第四个脚本的时候,所有脚本报错了——提示大概是"登录连接数超出限制"。正在跑的每日同步任务也被牵连断掉了。
查了一下才明白:jqdatasdk 的账号同时在线的连接数有限制(同一账号多处登录会互相挤掉)。我那几个脚本各自 auth,等于自己把自己踢下线了。
解决方案也成熟:把数据访问收敛成一个单一的数据服务进程——我写了一个常驻的 data_server.py,启动时 auth 一次,其他所有策略脚本不直接连 SDK,而是从本地数据库读数,或者通过本地接口向 data_server 要数据。SDK 连接从"N 个"收敛到"1 个",问题根治。
所以给大家的建议:SDK 本地化部署,一定要控制 auth 的次数和并发。把"取数"和"用数"分开,取数走单一进程,用数走本地库。这个架构上的小心思,能帮你避开最大的坑。
跑了小半年,说几个真实的变化:
诚实挑刺:
但这些是自由的价格,我付得起。
维度 | 旧方式(平台在线回测) | 新方式(云服务器 + SDK 本地化) |
|---|---|---|
回测规模 | 内存/时长受限,大回测被杀 | 本地跑,不限时不限内存 |
数据使用 | 每次回测在线取数 | 本地落库,回测零配额消耗 |
自定义库 | 装不了第三方库 | 想装什么装什么 |
定时信号 | 需手动或绕路导出 | crontab 自动跑 + 微信推送 |
代码管理 | 散落在平台项目里 | 本地 git 仓库,正规版本管理 |
成本 | 免费但受限 | 一天不到一块钱 + 数据授权费 |
一句话总结:平台负责数据,我的服务器负责算,各干各最擅长的事。
如果你也在聚宽/米筐上被内存限制、时长限制卡过,我的建议是:这套方案放心冲! 先用 SDK 把数据通道打通,再慢慢把策略搬过来,一周见效。
pip install jqdatasdk 和 jq.auth 跑通,在本地拿到第一份数据,后面的事自然会长出来。如您需求,可以到腾讯官网购买体验:
腾讯云国内官网云服务器大促活动:https://cloud.tencent.com/act/pro/featured-202607?fromSource=gwzcw.17760458.17760458.17760458
腾讯云国际站云服务器促销活动:https://www.tencentcloud.com/act/pro/promo?fromSource=intl.17760459.17760459.17760459
Q:聚宽策略能下载到自己的服务器上跑吗?
策略代码本来就是你自己写的,可以复制到任何地方运行。平台数据和回测环境不能"下载",但可以通过 jqdatasdk 在自己服务器上按账号授权取数,策略逻辑本地化执行,效果等同。
Q:jqdatasdk 是免费的吗?有使用限制吗?
聚宽账号有免费的数据调用额度,更大数据量需要购买数据授权。主要限制是流量配额和同时在线连接数,所以务必本地化存储数据、控制 SDK 登录并发,配额只花在增量新数据上。
Q:rqdatac 和 jqdatasdk 哪个好用?
都好用,数据质量和 API 设计各有拥趸。米筐 rqdatac 偏机构风格、因子数据丰富;聚宽 jqdatasdk 社区教程多、上手快。建议都装上试一周再定主用哪个,两者取数授权是独立的。
Q:本地化部署后,还能用聚宽的在线回测吗?
能,两者不冲突。推荐的工作流是:平台网页端快速验证想法、逛社区,重活(大回测、定时信号、实盘对接)在自己的云服务器上跑。
Q:跑 SDK 本地化方案,云服务器要什么配置?
建议 2 核 4G 起步。取数脚本不吃资源,但本地数据落库 + 大回测需要内存,2G 跑全市场回测会紧张。存储建议 60G 以上,10 年全市场日线 Parquet 大约占 10-20G。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。