不用爬虫,用 FaaS 来获取股票期权数据
背景
最近在学习期权相关的交易,其中有个知识点:可以用合成多头来代替股票的持仓。好处是只需要大概 20% 左右的资金就可以实现与实际持仓相同的效果,缺点就是需要每个月在合约到期之前进行移仓。而在移仓的时候,不同月份的合约成本是不一样的,所以笔者需要一个小工具,能够一次性展示多月份合约的信息,并且计算一些指标。
好的,以上内容看不懂没关系。大家只要知道,我需要一次性获取「多月份期权合约」的数据就行,本质跟获取股票数据差别不大。
上图就是最终实现的小工具(网页),本文就来介绍一下如何实现。
正文
分析
首先,笔者的需求并非是高频的获取实时数据,只需要时不时的「看一下」就行。所以对于数据的实时性没有特别高的要求,那么就不需要使用 websocket 之类的复杂工具了,只需要主动用 fetch 获取一下就可以。
然后,数据从哪来?笔者发现,新浪财经、东方财富等财经网站上都有比较容易发现和阅读的数据接口,比如:
https://hq.sinajs.cn/list=sh000300
就是获取沪深300指数数据的接口。
再观察一下就会发现,https://hq.sinajs.cn/list=xxx
这个接口可以获取到几乎所有的信息,比如:
https://hq.sinajs.cn/list=nf_M0 # 豆粕期货数据
https://hq.sinajs.cn/?list=P_OP_m2311C3050,P_OP_m2311C3050_i # 豆粕期权m2311行权价3050的数据和信息
所以我们只需要 fetch https://hq.sinajs.cn/list=xxx
这个接口,然后拼参数就可以了。
但是!!!
如果直接在前端页面用 fetch 请求,直接就会报跨域错误。当然,这也是意料之中的,那么要如何解决呢?
想办法把 sina 的接口开放跨域,显然是不可能的,那么就只能尝试用服务器模拟请求了,也就是相当于做个转发。
代码实现
由于逻辑很简单,只需要后端做个转发,加几个参数即可,所以尽量就用 nodejs 原生的方法实现就好了,不用安装其他第三方依赖。
经过笔者的测试,只需要在 headers 里加入:
headers: {
Host: "hq.sinajs.cn",
Referer: "https://stock.finance.sina.com.cn/",
},
就可以了。那么代码就呼之欲出了:
特别说明:以下代码是根据 ChatGPT 给的初始代码改编的,真的提高效率。
const http = require("http"); // Import Node.js core module
const https = require("https");
const url = require("url");
const httpFetch = (options, type) =>
new Promise((resolve, reject) => {
(type === "https" ? https : http)
.get(options, (res) => {
let data = "";
res.on("data", (chunk) => {
data += chunk;
});
res.on("end", () => {
resolve(data);
});
})
.on("error", reject);
});
const server = http.createServer(async function (req, res) {
//create web server
const { query, pathname } = url.parse(req.url, true);
try {
await httpFetch(
{
hostname: "hq.sinajs.cn",
path: `/list=${query.query}`,
headers: {
Host: "hq.sinajs.cn",
Referer: "https://stock.finance.sina.com.cn/",
},
},
"https"
);
} catch (e) {
console.error("error", e);
res.end(e);
}
});
server.listen(8000, "127.0.0.1"); //6 - listen for any incoming requests
console.log("Node.js web server at port 8000 is running..");
本地调试运行一下。嗯~~~ 应该是没问题的。
部署
接下来,这个函数部署到哪里呢?有的同学可能会说,弄个云服务器不就行了。没错,但是云服务器贵啊。这里有个比较实惠的方案 —— 云函数。
为了支持下民族企业,笔者选了华为云的「函数工作流 FunctionGraph」,再加上「对象存储服务 OBS」用来部署静态网页。2 个服务都是按需付费,目前运行了 3 个多月了,每个月大概 1 块钱。是不是很便宜~~
华为云函数的部署有点忘记细节了,这里大概提一些当初趟过的小坑:
- 如需安装第三方包,一定要按照 说明文档 来,注意目录层级;
- 写完函数,记得配触发器,选择「API 网关」。最好给路径后面加上个
/api
,这样可以方便后续跟静态网页同域;
其他细节还是看官方文档吧,现在有点记不清了,如果有机会再把细节补充上。
总结
本文的目的主要有 2 个:
- 告诉大家如何获取股票、期权、期货等数据
- 告诉大家一个低成本的服务实现方式
后者是一个基础技能,可复用性比较强,大家可以多看看,多研究下。这是程序员必备技能。
另外预告一下,笔者最近在学习 QMT,也就是量化交易,已经有些收获了。大家敬请期待……
转载自:https://juejin.cn/post/7272543983447097405