跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客我的书AI学习GitHub 精选镜像AI 生图工具UI配色美学关于
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
JavaScript大前端算法

React K 线图组件与股票数据 SDK 实现方案

一个基于 React 的 K 线图组件 kline-charts-react 及配套的股票数据 SDK stock-sdk。组件支持多周期切换、15 种技术指标计算、丰富的交互操作及主题切换。SDK 采用 TypeScript 实现,零依赖,支持浏览器和 Node.js 环境获取 A 股、港股、美股行情。通过 props 配置即可快速集成,支持自定义数据源,解决了前端直接获取股票数据的痛点。

灵魂摆渡发布于 2026/4/6更新于 2026/10/15115 浏览
React K 线图组件与股票数据 SDK 实现方案

一个 prop 画出专业 K 线图,数据获取和指标计算全自动。

为什么选择自研方案

现有方案难以满足需求。在一个 React 项目里加一个股票 K 线图,要能切周期、看指标、支持缩放拖拽。市面上现成方案要么年久失修,要么功能受限,且非 React 组件需自行封装。

因此开发了通用解决方案 kline-charts-react,MIT 开源。

GitHub | npm

K 线图效果

上手非常简单:

import { KLineChart } from 'kline-charts-react';
import 'kline-charts-react/style.css';

function App() {
  return <KLineChart symbol="sh600519" height={600} />;
}

传一个股票代码,组件会自动拉取数据、计算技术指标、渲染出完整的 K 线图。

主要功能

对标主流金融交互,主要功能包括:

周期全覆盖 —— 分时、五日分时、日 K、周 K、月 K,加上 1/5/15/30/60 分钟线,看长线看短线都行。

15 种技术指标 —— MA、BOLL、MACD、KDJ、RSI、WR、BIAS、CCI、ATR、OBV、ROC、DMI、SAR、KC,全部前端实时计算。主图副图都有。

丰富的交互 —— 鼠标滚轮缩放、拖拽平移、十字准线、数据 Tooltip、缩放历史撤销/重做、全屏模式、导出图片。

主题切换 —— 内置明暗两套主题,也接受自定义颜色对象。

复权处理 —— 前复权、后复权、不复权,默认前复权。

数据层设计 —— stock-sdk

前端领域获取股票行情一直是个空白地带。为了填这个空缺,开发了一个专门面向前端的股票数据 SDK:stock-sdk。

定位:让 JavaScript/TypeScript 开发者用最简单的方式获取股票行情和 K 线数据。

关键特性:

  • 纯 TS 实现,零外部依赖,压缩后体积不到 20KB
  • 浏览器和 Node.js 通吃,ESM/CJS 双格式
  • 支持 A 股、港股、美股和公募基金,实时行情、历史 K 线都有
  • 内置常用技术指标,MA、MACD、BOLL、KDJ、RSI 等开箱可用
  • TypeScript 类型齐全,IDE 里有完整的智能提示
  • 示例代码:

    import { StockSDK } from 'stock-sdk';
    const sdk = new StockSDK();
    
    // 批量获取实时行情
    const quotes = await sdk.getSimpleQuotes(['sh600519', 'sz000858']);
    quotes.forEach(q => {
      console.log(`${q.name}: ${q.price} (${q.changePercent}%)`);
    });
    
    // 获取前复权日 K 线
    const kline = await sdk.getKline('sh600519', { period: 'daily', adjust: 'qfq' });
    

    kline-charts-react 的数据层就是 stock-sdk 驱动的。全程浏览器端完成,不需要自己搭后端。

    完整文档:stock-sdk.linkdiary.cn

    如果自有行情接口,组件也留了口子,支持自定义数据源替换。

    渲染层选择 ECharts

    图表渲染用的 ECharts。选它的原因比较朴素:成熟、稳定、社区大、文档全。K 线图(Candlestick)、折线图、柱状图、散点图这几种类型 ECharts 都有原生支持。

    体积方面做了按需注册,只引入了实际用到的 chart 和 component。echarts 作为 peerDependency 处理,不会打进组件包里。组件自身构建产物 77KB(gzip 约 19KB)。

    设计细节

    1. 简单场景简单用

    默认配置下只需要传 symbol,开箱即用:

    <KLineChart symbol="sh600519" />
    

    需要精细控制的时候,全部通过 props 配:

    <KLineChart 
      symbol="sh600519" 
      period="weekly" 
      adjust="qfq" 
      theme="dark" 
      indicators={['ma', 'volume', 'kdj', 'rsi']} 
      indicatorOptions={{ ma: { periods: [5, 10, 20, 60] }, }} 
      maxSubPanes={3} 
      height={700} 
    />
    
    2. 数据源替换

    内置数据源不满足需求时,传一个 dataProvider 就能把数据获取逻辑换成自己的:

    const myProvider = {
      getKline: async (params, signal) => {
        const res = await fetch(`/api/kline?symbol=${params.symbol}&period=${params.period}`, { signal });
        return res.json();
      },
      getTimeline: async (params, signal) => {
        const res = await fetch(`/api/timeline?symbol=${params.symbol}`, { signal });
        return res.json();
      },
    };
    
    <KLineChart symbol="sh600519" dataProvider={myProvider} />
    

    K 线数据格式就是标准的 OHLCV(date, open, close, high, low, volume, amount),分时数据是 time, price, volume, amount, avgPrice。

    3. Ref 方法

    组件对外暴露了 ref,方便在组件外部做程序化控制:

    const chartRef = useRef<KLineChartRef>(null);
    chartRef.current?.refresh(); // 刷新
    chartRef.current?.exportImage('png'); // 导出图片
    chartRef.current?.setPeriod('weekly'); // 切换周期
    chartRef.current?.getEchartsInstance(); // 获取 ECharts 实例
    
    4. 分时自动轮询

    看分时的时候一般需要持续刷新数据。组件内置了定时轮询,还能设定仅在开盘时间段内刷新:

    <KLineChart 
      symbol="sh600519" 
      period="timeline" 
      autoRefresh={{ intervalMs: 5000, onlyTradingTime: true }} 
    />
    

    安装方式

    yarn add kline-charts-react
    # 还需要安装 peer dependencies
    yarn add react react-dom echarts
    

    echarts 是 peerDependency 而不是 dependency,所以如果项目中已经装了 echarts,不会出现两份 echarts 的情况。

    已知局限

    提前说明几个还没解决的问题:

    • 移动端触控:桌面端的交互打磨得比较细了,但移动端的捏合缩放、双指操作还没有专门处理
    • 导出图片不完整:左上角的指标数值是 React DOM 渲染的,不在 ECharts Canvas 里,所以导出图片不会包含这部分
    • 没有 WebSocket:实时数据目前只能通过轮询,后续考虑接入 WebSocket 推送

    目录

    1. 为什么选择自研方案
    2. 主要功能
    3. 数据层设计 —— stock-sdk
    4. 渲染层选择 ECharts
    5. 设计细节
    6. 1. 简单场景简单用
    7. 2. 数据源替换
    8. 3. Ref 方法
    9. 4. 分时自动轮询
    10. 安装方式
    11. 还需要安装 peer dependencies
    12. 已知局限

    更多推荐文章

    查看全部
    • 【VSCode Copilot登录失败终极指南】:9大常见问题与高效解决方案
    • AI 艺术二维码制作教程:使用 Stable Diffusion 生成可扫描创意图像
    • C++ 内存管理进阶:从裸指针到智能指针
    • Python 数据可视化入门教程
    • Claude Code vs GitHub Copilot CLI 深度评测
    • C++ 红黑树实现详解:规则、结构与插入查找验证
    • Windows 环境部署 OpenClaw 并接入飞书机器人实战
    • Pi0 机器人大模型昇腾 A2 平台部署与性能测评
    • C++ 查找字符串中第一个只出现一次的字符
    • Java Web 开发入门:基础概念、环境搭建与 Servlet/JSP 详解
    • 前端错误处理:try/catch 与 Promise 的正确姿势
    • 2025 年十大工业大模型技术盘点与展望
    • 关于人工智能与人类边界:一场深度哲学对话
    • Go Web 开发核心理论与实战指南
    • C++ STL vector 容器底层实现详解
    • 循环神经网络(RNN)与序列数据处理实战
    • 从 SEO 到 GEO:315 晚会曝光的 AI 投毒黑产及技术防御
    • LangChain 核心概念:Chain 与 LCEL 实战解析
    • VMware 安装配置 Ubuntu 24.04 LTS 实战指南
    • 宇树 G1 机器人 ROS1 二次开发:基于 FAST-LIO 的建图与 RViz 配置

    相关免费在线工具

    • 加密/解密文本

      使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online

    • Gemini 图片去水印

      基于开源反向 Alpha 混合算法去除 Gemini/Nano Banana 图片水印,支持批量处理与下载。 在线工具,Gemini 图片去水印在线工具,online

    • Keycode 信息

      查找任何按下的键的javascript键代码、代码、位置和修饰符。 在线工具,Keycode 信息在线工具,online

    • Escape 与 Native 编解码

      JavaScript 字符串转义/反转义;Java 风格 \uXXXX(Native2Ascii)编码与解码。 在线工具,Escape 与 Native 编解码在线工具,online

    • JavaScript / HTML 格式化

      使用 Prettier 在浏览器内格式化 JavaScript 或 HTML 片段。 在线工具,JavaScript / HTML 格式化在线工具,online

    • JavaScript 压缩与混淆

      Terser 压缩、变量名混淆,或 javascript-obfuscator 高强度混淆(体积会增大)。 在线工具,JavaScript 压缩与混淆在线工具,online