
这篇教程解决一个问题:量化研究的代码、数据、环境散落在多台电脑上,换台设备就没法干活。跟着做完,你会得到一个跑在云服务器上的 JupyterLab,浏览器打开就能写策略,公司电脑、家里 iPad、甚至手机都是同一个环境,数据一份、环境一份、随时续上。
如您需求,可以到腾讯官网购买体验:
腾讯云国内官网云服务器大促活动: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
事情是这样的。
上周末我在外面吃饭,等位的时候突然想到一个策略思路——用 20 日波动率过滤均线信号。当时手边只有手机,只能把想法记在备忘录里。等晚上回到家打开电脑,那股劲儿已经过去了,而且这个思路需要翻历史数据验证,我本地那台电脑里存的行情数据还停留在上个月。
然后我就想起来,群里一个做量化的老哥说过一句话:"我的研究环境在云上,人在哪,环境就在哪。"
说实话我一开始是怀疑的。JupyterLab 那玩意儿我在本地用得好好的,搬到云服务器上图啥?浏览器里跑 notebook 不卡吗?数据放云上安全吗?
但那天晚上的憋屈劲儿让我决定试试。反正腾讯云轻量应用服务器一天不到一块钱,试错了也不心疼。
结果——
现在我写文章这会儿,人在咖啡馆,用的是一台五年前的旧 MacBook Air,打开浏览器就在跑回测,数据是昨天收盘后自动更新的。本地这台电脑里连 Python 都没装。
先说我之前的工作方式,估计很多人和我一样:
研究在公司电脑上写一半,拷回家里的台式机继续,数据两份还经常不同步。上周回测用的数据和这周的对不上,同一个策略跑出两个结果,查了半天发现是数据版本不一样。
最崩溃的一次:我重装了一次系统,Anaconda 环境没备份,pandas、numpy、talib 一堆库重装,talib 编译报错搞了一个多小时。装完发现有个自己写的因子计算脚本忘了备份,没了。那种捶胸顿足的感觉,懂的都懂。
本地 Jupyter 的三个死结:
把 JupyterLab 搬到云服务器上,这三个问题一次全解决。
周日晚上 8 点,我开始动手。腾讯云轻量应用服务器,选的 2 核 4G(回测吃内存,建议别省这一档),Ubuntu 22.04 系统。
SSH 连上去,整个安装就这几步:
sudo apt update && sudo apt install -y python3-pip python3-venv
python3 -m venv ~/quant-env
source ~/quant-env/bin/activate
pip install jupyterlab pandas numpy matplotlib tushare akshare装完之后生成配置文件,设置密码:
jupyter lab --generate-config
jupyter lab password # 输入两次密码,会写入配置文件然后改一下配置,允许远程访问:
vim ~/.jupyter/jupyter_lab_config.py改这两行:
c.ServerApp.ip = '0.0.0.0' # 允许外部访问
c.ServerApp.port = 8888 # 端口
c.ServerApp.open_browser = False # 服务器上没有浏览器,别尝试打开最后启动:
jupyter lab然后去腾讯云控制台,在轻量服务器的防火墙里放行 8888 端口。浏览器输入 http://你的服务器IP:8888,输密码——
熟悉的 JupyterLab 界面出现了。
我看了下时间:8 点 25 分。从零开始到能用,25 分钟,中间还包括我泡了杯茶。
对比一下当初我在本地配环境的经历:talib 编译报错查 StackOverflow、镜像源换来换去、版本冲突降级重装……每次都按小时计算。这次在云服务器上,Ubuntu 的纯净环境反而一路绿灯,一个报错都没有。
部署完第二天是周一,我在公司午休的时候,用手机浏览器打开了 JupyterLab(界面在手机上有点小,但看个结果、跑个 cell 完全够用),把周六想到的那个波动率过滤策略写了个初版。
晚上回家,用 iPad 接着改。数据就是服务器上那一份,环境就是那一个,代码改到哪一行都是连续的,没有任何"同步"的概念,因为压根只有一份。
周三晚上回测跑完了,年化 23%,回撤 9%,比我原来的裸均线策略好了不少。
那感觉就像——以前我的研究环境是一间必须亲自到场的实验室,现在它变成了一片跟着人走的云。人在哪,浏览器在哪,实验室就在哪。
量化研究这个活儿,灵感来了能不能立刻验证,直接决定了很多策略的生死。以前从"想到"到"验证"最快也要等回家开电脑,现在是想到就打开浏览器。
用了一阵我发现一个更香的点:长回测可以扔在服务器上跑。
本地跑回测有个问题——电脑不能关,风扇呼呼转一晚上,还占着机器没法干别的。现在我在云服务器上跑一个遍历 300 个参数组合的回测,笔记本合盖走人,第二天早上打开浏览器看结果。
不过这里要注意:直接 jupyter lab 启动的话,SSH 一断服务就停了。我一开始就是这么裸跑的,后来换成 systemd 托管(对,跟我实盘程序同款方案):
sudo vim /etc/systemd/system/jupyter.service[Unit]
Description=JupyterLab
After=network-online.target
[Service]
Type=simple
User=ubuntu
WorkingDirectory=/home/ubuntu/notebooks
ExecStart=/home/ubuntu/quant-env/bin/jupyter lab --config=/home/ubuntu/.jupyter/jupyter_lab_config.py
Restart=always
RestartSec=5
[Install]
WantedBy=multi-user.targetsudo systemctl daemon-reload
sudo systemctl enable --now jupyter从此 JupyterLab 在服务器上 7×24 小时在线,服务器重启它自己也会回来。我的浏览器只是个"屏幕",随时打开随时关。
坑来了,这个必须说。
头一个礼拜,我一直是用 http://IP:8888 裸连的。直到有天晚上我看了一条关于 HTTP 明文传输的帖子,突然反应过来:我每次登录 JupyterLab 输入的密码,都是明文在网络上传的,中间经过的每个路由节点理论上都能看到。
而且 JupyterLab 一旦登录,就能在服务器上执行任意代码——这等于把服务器大门的钥匙用明信片寄出去。
当时后背有点凉,赶紧处理。方案有两个:
方案一:SSH 隧道(推荐,最简单)
不在防火墙开放 8888 端口,本地终端建立隧道:
ssh -L 8888:localhost:8888 ubuntu@你的服务器IP然后浏览器访问 http://localhost:8888。所有流量走 SSH 加密通道,安全,也不用折腾证书。缺点是手机上不太好使。
方案二:HTTPS + 反向代理
如果你有自己的域名,用 Nginx 反代加 Let's Encrypt 免费证书,JupyterLab 配置文件里指定证书路径,就能 https:// 访问。适合需要在手机/iPad 上用的场景。
我最后是两个都用:电脑上用 SSH 隧道,iPad 上用 HTTPS。
所以给跟着做的朋友一句忠告:千万别裸 HTTP 长期用,哪怕你觉得"我这小服务器没人盯上"。
环境上云之后,数据自然也要上云。我的做法:
~/data 目录,SQLite 或 Parquet 格式~/notebooks,每周打包备份一次到对象存储这样数据永远只有一份、永远是最新的。回测的复现性问题彻底解决——同一个 notebook 今天跑和下个月跑,只要数据没动,结果就一致。
2 核 4G 的配置跑这些绰绰有余。我实测加载 10 年全市场日线数据(大概 200 多万行)做因子计算,内存峰值吃到 2G 左右,稳的。
夸完了,说点实在的:
维度 | 本地 Jupyter | 云服务器 JupyterLab |
|---|---|---|
换电脑 | 重新配环境,按小时计 | 打开浏览器就行 |
重装系统 | 环境和代码可能全丢 | 毫发无损 |
数据版本 | 散落多台机器,对不上 | 永远只有一份 |
随时验证灵感 | 得等摸到电脑 | 手机/iPad 都能开 |
长回测 | 占着电脑,风扇起飞 | 扔云上跑,合盖走人 |
成本 | 电费+损耗 | 一天不到一块钱 |
用了一个多月,我的结论是:量化研究环境上云,是那种"回不去"的体验升级。就像用了网盘的人不会再回到 U 盘时代一样。
给不同朋友的建议:
放心冲,早搬早享受。
如您需求,可以到腾讯官网购买体验:
腾讯云国内官网云服务器大促活动: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:JupyterLab 部署在云服务器上安全吗?
关键看你怎么访问。裸 HTTP + 公网端口是不安全的,密码和代码都可能被窃听。正确做法是 SSH 隧道(ssh -L 8888:localhost:8888)或配置 HTTPS 证书,二选一即可。
Q:云服务器跑 JupyterLab 需要多大配置?
做量化研究建议 2 核 4G 起步。2G 内存加载全市场日线数据做因子计算会很紧张,4G 实测吃 2G 左右很稳。只是写写脚本、偶尔跑小数据的话 2G 也凑合。
Q:关掉浏览器后,正在跑的回测会中断吗?
不会。JupyterLab 的 kernel 跑在服务器上,浏览器只是显示界面。关掉浏览器、合上电脑,回测继续在云服务器上跑,下次打开浏览器接着看结果。
Q:怎么让 JupyterLab 开机自启动、崩溃自动恢复?
用 systemd 托管:创建一个 jupyter.service 文件,设置 Restart=always,然后 systemctl enable --now jupyter。具体配置见正文第四节。
Q:手机浏览器能写代码吗?
能打开、能看结果、能运行已有的 cell,但 JupyterLab 界面不是为触屏设计的,编辑代码体验很差。手机适合应急查看和触发运行,正经写策略还是用电脑或 iPad 加键盘。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。