← 記事一覧に戻る
March 26, 2026
読了時間: 5分

ETFポートフォリオの自動リバランス:Tinkoff投資向けボットの開発記

ETFポートフォリオの自動リバランス:Tinkoff投資向けボットの開発記
#etf
#tinkoff
#リバランス
#ポートフォリオ
#ボット
#アルゴトレード
#オープンソース

ETF Balancer Bot ポートフォリオの自動リバランス:ボットが目標ウェイトを監視し、あなたに代わって取引します。

例えば、TMOS、TBRU、TRUR、ルーブル現金の4つのETFで構成されたポートフォリオがあるとします。それぞれ25%ずつ。市場が上昇してTMOSが32%に増え、TBRUが18%に下がりました。古典的な理論では「上がったものを売り、下がったものを買え」と言います。これがリバランスです。

問題は、手動でやるのが非常に大変だということです。特に、複数のアカウントがあり、戦略にマージン取引が含まれ、1時間ごとにリバランスが必要な場合はなおさらです。私たちはこれを自動的に行うボットを開発しました。

TIEBB(Tinkoff Invest ETF Balancer Bot)は、TypeScript製のオープンソースボットで、Tinkoff投資のAPIに接続し、ポートフォリオの目標アロケーションを自動的に維持します。4つのバランシングモード、信用取引、マルチアカウント、テスト用のdry-runモードを搭載しています。


概要

  • オープンソース(Apache 2.0)ETFポートフォリオ自動リバランスボット
  • 4つのバランシングモード:手動、時価総額基準、AUM基準、脱相関
  • 信用取引最大4倍レバレッジ、リスク管理機能付き
  • マルチアカウント:無制限の口座数、個別設定可能
  • TypeScript + Bun — 高速、型安全、ストレスフリー
  • Dry-runモード — 注文を計算するが実行しない

なぜリバランスが必要なのか

ポートフォリオリバランスの概念

考え方はシンプルです。ポートフォリオ内の各資産の目標比率を決めます(例:TMOS 25%、TBRU 25%、TRUR 25%、RUB 25%)。時間が経つと市場が動き、実際の比率が目標から乖離します。リバランスとは、値上がりした資産を売り、値下がりした資産を買うことで目標ウェイトに戻すことです。

なぜ必要なのか:

  1. リスク管理 — ある資産がポートフォリオの60%まで膨らむと、単一の銘柄に依存しすぎます
  2. 体系的な利益確定 — 値上がりした資産を自動的に売却
  3. 押し目買い — 下落した資産を自動的に買い増し
  4. 規律 — 感情なし、アルゴリズムのみ

手動で行う場合の問題点。特に以下の場合:

  • 複数の口座がある
  • 四半期に1回ではなく、毎時リバランスが必要
  • 戦略にマージン取引が含まれる
  • ロット数、最低取引金額、取引所の営業時間を考慮する必要がある

ボットの仕組み

メインループ

1. MOEXが開いているか確認
2. 現在のポジションと価格を取得
3. 目標アロケーションを計算(4つのモード)
4. 注文を生成:売りが先、次に買い
5. 成行注文で執行
6. BALANCE_INTERVAL待機して繰り返し

ボットは無限ループで動作します。インターバルは設定可能で、1分から1日まで。デフォルトは1時間です。

4つのバランシングモード

4つのバランシングモード

1. 手動モード(manual)

最もシンプル。ウェイトを手動で設定します:

{
  "desired_wallet": {
    "TMOS": 25,
    "TBRU": 25,
    "TRUR": 25,
    "RUB": 25
  }
}

ボットはパーセンテージを100%に正規化し、これらの比率を維持します。

2. 時価総額モード(marketcap)

ウェイトは各ファンドの時価総額に比例します。ロジック:ファンドが大きいほど、配分も大きくなります。データはT-Bankおよびinvestfunds.ruのサイトから取得します。

3. 運用資産残高モード(aum)

ウェイトは各ファンドのAUM(Assets Under Management=運用資産残高)に比例します。データはt-capital-funds.ruから取得。投資家間でのファンドの人気度を反映します。

4. 脱相関モード(decorrelation)

最も興味深いモード。計算式:

decorrelationPct = (marketCap - AUM) / AUM * 100
metric = max_decorrelationPct - individual_decorrelationPct
weight = metric / sum(metrics) * 100

考え方:時価総額とAUMに差異がある銘柄を見つけ、これらの指標間でバランスを取ります。市場がファンドを運用資産以上に評価している場合、それはシグナルです。

注文生成

ボットは賢く設計されています:まず売り、次に買います。これが重要な理由:

  1. 売却で買い付け資金が確保される
  2. 口座に現金を準備しておく必要がない
  3. 余剰資金がゼロでも動作する

すべての銘柄はロット単位で取引されます。ボットは目標金額をルーブルに変換 → ロット数に変換 → 端数を丸め → 注文を生成します。


高度な機能

信用取引

信用取引

{
  "margin_trading": {
    "enabled": true,
    "multiplier": 2,
    "free_threshold": 5000,
    "max_margin_size": 50000,
    "balancing_strategy": "keep_if_small"
  }
}

ボットは最大4倍のレバレッジに対応。3つのマージン管理戦略:

  • keep — マージンポジションを常に保持
  • remove — 取引日終了前にマージンを解消
  • keep_if_small — マージン規模が閾値以下なら保持

ボットは取引所の閉場が近いこと(モスクワ時間18:45)を自動検知し、戦略を自動適用します。翌日持ち越し手数料(5,000ルーブル超のポジションに対して1%)も考慮します。

マルチアカウント

1つのCONFIG.jsonで無制限の口座数に対応。各口座に個別の設定:

  • APIトークン
  • 目標アロケーション
  • バランシングモード
  • リバランスインターバル
  • マージン設定
{
  "accounts": [
    {
      "id": "main_broker",
      "name": "メイン証券口座",
      "desired_wallet": { "TMOS": 50, "TBRU": 50 },
      "balance_interval": 3600000
    },
    {
      "id": "iis_account",
      "name": "個人投資口座",
      "desired_wallet": { "TRUR": 100 },
      "balance_interval": 86400000
    }
  ]
}

最低利益率しきい値

{
  "min_profit_percent_for_close_position": 5
}

利益が5%未満の場合はポジションを売却しません。逆に、-2を設定してストップロス(最大損失2%)として使うこともできます。

Dry-runモード

{
  "exchange_closure_behavior": {
    "mode": "dry_run",
    "update_iteration_result": true
  }
}

ボットはすべての注文を計算してログに記録しますが、取引所には送信しません。戦略テストに最適です。

差分ベースの調整

{
  "diff": "iteration",
  "diff_multiplier": 50
}

前回のリバランス以降(または当日の開始以降)の変化に基づいてウェイトを調整します。乗数は0〜100で、影響の強さを決定します。


技術スタックとアーキテクチャ

コンポーネント テクノロジー
ランタイム Bun 1.0+(またはNode.js 18+)
言語 TypeScript
API Tinkoff Invest gRPC(tinkoff-sdk-grpc-js
設定 CONFIG.json + .env
メトリクス Puppeteer(時価総額、AUMのスクレイピング)

なぜBunなのか? Node.jsと比べて起動が20〜30倍高速、TypeScriptのネイティブサポート、組み込みテストランナー。起動後にループで動作するボットにとってはそれほど重要ではありませんが、開発時にはBunのほうが便利です。

モジュラーアーキテクチャ:

  • Provider — API通信、ポートフォリオ管理
  • Balancer — リバランスアルゴリズム(4モード)
  • OrderManager — 注文生成と執行
  • MarginCalculator — マージンとリスクの計算
  • Tools — メトリクスのスクレイピング、データ収集

クイックスタート

curl -fsSL https://bun.sh/install | bash

git clone https://github.com/suenot/tinkoff-invest-etf-balancer-bot.git
cd tinkoff-invest-etf-balancer-bot
bun install

cp .env-example .env
cp CONFIG.example.json CONFIG.json


bun run start          # 通常モード
bun run dev            # デバッグモード
bun run dev -- --once  # 1回だけ実行

管理ユーティリティ:

bun run accounts         # 利用可能な口座一覧
bun run config list      # 設定内の全アカウント
bun run config validate  # 設定の検証

制限事項と免責事項

  • ルーブル建ての株式とファンドのみに対応。口座内のその他の銘柄は操作しません。
  • これはベータ版です。モデルは利益を保証しません。
  • 取引結果に対する全責任はご自身にあります。
  • まずはdry-runモードから始めることを推奨します。

試してみる


リンク:


引用

@software{soloviov2026etfbalancer,
  author = {Soloviov, Eugen},
  title = {ETFポートフォリオの自動リバランス:Tinkoff投資向けボット},
  year = {2026},
  url = {https://marketmaker.cc/ru/blog/post/etf-balancer-bot-tinkoff},
  description = {Tinkoff投資でETFポートフォリオを自動リバランスするTypeScript製オープンソースボット。}
}
blog.disclaimer

MarketMaker.cc Team

クオンツ・リサーチ&戦略

Telegramで議論する
Newsletter

市場の先を行く

ニュースレターを購読して、独占的なAI取引の洞察、市場分析、プラットフォームの更新情報を受け取りましょう。

プライバシーを尊重します。いつでも配信停止可能です。