SuperAPI AI 工具集

financial-charts

数据与分析

查看项目

更新于 10-16 14:53

技能介绍

Financial Charts 是一个声明式的 TradingView 风格图表技能。用户无需编写任何图表代码,只需准备一个 JSON 配置规范(说明要显示哪些面板和系列)和一个 JSON 数据文件(系列数值),模板会用 TradingView 的 Lightweight Charts v5(通过 CDN)渲染它们。平台负责提供文件,并在 Workbench 中显示图表。

用途

用于从 OHLCV 数据渲染交互式价格图表,支持蜡烛图、指标叠加、交易标记以及成交量、RSI、MACD 等面板。

工作流程

  1. 获取数据。通过 anyfinancial 数据技能(或任务提供的其他来源)拉取 OHLCV。在 Python 中自行计算指标序列(见下方配方)。
  2. 将数据文件写入 /code/outputs/<slug>.json(如目录不存在则创建)。格式见下文。
  3. 将此技能目录中的模板复制到 /code/outputs/<slug>.html,并仅编辑 <script id="chart-spec" type="application/json"> 块中的 title、subtitle、dataUrl(必须为 ./<slug>.json)、panes、notes、asOf。不要改动文件中的其他任何内容。

示例命令:

mkdir -p /code/outputs cp ~/.skills/financial-charts/template.html /code/outputs/aapl-backtest.html

然后编辑其中的 chart-spec 块,并写入 aapl-backtest.json

  1. 在最终回复中按 workbench 约定声明输出:

<rebyte-output> aapl-backtest.html </rebyte-output>

只列出 .html 文件(JSON 由它按同目录获取)。

配置规范

{ "title": "AAPL — Momentum Strategy Backtest", "subtitle": "Daily bars, SMA(20) overlay, trade markers; volume and RSI(14) panes.", "dataUrl": "./aapl-backtest.json", "panes": [ { "stretch": 3, "series": [ { "type": "candlestick", "data": "ohlc", "title": "AAPL" }, { "type": "line", "data": "sma20", "title": "SMA 20" }, { "type": "markers", "data": "trades", "attachTo": "ohlc" } ] }, { "stretch": 1, "series": [ { "type": "histogram", "data": "volume", "title": "Volume" } ] }, { "stretch": 1, "series": [ { "type": "line", "data": "rsi", "title": "RSI 14", "color": "#7a5d94" } ] } ], "notes": ["Assumption lines shown under the chart."], "asOf": "2026-07-03" }

  • panes[0] 是主图;stretch 设置各面板的相对高度。
  • series.type 可选:candlestick | line | area | histogram | markers。
  • series.data 是数据 JSON 中的键。
  • markers 需要 attachTo:同一面板中某个系列的 data 键。
  • color 可选——模板带有协调的默认调色板,仅在需要特定含义(如基准灰色)时设置。
  • 典型布局:价格+SMA+标记 / 成交量 / RSI;策略对比基准为同一面板中的两条线系列;净值曲线为面积图并配一个回撤柱状图面板。

数据文件格式

一个 JSON 对象;每个键是一个按时间升序排列的系列数组,时间不得重复。time 为日线的 "YYYY-MM-DD",或日内数据的 UNIX 时间戳(秒)。

{ "ohlc": [ { "time": "2025-07-02", "open": 180.1, "high": 183.2, "low": 179.5, "close": 182.4 } ], "sma20": [ { "time": "2025-07-30", "value": 184.2 } ], "volume": [ { "time": "2025-07-02", "value": 52000000, "color": "#cdd9e3" } ], "rsi": [ { "time": "2025-07-22", "value": 61.3 } ], "trades": [ { "time": "2025-08-26", "position": "belowBar", "shape": "arrowUp", "color": "#1f7a5c", "text": "Buy @ 203.4" } ] }

  • 成交量约定:上涨日使用 #cdd9e3,下跌日使用 #e3cfcd。
  • 标记:position 为 belowBar/aboveBar,shape 为 arrowUp/arrowDown/circle/square;绿色 #1f7a5c 表示买入,红色 #b4443c 表示卖出。
  • 指标系列起始时间晚于价格(预热窗口)——这是正常的,省略缺失的前导行即可。

指标配方(pandas)

import pandas as pd df = pd.DataFrame(bars) # columns: time, open, high, low, close, volume

df["sma20"] = df["close"].rolling(20).mean() df["ema12"] = df["close"].ewm(span=12, adjust=False).mean()

RSI(14),Wilder 平滑

delta = df["close"].diff() gain = delta.clip(lower=0).ewm(alpha=1/14, adjust=False).mean() loss = (-delta.clip(upper=0)).ewm(alpha=1/14, adjust=False).mean() df["rsi14"] = 100 - 100 / (1 + gain / loss)

MACD(12,26,9):macd+signal 画两条线,hist 画柱状图面板

ema26 = df["close"].ewm(span=26, adjust=False).mean() df["macd"] = df["ema12"] - ema26 df["signal"] = df["macd"].ewm(span=9, adjust=False).mean() df["hist"] = df["macd"] - df["signal"]

布林带(20, 2):主面板中三条线系列

mid = df["close"].rolling(20).mean(); sd = df["close"].rolling(20).std() df["bb_up"], df["bb_lo"] = mid + 2 * sd, mid - 2 * sd

def series(df, col): # -> [{time, value}],丢弃 NaN 预热期 s = df[["time", col]].dropna() return [{"time": t, "value": round(v, 4)} for t, v in s.values]

更新图表

重新运行分析 = 重写 .json(并重新声明同一文件名)。HTML 模板保持不变;重新打开即可显示新数据。切勿将数据内联到 HTML 中。

适用场景与限制

适用于需要交互式价格图表、指标叠加、交易标记或多面板金融数据的场景。图表基于 TradingView Lightweight Charts v5 渲染,需要平台提供文件托管并在 Workbench 中显示。指标需用户自行计算并写入数据文件,模板本身不可修改数据以外的逻辑。关于收费、价格或平台兼容性的更多细节暂未提供。