不用爬虫,用 FaaS 来获取股票期权数据

背景

最近在学习期权相关的交易,其中有个知识点:可以用合成多头来代替股票的持仓 。好处是只需要大概 20% 左右的资金就可以实现与实际持仓相同的效果,缺点就是需要每个月在合约到期之前进行移仓 。而在移仓的时候,不同月份的合约成本是不一样的,所以笔者需要一个小工具,能够一次性展示多月份合约的信息,并且计算一些指标

好的,以上内容看不懂没关系。大家只要知道,我需要一次性获取「多月份期权合约」的数据就行,本质跟获取股票数据差别不大。

上图就是最终实现的小工具(网页),本文就来介绍一下如何实现。

正文

分析

首先,笔者的需求并非是高频的获取实时数据,只需要时不时的「看一下」就行。所以对于数据的实时性没有特别高的要求,那么就不需要使用 websocket 之类的复杂工具了,只需要主动用 fetch 获取一下就可以。

然后,数据从哪来?笔者发现,新浪财经、东方财富等财经网站上都有比较容易发现和阅读的数据接口,比如:

https://hq.sinajs.cn/list=sh000300 就是获取沪深300指数数据的接口。

再观察一下就会发现,https://hq.sinajs.cn/list=xxx 这个接口可以获取到几乎所有的信息,比如:

bash 复制代码
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 里加入:

js 复制代码
headers: {
  Host: "hq.sinajs.cn",
  Referer: "https://stock.finance.sina.com.cn/",
},

就可以了。那么代码就呼之欲出了:

特别说明:以下代码是根据 ChatGPT 给的初始代码改编的,真的提高效率。

js 复制代码
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 块钱。是不是很便宜~~

华为云函数的部署有点忘记细节了,这里大概提一些当初趟过的小坑:

  1. 如需安装第三方包,一定要按照 说明文档 来,注意目录层级;
  2. 写完函数,记得配触发器,选择「API 网关」。最好给路径后面加上个/api,这样可以方便后续跟静态网页同域;

其他细节还是看官方文档吧,现在有点记不清了,如果有机会再把细节补充上。

总结

本文的目的主要有 2 个:

  1. 告诉大家如何获取股票、期权、期货等数据
  2. 告诉大家一个低成本的服务实现方式

后者是一个基础技能,可复用性比较强,大家可以多看看,多研究下。这是程序员必备技能。

另外预告一下,笔者最近在学习 QMT,也就是量化交易,已经有些收获了。大家敬请期待......

相关推荐
万少14 小时前
我是如何使用 Trae IDE 完成《流碧卡片》项目的完整记录
前端·后端·ai编程
9***Y4814 小时前
前端微服务
前端·微服务·架构
ByteCraze14 小时前
我整理的大文件上传方案设计
前端·javascript
wanhengidc14 小时前
云手机性能如何?
运维·服务器·科技·智能手机·云计算
前端小白۞14 小时前
vue2 md文件预览和下载
前端·javascript·vue.js
十里-14 小时前
为什么创建1x1的gif图片,和png 或者jpg图片有什么区别
前端
u***u68514 小时前
Vue云原生
前端·vue.js·云原生
OpenTiny社区15 小时前
TinyEngine 低代码实时协作揭秘:原理 +实操,看完直接用!
前端·vue.js·低代码
5***790015 小时前
Vue项目性能优化
前端·javascript·vue.js
天若有情67316 小时前
【c++】手撸C++ Promise:从零实现通用异步回调组件,支持链式调用+异常安全
开发语言·前端·javascript·c++·promise