likes
comments
collection
share

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

作者站长头像
站长
· 阅读数 33

背景

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

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

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

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

正文

分析

首先,笔者的需求并非是高频的获取实时数据,只需要时不时的「看一下」就行。所以对于数据的实时性没有特别高的要求,那么就不需要使用 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 块钱。是不是很便宜~~

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

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

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

总结

本文的目的主要有 2 个:

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

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

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

转载自:https://juejin.cn/post/7272543983447097405
评论
请登录