不用爬虫,用 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,也就是量化交易,已经有些收获了。大家敬请期待......

相关推荐
一只会跑会跳会发疯的猴子23 分钟前
Thinkphp6使用token+Validate验证防止表单重复提交
服务器·前端·javascript
humors22131 分钟前
阿里云合集(不定期更新)
linux·运维·服务器·阿里云·云计算·ecs
国际云,接待34 分钟前
阿里云国际版香港轻量云服务器:CN2 GIA加持,征服海外网络的“速度与激情”!
linux·运维·服务器·科技·ubuntu·阿里云·云计算
阿里云大数据AI技术36 分钟前
企业级AI搜索解决方案:阿里云AI搜索开放平台
大数据·人工智能·深度学习·搜索引擎·阿里云·云计算
从零开始学习人工智能39 分钟前
阿里云API RAG全流程实战:从模型调用到多模态应用的完整技术链路
阿里云·云计算
GUIQU.43 分钟前
【node.js】核心进阶
node.js
Euphoria_11101 小时前
开发积累总结
前端
柒七爱吃麻辣烫1 小时前
npm修改镜像的教程,将npm镜像修改为国内地址增加下载速度
java·前端·npm·node.js·vue
想回家的一天1 小时前
本地环境下 前端突然端口占用问题 针对vscode
前端
小张快跑。1 小时前
【Vue3】(二)vue3语法详解:自定义泛型、生命周期、Hooks、路由
前端·vue.js·typescript