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 投资组合再平衡。}
}
MarketMaker.cc Team
量化研究与策略