ETFポートフォリオの自動リバランス:Tinkoff投資向けボットの開発記
ポートフォリオの自動リバランス:ボットが目標ウェイトを監視し、あなたに代わって取引します。
例えば、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%)。時間が経つと市場が動き、実際の比率が目標から乖離します。リバランスとは、値上がりした資産を売り、値下がりした資産を買うことで目標ウェイトに戻すことです。
なぜ必要なのか:
- リスク管理 — ある資産がポートフォリオの60%まで膨らむと、単一の銘柄に依存しすぎます
- 体系的な利益確定 — 値上がりした資産を自動的に売却
- 押し目買い — 下落した資産を自動的に買い増し
- 規律 — 感情なし、アルゴリズムのみ
手動で行う場合の問題点。特に以下の場合:
- 複数の口座がある
- 四半期に1回ではなく、毎時リバランスが必要
- 戦略にマージン取引が含まれる
- ロット数、最低取引金額、取引所の営業時間を考慮する必要がある
ボットの仕組み
メインループ
1. MOEXが開いているか確認
2. 現在のポジションと価格を取得
3. 目標アロケーションを計算(4つのモード)
4. 注文を生成:売りが先、次に買い
5. 成行注文で執行
6. BALANCE_INTERVAL待機して繰り返し
ボットは無限ループで動作します。インターバルは設定可能で、1分から1日まで。デフォルトは1時間です。
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に差異がある銘柄を見つけ、これらの指標間でバランスを取ります。市場がファンドを運用資産以上に評価している場合、それはシグナルです。
注文生成
ボットは賢く設計されています:まず売り、次に買います。これが重要な理由:
- 売却で買い付け資金が確保される
- 口座に現金を準備しておく必要がない
- 余剰資金がゼロでも動作する
すべての銘柄はロット単位で取引されます。ボットは目標金額をルーブルに変換 → ロット数に変換 → 端数を丸め → 注文を生成します。
高度な機能
信用取引

{
"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モードから始めることを推奨します。
試してみる
- ソースコード:github.com/suenot/tinkoff-invest-etf-balancer-bot
- ライセンス:Apache 2.0
- コンテスト:Tinkoff Invest Robot Contestに参加中
リンク:
- GitHub:github.com/suenot/tinkoff-invest-etf-balancer-bot
- Tinkoff Invest API:invest-api.tinkoff.ru
引用
@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製オープンソースボット。}
}
MarketMaker.cc Team
クオンツ・リサーチ&戦略