金融チャート

ローソク足チャートと並べて使う、ダッシュボードやレポート向けのチャートです。どれも要素とオプションを受け取るクラスで、 要素に合わせてサイズを決め、チャートのダークテーマまたはライトテーマで描画します。多くはポインターに沿ってツールチップを表示します。

● デモ資産曲線とドローダウンブラウザー内で生成したシミュレーション市場データ

チャート一覧

クラス用途
BarChartカテゴリごとの値:資金の純流入、セッションごとの出来高、月次リターン。グループ化または積み上げ、縦向きまたは横向きで、ゼロから上下に伸びます。
DonutChart全体に占める内訳:資産配分、セクター別のエクスポージャー。innerRadius: 0 で円グラフになります。
ScatterChart項目ごとに 2 つの値:リスクとリターン、バリュエーションと成長率。点にサイズがあればバブルになります。
HistogramChart値の分布:日次リターン、トレードの結果。平均や VaR の位置に線を引けます。
CalendarChartカレンダー上に 1 日 1 つの値:日次リターン、損益、取引日誌。
MatrixChart行と列の組ごとに 1 つの値:相関、時間帯と曜日ごとの出来高。
CounterClockChart平均価格と平均出来高を足ごとに結んだ、銘柄の逆ウォッチ曲線。
SparklineChartウォッチリストの行や KPI タイルに置く小さなライン。
GaugeChart帯と照らし合わせて見る 1 つの値:センチメント、リスク、証拠金の使用率。
HeatmapChart変化率で色分けしたセル。グリッド、またはウェイト(時価総額)で大きさを決めたツリーマップ。grouped を指定するとセクターマップになります。
WaterfallChart始点から終点までの段階:損益の要因分解、キャッシュフロー。
DepthChartオーダーブックの買いと売りの累積。
EquityCurveChart口座の価値の推移。ドローダウンとベンチマーク付き。
PerformanceDashboardバックテストから作る戦略レポート:統計、エクイティ、ドローダウン、月次リターン。

共通の機能

const chart = new BarChart(element, { categories, series, theme: 'dark' })

chart.setOptions({ mode: 'stacked' })   // どのオプションでも、マージされる
chart.setTheme('light')                 // 'dark' | 'light' | Theme
chart.destroy()                         // キャンバスとそのリスナーを取り除く

どのチャートも要素いっぱいに広がり、要素のサイズが変わると再描画します。ホバー時のツールチップがあるチャートでは、 crosshair: false で無効にできます。棒グラフ、ドーナツ、散布図、ヒストグラム、カレンダー、行列は、何を表示しているかを スクリーンリーダーに伝えます(キャンバスに image ロールとラベルが付きます)。ariaLabel を使うと、 たとえばページの言語で、その内容を自分の言葉にできます。数値は valueFormat(または xFormat / yFormat)で表示し、指定がなければ 1,234.5、1 万を超えると 12.3K のように表示します。

棒グラフ

import { BarChart } from '@tradecanvas/chart'

// 10 セッションの外国人の純買い:ゼロより上は緑、下は赤。
const flows = new BarChart(el, {
  categories: ['6/10', '7/10', '8/10', '9/10'],
  series: [{ name: 'Net', values: [-660, 860, -280, 230] }],
  colorBySign: true,                    // または { positive, negative }
  valueFormat: (v) => v + ' bn',
  onBarClick: ({ category, series, value, index }) => openDay(index),
})

// 複数の系列を横に並べる、または積み上げる:プラスはゼロから上へ、マイナスは下へ。
new BarChart(el, {
  categories: ['Foreign', 'Proprietary', 'Retail'],
  series: [{ name: 'Buy', values: [820, 310, 4200] }, { name: 'Sell', values: [-760, -280, -4290] }],
  mode: 'stacked',
  orientation: 'horizontal',            // 棒は右向き、ラベルは左側
  showValues: true,
})

flows.update(categories, series)

値の軸には常にゼロが含まれます。カテゴリにホバーすると、そのカテゴリのすべての系列の値が表示されます。 系列が 2 つ以上あると凡例が表示されます(legend で指定)。下に収まらないラベルは、数カテゴリおきに表示されます。

ドーナツチャート

import { DonutChart } from '@tradecanvas/chart'

new DonutChart(el, {
  data: [
    { label: 'Stocks', value: 52 },
    { label: 'Bonds', value: 23 },
    { label: 'Cash', value: 15 },
    { label: 'Gold', value: 10, color: '#d4a017' },
  ],
  innerRadius: 0.6,                     // 0 で円グラフ
  centerLabel: 'Total',
  centerValue: '1.2B ₫',
  onSliceClick: (slice) => filterBy(slice.label),
})

スライスは 12 時の位置から時計回りに並び、0 以下の値は除かれます。各スライスは余裕があれば割合を表示し、 凡例には名前と割合が並びます。凡例は、チャートが広いときはリングの横に、そうでないときは下に置かれます。

散布図とバブルチャート

import { ScatterChart } from '@tradecanvas/chart'

new ScatterChart(el, {
  series: [{
    name: 'Banks',
    points: [
      { x: 21, y: 9, size: 480, label: 'VCB' },   // size:時価総額。バブルの面積がこれに比例する
      { x: 34, y: 24, size: 170, label: 'TCB' },
    ],
  }],
  xLabel: 'Volatility',
  yLabel: 'Return, a year',
  xFormat: (v) => v + '%',
  yFormat: (v) => v + '%',
  showLabels: true,
  onPointClick: (point, series) => openSymbol(point.label),
})

軸は最も大きなバブルが収まる余白を取り(maxRadius、既定は 24 px)、軸の範囲が x = 0 や y = 0 をまたぐときは その位置に線を引きます(zeroLines: false で非表示)。

ヒストグラム

import { HistogramChart, histogramBins } from '@tradecanvas/chart'

new HistogramChart(el, {
  values: dailyReturns,                 // パーセント単位
  binWidth: 0.5,                        // または bins: 20、または 'auto'(スタージェスの公式)
  colorBySign: true,
  valueFormat: (v) => v.toFixed(1) + '%',
  markers: [{ value: mean, label: 'Mean' }, { value: var95, label: 'VaR 95%', color: '#e85a67' }],
})

histogramBins([1, 2, 2, 3, 10], { bins: 3 })
// [{ from: 1, to: 4, count: 4 }, { from: 4, to: 7, count: 0 }, { from: 7, to: 10, count: 1 }]

カレンダー

import { CalendarChart } from '@tradecanvas/chart'

// 1 年分の立会日(月〜金)を、その日の騰落で色分け。
new CalendarChart(el, {
  data: [{ date: '2025-01-02', value: 1.2 }, { date: '2025-01-03', value: -0.8 }],   // YYYY-MM-DD
  weekdays: 5,                          // 7(既定)は毎日。weekStart: 0 で週を日曜始まりに
  locale: 'vi-VN',                      // 月と曜日の名前
  colorScale: { min: -2, max: 2 },      // テーマの赤と緑。±2 で最も濃く
  valueFormat: (v) => v.toFixed(2) + '%',
  onDayClick: (day) => openSession(day.date),
})

週は左から右へ、曜日は上から下へ並び、暦年ごとに 1 段、最大 10 年です。チャートの高さが足りないときは古い年から省きます。値のない日は空のセルで描き、下のカラーバーが色の目盛りを示します(legend: false で非表示)。

相関行列

import { MatrixChart, correlationMatrix } from '@tradecanvas/chart'

// 価格ではなく日次リターンを渡します。銘柄ごとに 1 つの配列で、日付はそろえます。
const names = ['VCB', 'BID', 'CTG', 'TCB']
const values = correlationMatrix(returnsByStock)

new MatrixChart(el, {
  rows: names,                          // 正方でない行列には columns: [...]
  values,                               // values[row][column]
  triangle: 'lower',                    // 相関なら半分で十分
  colorScale: { min: -1, max: 1 },
  onCellClick: ({ row, column, value }) => compare(row, column),
})

セルは正方形のままで、収まるときは値を表示します(valueFormat がなければ小数 2 桁)。列名がセルの幅に収まらないときは斜めにします。correlationMatrix は両方の系列に値がある日だけを組にし、3 日未満なら NaN を返してセルを空にします。時間帯と曜日ごとの出来高など、ほかの数値表にも使えます。

セクターマップ

import { HeatmapChart } from '@tradecanvas/chart'

new HeatmapChart(el, {
  data: [
    { id: 'vcb', label: 'VCB', value: 0.8, weight: 480, group: '銀行' },
    { id: 'hpg', label: 'HPG', value: 1.9, weight: 160, group: '鉄鋼' },
    { id: 'vhm', label: 'VHM', value: -2.4, weight: 170, group: '不動産' },
  ],
  grouped: true,                        // まずセクター、次に銘柄でタイルを配置
  valueFormat: (v) => v.toFixed(1) + '%',
})

各セクターは銘柄のウェイトの合計に応じた広さを占め、収まるときはタイルの上部にセクター名と加重平均の騰落を表示します。ヒートマップの色は colorScale で min と max を指定しない限り -5 から 5 です。

逆ウォッチ曲線

import { CounterClockChart } from '@tradecanvas/chart'

const clock = new CounterClockChart(el, {
  data: bars,                           // OHLCV の足、古い順
  period: 25,                           // 各平均に含める足の数
  points: 120,                          // 描く最新の点の数
  xLabel: '出来高(平均)', yLabel: '価格(平均)',
  onPointClick: (p) => goTo(p.time),
})

clock.getPhase()                        // 1〜8:最後の動きの方向

各点は出来高(横)と終値(縦)の 25 本平均で、時間順に結ばれ、古いほど薄くなります。健全な循環は反時計回りに回ります。getPhase()(と counterClockPhase(points))は最後の動きを返します:1 出来高増、2 価格と出来高がともに上昇、3 価格上昇、4 出来高減の中の価格上昇、5 出来高減、6 ともに下落、7 価格下落、8 出来高増の中の価格下落。

スパークライン、ゲージ、ヒートマップ、ウォーターフォール、板の厚み、エクイティカーブ

import { SparklineChart, GaugeChart, HeatmapChart, WaterfallChart, DepthChart, EquityCurveChart } from '@tradecanvas/chart'

new SparklineChart(el, { data: closes, mode: 'area', showLastPoint: true })

const gauge = new GaugeChart(el, {
  value: 72, min: 0, max: 100, label: 'Fear & Greed',
  zones: [{ from: 0, to: 45, color: '#e8505b' }, { from: 45, to: 55, color: '#8a93a3' }, { from: 55, to: 100, color: '#1fa874' }],
})
gauge.setValue(64)

// 時価総額で大きさを、当日の変化率で色を決めたツリーマップ。
new HeatmapChart(el, {
  data: [{ id: 'vcb', label: 'VCB', value: 1.2, weight: 480 }, { id: 'fpt', label: 'FPT', value: -0.8, weight: 170 }],
  weighted: true, showLabels: true, showValues: true,
  onCellClick: (cell) => openSymbol(cell.label),
})

new WaterfallChart(el, { data: [{ label: 'Start', value: 10000, type: 'total' }, { label: 'Fees', value: -85 }, { label: 'End', value: 9915, type: 'total' }] })
new DepthChart(el, { data: { bids, asks }, midPriceLine: true, spreadLabel: true })
new EquityCurveChart(el, { data: equity, benchmark, drawdown: true })

パフォーマンスダッシュボード

PerformanceDashboard はバックテストから戦略レポートを組み立てます。主要な統計の帯、エクイティカーブ、 その下のドローダウン、月次リターンのカレンダーで構成されます。分析のバックテスターと組み合わせて使います。

import { Backtester } from '@tradecanvas/analytics'
import { PerformanceDashboard } from '@tradecanvas/chart'

const result = new Backtester({ initialCash: 10_000 }).run(bars, myStrategy)

const dash = new PerformanceDashboard(document.getElementById('report')!, {
  result,            // { equityCurve, metrics } を持つものなら何でも:Backtester の出力がそのまま使える
  theme: 'dark',
  title: 'SMA Crossover',
  subtitle: 'BTC/USDT · 1h · 2023',
})

// あとで:dash.update(newResult) · dash.setTheme('light') · dash.destroy()

独自のレイアウト向けに計算関数もエクスポートされています:computeMonthlyReturns、 computeDrawdownCurve、toEquityPoints、selectKeyStats。独自の軸には niceScale(min, max) が使えます(目盛りは 1、2、2.5、5 刻み)。