ETF 投資組合自動再平衡:我們如何為 Tinkoff 投資編寫機器人
自動投資組合再平衡:機器人監控目標權重並代替您進行交易。
假設您有一個由四隻 ETF 組成的投資組合:TMOS、TBRU、TRUR 以及盧布現金,每種各佔 25%。市場上漲後,TMOS 漲到了 32%,而 TBRU 跌到了 18%。經典理論告訴我們:賣出漲的,買入跌的。這就是再平衡。
問題在於,手動操作非常痛苦。尤其是當您有多個賬戶、策略包含保證金交易、而且需要每小時進行一次再平衡時。我們編寫了一個機器人來自動完成這一切。
TIEBB(Tinkoff Invest ETF Balancer Bot)是一個基於 TypeScript 的開源機器人,它連線 Tinkoff 投資 API,自動維持投資組合的目標配置。四種平衡模式、保證金交易、多賬戶支援、dry-run 測試模式。
概要
- 開源(Apache 2.0)ETF 投資組合自動再平衡機器人
- 4 種平衡模式:手動、按市值、按資產管理規模、去相關性
- 保證金交易最高 4 倍槓桿,含風險管理
- 多賬戶:無限數量的賬戶,每個都有獨立配置
- TypeScript + Bun — 快速、型別安全、無痛開發
- Dry-run 模式 — 計算訂單但不執行
為什麼需要再平衡

原理很簡單:您設定投資組合中各資產的目標比例(例如 25% TMOS、25% TBRU、25% TRUR、25% RUB)。隨著時間推移,市場波動導致實際比例偏離目標。再平衡就是通過賣出漲幅較大的資產、買入跌幅較大的資產,回到目標權重。
為什麼這很重要:
- 風險控制 — 如果某一資產膨脹到投資組合的 60%,您就過度依賴單一工具
- 系統化獲利了結 — 自動賣出漲幅較大的資產
- 逢低買入 — 自動加倉下跌的資產
- 紀律性 — 沒有情緒,只有演算法
手動操作的問題在於太累人。尤其是當:
- 您有多個賬戶
- 需要每小時再平衡(而非每季度一次)
- 策略包含保證金交易
- 需要考慮手數、最小金額和交易所交易時間
機器人工作原理
主迴圈
1. 检查莫斯科交易所是否开盘
2. 获取当前持仓和价格
3. 计算目标配置(4 种模式)
4. 生成订单:先卖后买
5. 以市价单执行
6. 等待 BALANCE_INTERVAL 后重复
機器人以無限迴圈執行。間隔可配置 — 從一分鐘到一天。預設為一小時。
四種平衡模式

1. 手動模式(manual)
最簡單的模式。您手動設定權重:
{
"desired_wallet": {
"TMOS": 25,
"TBRU": 25,
"TRUR": 25,
"RUB": 25
}
}
機器人將百分比歸一化到 100% 並維持這些比例。
2. 按市值模式(marketcap)
權重與各基金的市值成正比。邏輯是:基金越大,佔比越高。資料來源於 T-Bank 和 investfunds.ru 網站。
3. 按資產管理規模模式(aum)
權重與各基金的 AUM(資產管理規模)成正比。資料來源於 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 倍槓桿。三種保證金管理策略:
- keep — 始終持有保證金倉位
- remove — 在交易日結束前平掉保證金
- keep_if_small — 如果保證金規模低於閾值則保留
機器人自動判斷交易所即將收盤(莫斯科時間 18:45),並自動應用策略。同時考慮隔夜持倉費用(超過 5000 盧布倉位的 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 # 单次迭代
管理工具:
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 = {基于 TypeScript 的开源机器人,用于在 Tinkoff 投资平台上自动进行 ETF 投资组合再平衡。}
}
Authors
Trading-systems engineer
Trading-systems engineer building bots since 2017: cross-exchange arbitrage (connected up to 30 venues), cointegration-based pairs arbitrage across spot and futures, scalping, news and sentiment-driven strategies, trend algorithms, and portfolio management and balancing algorithms. Also builds sub-millisecond order execution, big-data warehouses, backtesting engines, AI agents, and trading interfaces (incl. open-source profitmaker.cc). Stack: JS/TS, Python, Rust/Zig/Go, DevOps, backend, frontend, architecture.