إعادة توازن محفظة ETF تلقائياً: كيف بنينا بوتاً لـ Tinkoff Invest
إعادة توازن المحفظة تلقائياً: البوت يراقب الأوزان المستهدفة ويتداول نيابةً عنك.
لنفترض أن لديك محفظة مكونة من أربعة صناديق ETF: TMOS وTBRU وTRUR ونقد بالروبل. بنسبة 25% لكل منها. ارتفع السوق — أصبح TMOS يمثل 32%، بينما انخفض TBRU إلى 18%. تقول النظرية الكلاسيكية: بِع ما ارتفع، واشترِ ما انخفض. هذه هي إعادة التوازن.
المشكلة أن القيام بذلك يدوياً أمر مُرهق. خاصةً إذا كان لديك عدة حسابات، وتتضمن الاستراتيجية تداولاً بالهامش، وتحتاج لإعادة التوازن كل ساعة. لذلك بنينا بوتاً يقوم بذلك تلقائياً.
TIEBB (Tinkoff Invest ETF Balancer Bot) — بوت مفتوح المصدر بـ TypeScript يتصل بواجهة برمجة تطبيقات Tinkoff Invest ويحافظ تلقائياً على التخصيص المستهدف للمحفظة. أربعة أوضاع للتوازن، تداول بالهامش، حسابات متعددة، ووضع dry-run للاختبار.
ملخص
- مفتوح المصدر (Apache 2.0) بوت لإعادة توازن محفظة ETF تلقائياً
- 4 أوضاع للتوازن: يدوي، حسب القيمة السوقية، حسب الأصول المُدارة، لا ارتباطي
- تداول بالهامش حتى 4 أضعاف مع إدارة المخاطر
- حسابات متعددة: عدد غير محدود من الحسابات بإعدادات فردية
- TypeScript + Bun — سريع، آمن النوع، بدون متاعب
- وضع Dry-run — يحسب الأوامر لكن لا ينفذها
لماذا نحتاج إعادة التوازن

الفكرة بسيطة: تحدد النسب المستهدفة للأصول في محفظتك (مثلاً: 25% TMOS، 25% TBRU، 25% TRUR، 25% RUB). مع مرور الوقت يتحرك السوق وتنحرف النسب الفعلية عن المستهدفة. إعادة التوازن هي العودة إلى الأوزان المستهدفة عن طريق بيع ما ارتفع وشراء ما انخفض.
لماذا هذا ضروري:
- التحكم في المخاطر — إذا نما أصل واحد إلى 60% من المحفظة، فأنت تعتمد على أداة واحدة
- جني أرباح منهجي — تبيع تلقائياً ما ارتفع
- الشراء عند الانخفاض — تشتري تلقائياً الأصول المنخفضة
- الانضباط — لا عواطف، فقط الخوارزمية
المشكلة في القيام بذلك يدوياً أنه مُتعب. خاصةً إذا:
- لديك عدة حسابات
- تحتاج إعادة التوازن كل ساعة (وليس كل ربع سنة)
- تتضمن الاستراتيجية تداولاً بالهامش
- تحتاج لمراعاة حجم اللوت والمبالغ الدنيا وأوقات عمل البورصة
كيف يعمل البوت
الحلقة الرئيسية
1. التحقق مما إذا كانت بورصة MOEX مفتوحة
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 - Assets Under Management) لكل صندوق. البيانات من t-capital-funds.ru. يعكس شعبية الصندوق بين المستثمرين.
4. الوضع اللا ارتباطي (decorrelation)
الأكثر إثارة للاهتمام. المعادلة:
decorrelationPct = (marketCap - AUM) / AUM * 100
metric = max_decorrelationPct - individual_decorrelationPct
weight = metric / sum(metrics) * 100
الفكرة: نجد الأدوات التي تختلف فيها القيمة السوقية عن الأصول المُدارة، ونوازن بين هذه المقاييس. إذا كان السوق يُقيّم صندوقاً أعلى من حجم الأصول المستثمرة فيه — فهذه إشارة.
توليد الأوامر
البوت ذكي: يبيع أولاً ثم يشتري. هذا مهم لأن:
- البيع يُحرر أموالاً للشراء
- لا حاجة لاحتياطي نقدي في الحساب
- يعمل حتى مع رصيد متاح صفري
جميع الأدوات تُتداول باللوتات. يحوّل البوت المبلغ المستهدف إلى روبل → إلى عدد لوتات → يُقرّب → يُولّد الأمر.
ميزات متقدمة
التداول بالهامش

{
"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 بتوقيت موسكو) ويُطبق الاستراتيجية آلياً. ويأخذ في الاعتبار رسوم الترحيل (1% من المركز الذي يتجاوز 5,000 روبل).
حسابات متعددة
ملف 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 |
| واجهة البرمجة | Tinkoff Invest gRPC (tinkoff-sdk-grpc-js) |
| الإعدادات | CONFIG.json + .env |
| المقاييس | Puppeteer (جمع بيانات القيمة السوقية والأصول المُدارة) |
لماذا Bun؟ أسرع 20-30 مرة من Node.js عند البدء، دعم أصلي لـ TypeScript، مشغّل اختبارات مدمج. بالنسبة لبوت يعمل في حلقة بعد التشغيل، هذا ليس بالغ الأهمية — لكن Bun أكثر ملاءمة أثناء التطوير.
بنية وحدوية:
- Provider — التواصل مع واجهة البرمجة، إدارة المحفظة
- 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 Invest},
year = {2026},
url = {https://marketmaker.cc/ru/blog/post/etf-balancer-bot-tinkoff},
description = {بوت مفتوح المصدر بـ TypeScript لإعادة توازن محفظة ETF تلقائياً في Tinkoff Invest.}
}
MarketMaker.cc Team
البحوث والاستراتيجيات الكمية