stock-sdk
v1.2.2
Published
Tencent qt.gtimg.cn stock quote SDK - supports both browser and Node.js
Maintainers
Readme
Stock SDK
English | 中文
为 前端和 Node.js 设计的股票行情 SDK。
无需 Python、无需后端服务,直接在 浏览器或 Node.js 中获取 A 股 / 港股 / 美股 / 公募基金 的实时行情与 K 线数据。
✨ 零依赖 | 🌐 Browser + Node.js | 📦 <10KB | 🧠 完整 TypeScript 类型
Why stock-sdk?
如果你是前端工程师,可能遇到过这些问题:
- 股票行情工具大多是 Python 生态,前端难以直接使用
- 想做行情看板 / Demo,不想额外维护后端服务
- 财经接口返回格式混乱、编码复杂(GBK / 并发 / 批量)
- AkShare 很强,但并不适合浏览器或 Node.js 项目
stock-sdk 的目标很简单:
让前端工程师,用最熟悉的 JavaScript / TypeScript,优雅地获取股票行情数据。
使用场景
- 📊 股票行情看板(Web / Admin)
- 📈 数据可视化(ECharts / TradingView)
- 🎓 股票 / 金融课程 Demo
- 🧪 量化策略原型验证(JS / Node)
- 🕒 Node.js 定时抓取行情数据
特性
- ✅ 零依赖,轻量级(压缩后 < 10KB)
- ✅ 支持 浏览器 和 Node.js 18+ 双端运行
- ✅ 同时提供 ESM 和 CommonJS 两种模块格式
- ✅ 完整的 TypeScript 类型定义的单元测试覆盖
- ✅ A 股、港股、美股、公募基金实时行情
- ✅ 历史 K 线(日/周/月)、分钟 K 线(1/5/15/30/60 分钟)和当日分时走势数据
- ✅ 资金流向、盘口大单等扩展数据
- ✅ 获取全部 A 股代码列表(5000+ 只股票)和批量获取全市场行情(内置并发控制)
安装
npm install stock-sdk
# 或
yarn add stock-sdk
# 或
pnpm add stock-sdk快速开始(10 行 Demo)
import { StockSDK } from 'stock-sdk';
const sdk = new StockSDK();
const quotes = await sdk.getSimpleQuotes([
'sh000001',
'sz000858',
'sh600519',
]);
quotes.forEach(q => {
console.log(`${q.name}: ${q.price} (${q.changePercent}%)`);
});示例:全市场 A 股行情
前端直接一次性获取全市场 A 股行情(5000+股票),无需 Python 或后端服务。
const allQuotes = await sdk.getAllAShareQuotes({
batchSize: 300,
concurrency: 5,
onProgress: (completed, total) => {
console.log(`进度: ${completed}/${total}`);
},
});
console.log(`共获取 ${allQuotes.length} 只股票`);API 文档
实时行情
| 方法 | 说明 |
|------|------|
| getFullQuotes | A 股/指数全量行情 |
| getSimpleQuotes | A 股/指数简要行情 |
| getHKQuotes | 港股行情 |
| getUSQuotes | 美股行情 |
| getFundQuotes | 公募基金行情 |
K 线数据
| 方法 | 说明 |
|------|------|
| getHistoryKline | 历史 K 线(日/周/月) |
| getMinuteKline | 分钟 K 线(1/5/15/30/60 分钟) |
| getTodayTimeline | 当日分时走势 |
扩展数据
| 方法 | 说明 |
|------|------|
| getFundFlow | 资金流向 |
| getPanelLargeOrder | 盘口大单占比 |
批量查询
| 方法 | 说明 |
|------|------|
| getAShareCodeList | 获取全部 A 股代码 |
| getAllAShareQuotes | 获取全市场 A 股行情 |
| getAllQuotesByCodes | 批量获取指定股票行情 |
getFullQuotes(codes): Promise<FullQuote[]>
获取 A 股/指数全量行情数据。
参数
| 参数 | 类型 | 说明 |
|------|------|------|
| codes | string[] | 股票代码数组,如 ['sz000858', 'sh600519'] |
返回类型
interface FullQuote {
marketId: string; // 市场标识
name: string; // 名称
code: string; // 股票代码
price: number; // 最新价
prevClose: number; // 昨收
open: number; // 今开
high: number; // 最高
low: number; // 最低
volume: number; // 成交量(手)
amount: number; // 成交额(万)
change: number; // 涨跌额
changePercent: number; // 涨跌幅 %
bid: { price: number; volume: number }[]; // 买一~买五
ask: { price: number; volume: number }[]; // 卖一~卖五
turnoverRate: number | null; // 换手率 %
pe: number | null; // 市盈率(TTM)
pb: number | null; // 市净率
totalMarketCap: number | null; // 总市值(亿)
circulatingMarketCap: number | null; // 流通市值(亿)
volumeRatio: number | null; // 量比
limitUp: number | null; // 涨停价
limitDown: number | null; // 跌停价
// ... 更多字段见类型定义
}示例
const quotes = await sdk.getFullQuotes(['sz000858']);
console.log(quotes[0].name); // 五 粮 液
console.log(quotes[0].price); // 111.70
console.log(quotes[0].changePercent); // 2.35getSimpleQuotes(codes): Promise<SimpleQuote[]>
获取简要行情(股票/指数)。
参数
| 参数 | 类型 | 说明 |
|------|------|------|
| codes | string[] | 代码数组,如 ['sz000858', 'sh000001'] |
返回类型
interface SimpleQuote {
marketId: string;
name: string;
code: string;
price: number;
change: number;
changePercent: number;
volume: number;
amount: number;
marketCap: number | null;
marketType: string;
}示例
const quotes = await sdk.getSimpleQuotes(['sh000001']);
console.log(quotes[0].name); // 上证指数getHistoryKline(symbol, options?): Promise<HistoryKline[]>
获取 A 股历史 K 线(日/周/月),数据来源:东方财富。
参数
| 参数 | 类型 | 说明 |
|------|------|------|
| symbol | string | 股票代码,如 '000001' 或 'sz000001' |
| options.period | 'daily' \| 'weekly' \| 'monthly' | K 线周期,默认 'daily' |
| options.adjust | '' \| 'qfq' \| 'hfq' | 复权类型,默认 'hfq'(后复权) |
| options.startDate | string | 开始日期 YYYYMMDD |
| options.endDate | string | 结束日期 YYYYMMDD |
返回类型
interface HistoryKline {
date: string; // 日期 YYYY-MM-DD
code: string; // 股票代码
open: number | null; // 开盘价
close: number | null; // 收盘价
high: number | null; // 最高价
low: number | null; // 最低价
volume: number | null; // 成交量
amount: number | null; // 成交额
changePercent: number | null; // 涨跌幅 %
change: number | null; // 涨跌额
amplitude: number | null; // 振幅 %
turnoverRate: number | null; // 换手率 %
}示例
// 获取日线(默认后复权)
const dailyKlines = await sdk.getHistoryKline('000001');
// 获取周线,前复权,指定日期范围
const weeklyKlines = await sdk.getHistoryKline('sz000858', {
period: 'weekly',
adjust: 'qfq',
startDate: '20240101',
endDate: '20241231',
});getMinuteKline(symbol, options?): Promise<MinuteTimeline[] | MinuteKline[]>
获取 A 股分钟 K 线或分时数据,数据来源:东方财富。
注意:
period='1'分时数据仅返回近 5 个交易日数据。
参数
| 参数 | 类型 | 说明 |
|------|------|------|
| symbol | string | 股票代码,如 '000001' 或 'sz000001' |
| options.period | '1' \| '5' \| '15' \| '30' \| '60' | K 线周期,默认 '1'(分时) |
| options.adjust | '' \| 'qfq' \| 'hfq' | 复权类型(仅 5/15/30/60 有效),默认 'hfq' |
| options.startDate | string | 开始时间 YYYY-MM-DD HH:mm:ss |
| options.endDate | string | 结束时间 YYYY-MM-DD HH:mm:ss |
示例
// 获取分时数据
const timeline = await sdk.getMinuteKline('000001');
// 获取 5 分钟 K 线
const kline5m = await sdk.getMinuteKline('sz000858', { period: '5' });getTodayTimeline(code): Promise<TodayTimelineResponse>
获取当日分时走势数据,数据来源:腾讯财经。
注意:仅返回当日交易时段数据,成交量和成交额为累计值。
参数
| 参数 | 类型 | 说明 |
|------|------|------|
| code | string | 股票代码,如 'sz000001' |
返回类型
interface TodayTimelineResponse {
code: string; // 股票代码
date: string; // 交易日期 YYYYMMDD
data: TodayTimeline[]; // 分时数据列表
}
interface TodayTimeline {
time: string; // 时间 HH:mm
price: number; // 成交价
volume: number; // 累计成交量(股)
amount: number; // 累计成交额(元)
avgPrice: number; // 当日均价
}示例
const timeline = await sdk.getTodayTimeline('sz000001');
console.log(timeline.date); // '20241218'
console.log(timeline.data[0].avgPrice); // 当日均价getAShareCodeList(includeExchange?): Promise<string[]>
获取全部 A 股代码列表(沪市、深市、北交所 5000+ 只股票)。
参数
| 参数 | 类型 | 说明 |
|------|------|------|
| includeExchange | boolean | 是否包含交易所前缀,默认 true |
示例
// 包含交易所前缀
const codes = await sdk.getAShareCodeList();
// ['sh600000', 'sz000001', 'bj430047', ...]
// 不包含交易所前缀
const pureCodes = await sdk.getAShareCodeList(false);
// ['600000', '000001', '430047', ...]getAllAShareQuotes(options?): Promise<FullQuote[]>
获取全市场 A 股实时行情(5000+ 只股票),返回格式同 getFullQuotes。
⚠️ 如遇超时或报错,可尝试减小
batchSize(如设为100)。
参数
| 参数 | 类型 | 说明 |
|------|------|------|
| options.batchSize | number | 单次请求股票数量,默认 500 |
| options.concurrency | number | 最大并发数,默认 7 |
| options.onProgress | (completed, total) => void | 进度回调 |
示例
const allQuotes = await sdk.getAllAShareQuotes({
batchSize: 300,
concurrency: 3,
onProgress: (completed, total) => {
console.log(`进度: ${completed}/${total}`);
},
});
console.log(`共获取 ${allQuotes.length} 只股票`);getAllQuotesByCodes(codes, options?): Promise<FullQuote[]>
批量获取指定股票的全量行情,参数同 getAllAShareQuotes。
const quotes = await sdk.getAllQuotesByCodes(
['sz000858', 'sh600519', 'sh600000'],
{ batchSize: 100, concurrency: 2 }
);getFundFlow(codes): Promise<FundFlow[]>
获取资金流向数据。
参数
| 参数 | 类型 | 说明 |
|------|------|------|
| codes | string[] | 股票代码数组,如 ['sz000858'] |
返回类型
interface FundFlow {
code: string;
name: string;
mainInflow: number; // 主力流入
mainOutflow: number; // 主力流出
mainNet: number; // 主力净流入
mainNetRatio: number; // 主力净流入占比
retailInflow: number; // 散户流入
retailOutflow: number; // 散户流出
retailNet: number; // 散户净流入
retailNetRatio: number; // 散户净流入占比
totalFlow: number; // 总资金流
date: string;
}getPanelLargeOrder(codes): Promise<PanelLargeOrder[]>
获取盘口大单占比。
参数
| 参数 | 类型 | 说明 |
|------|------|------|
| codes | string[] | 股票代码数组,如 ['sz000858'] |
返回类型
interface PanelLargeOrder {
buyLargeRatio: number; // 买盘大单占比
buySmallRatio: number; // 买盘小单占比
sellLargeRatio: number; // 卖盘大单占比
sellSmallRatio: number; // 卖盘小单占比
}getHKQuotes(codes): Promise<HKQuote[]>
获取港股行情。
参数
| 参数 | 类型 | 说明 |
|------|------|------|
| codes | string[] | 港股代码数组,如 ['09988', '00700'] |
示例
const quotes = await sdk.getHKQuotes(['09988']);
console.log(quotes[0].name); // 阿里巴巴-WgetUSQuotes(codes): Promise<USQuote[]>
获取美股行情。
参数
| 参数 | 类型 | 说明 |
|------|------|------|
| codes | string[] | 美股代码数组,如 ['BABA', 'AAPL'] |
示例
const quotes = await sdk.getUSQuotes(['BABA', 'AAPL']);
console.log(quotes[0].code); // BABA.NgetFundQuotes(codes): Promise<FundQuote[]>
获取公募基金行情。
参数
| 参数 | 类型 | 说明 |
|------|------|------|
| codes | string[] | 基金代码数组,如 ['000001', '110011'] |
返回类型
interface FundQuote {
code: string;
name: string;
nav: number; // 最新单位净值
accNav: number; // 累计净值
change: number; // 当日涨跌额
navDate: string; // 净值日期
}batchRaw(params): Promise<{ key: string; fields: string[] }[]>
批量混合查询,返回原始解析结果。
参数
| 参数 | 类型 | 说明 |
|------|------|------|
| params | string | 逗号分隔的查询参数,如 'sz000858,s_sh000001' |
示例
const raw = await sdk.batchRaw('sz000858,s_sh000001');
console.log(raw[0].key); // sz000858
console.log(raw[0].fields); // ['51', '五 粮 液', '000858', ...]浏览器直接使用
SDK 使用原生 TextDecoder 解码 GBK 编码数据,无需额外 polyfill。
<script type="module">
import { StockSDK } from 'https://unpkg.com/stock-sdk/dist/index.js';
const sdk = new StockSDK();
const quotes = await sdk.getFullQuotes(['sz000858']);
console.log(quotes[0].name, quotes[0].price);
</script>开发
# 安装依赖
yarn install
# 运行测试
yarn test
# 查看覆盖率
yarn test --coverage
# 构建
yarn build
# 启动调试页面
yarn dev许可证
📦 NPM | 📖 GitHub | 🎮 在线演示 | 🐛 Issues
如果这个项目对你有帮助,欢迎 Star ⭐ 或提出 Issue 反馈。
