😱 实时获取所有 A 股现在 + 过去的行情数据,可基于它来做量化交易的行情服务,也可以用来实时选股。 项目地址

行情数据来自:wow-stock-quotation

环境准备

由于插件的行情全部来自 python 脚本,故:

  • 请确保本地安装了 python3,并加入全局环境变量,即在命令行中输入如下内容:
1
2
// 命令正确执行且指向 python3
python
  • 安装 python 库 easyquotation
1
pip install easyquotation
  • 安装 python 库 BaoStock
1
pip install baostock

安装

1
npm install wow-stocks

示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
// const { update } = require('wow-stocks')
import { update } from 'wow-stocks'

async function start() {
const { get, watch } = await update({
length: 90, // 更新 90 个交易日所有股票的行情
})
// 基于已更新的数据获取一次行情
const quotations = await get()
console.log(quotations)
// 基于已更新的数据监听实时行情
const stop = watch((quotations) => {
// 可以在这里实时选股啦
})
stop() // 停止监听
}

API

update

是的,插件目前有且仅有这一个入口 api,因为所有的操作都要基于它。毕竟数据都没有呢,操作啥呢?

建议每天收盘后执行一次,这样它可以利用实时行情来快速增量更新所有数据。如果隔了一个交易日,就得执行较慢的全量更新了。

1
2
3
4
5
6
7
8
9
10
11
12
13
update({
length: 90, // 你需要多少条交易日的数据
forceSkip: true, // 如果你确定你不需要更新数据,可以将此项设置为 true 来跳过更新检测。默认:false
progressBar: false, // 是否需要显示更新进度。默认:true
codes: ['sh.600000', 'sh.000001'], // 如果你不需要所有 A 股数据,可以配置此项来自定义股票池
callback(info) {
// 可以在这里接收到更新进度
// info.value: 当前条
// info.total: 总条数
// info.code: 当前股票
// info.type: 更新类型(0:本地缓存;1:增量更新;2:全量更新)
},
})

该方法执行完毕后,返回一个 Promise,回调数据为如下两个函数:

get

基于已更新的数据获取一次行情

1
2
3
update({ length: 90 })
.then(({ get }) => get())
.then((data) => console.log(data))

执行完毕后,返回如下结果:

1
2
3
4
5
6
7
8
9
10
11
12
13
[
{
code: string // 股票代码
open: number[] // 该股票指定交易日的所有开盘价
high: number[] // 该股票指定交易日的所有最高价
low: number[] // 该股票指定交易日的所有最低价
close: number[] // 该股票指定交易日的所有收盘价
volume: number[] // 该股票指定交易日的所有成交量(单位:股)
amount: number[] // 该股票指定交易日的所有成交额(单位:人民币元)
turnover: number[] // 该股票指定交易日的所有换手率
},
...
]

watch

基于已更新的数据监听实时行情(每隔 1 秒请求一次实时行情

回调函数支持异步,即你可以传入一个 Promise 函数

1
2
3
4
5
6
7
update({ length: 90 }).then(({ watch }) => {
const stop = watch((data) => {
// data 同上面 get 返回的数据
// 选股,量化交易什么的就写在这里好了
})
// 调用 stop 可以终止监听
})

黄金搭档

wow-stock-calculator - 类似通达信函数的股票计算工具。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
import { ma, cross } from 'wow-stock-calculator'

update({ length: 90 }).then(({ watch }) => {
watch((stocks) => {
// 获取当前 5 日均线上穿 10 日均线的所有股票
console.log(
stocks.filter((stock) => {
const ma5 = ma(stock.close, 5)
const ma10 = ma(stock.close, 10)
const ma5CrossMa10 = cross(ma5, ma10)
return ma5CrossMa10[ma5CrossMa10.length - 1]
}),
)
})
})

再附上上面这段选股代码对应的通达信选股公式,欢迎用来验证结果

1
XG: CROSS(MA(C, 5), MA(C, 10));

好吧,看起来通达信的选股代码更简洁精炼啊。。。是的,大部分情况下推荐直接用通达信之类的股票软件来执行选股。

但是对于全量行情的实时预警,也就是实时选股,本插件比这些传统工具快一亿倍!如果你的选股公式写的够好,完全可以做到全市场股票秒级监控!当然了,甚至还可以搭配某些工具来实现自动交易

其他

关于 length

更新配置中的 length 并不能保证一定是你设置的固定长度,因为某些股票的交易数据可能一共就没有那么多。并且当日停盘的数据也不会被保存

进度条

本插件使用的命令行进度条工具是:cli-progress,不保证任何环境下都可以正常输出,如果发现没有出现进度条,请自行切换命令行环境

进度条的样子:

1
数据更新中 [====================================----] 89% 113秒 4341/4890 sh.603363(Full

行情下载

下载的行情文件会保存在当前运行目录下的 wow-stocks-db.json 文件中,不要随意删除它。

然后还有个问题是在更新过程中如果异常终止了,比如 ctrl + c。插件做了简单的监听,希望能够在发生异常的时候保存已下载的记录,但经测试很多命令行环境都无效,也调研过相关的工具,测试也都不太理想。如果你有好的方案,欢迎联系我,或贡献你的 PR


 评论