← 返回文章列表
March 26, 2026
5 分鐘閱讀

ETF 投資組合自動再平衡:我們如何為 Tinkoff 投資編寫機器人

ETF 投資組合自動再平衡:我們如何為 Tinkoff 投資編寫機器人
#etf
#tinkoff
#再平衡
#投資組合
#機器人
#量化交易
#開源

ETF Balancer Bot 自動投資組合再平衡:機器人監控目標權重並代替您進行交易。

假設您有一個由四隻 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)。隨著時間推移,市場波動導致實際比例偏離目標。再平衡就是通過賣出漲幅較大的資產、買入跌幅較大的資產,回到目標權重。

為什麼這很重要:

  1. 風險控制 — 如果某一資產膨脹到投資組合的 60%,您就過度依賴單一工具
  2. 系統化獲利了結 — 自動賣出漲幅較大的資產
  3. 逢低買入 — 自動加倉下跌的資產
  4. 紀律性 — 沒有情緒,只有演算法

手動操作的問題在於太累人。尤其是當:

  • 您有多個賬戶
  • 需要每小時再平衡(而非每季度一次)
  • 策略包含保證金交易
  • 需要考慮手數、最小金額和交易所交易時間

機器人工作原理

主迴圈

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 存在差異的工具,並在這些指標之間進行平衡。如果市場對某基金的估值高於其管理資產 — 這是一個訊號。

訂單生成

機器人很智慧:先賣後買。這很重要,因為:

  1. 賣出釋放資金用於買入
  2. 不需要賬戶上預留現金
  3. 即使可用餘額為零也能運作

所有工具按手數交易。機器人將目標金額轉換為盧布 → 轉換為手數 → 取整 → 生成訂單。


高階功能

保證金交易

保證金交易

{
  "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 模式。

試用


連結:


引用

@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

Eugen Soloviov
Eugen Soloviov

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.

Newsletter

緊跟市場步伐

訂閱我們的時事通訊,獲取獨家 AI 交易見解、市場分析和平台更新。

我們尊重您的隱私。您可以隨時退訂。