حاسبة العائد المرجح بالوقت TWR
يقيس العائد المرجح بالوقت أداء استراتيجية الاستثمار من دون أن يشوه حجم المساهمات والسحوبات الخارجية أو توقيتها النتيجة.
شغّل الأداة مجانًا
أدخلوا قيم المحفظة لفترات فرعية متتابعة، وحددوا ما إذا كان كل تدفق نقدي في بداية فترته أو نهايتها، ثم تحسب الأداة عائد كل فترة وتربط العوائد في قيمة تراكمية واحدة. وبذلك يمكنكم مقارنة مديرين أو نماذج أو استراتيجيات بين حسابات أضاف أصحابها مبالغ مختلفة أو سحبوها في أوقات متباينة.
قسّموا مدة القياس عند كل تدفق نقدي خارجي
يبدأ حساب العائد المرجح بالوقت بتقسيم مدة القياس الكاملة إلى فترات فرعية. ينبغي إنشاء حد جديد كلما دخل مال إلى المحفظة أو خرج منها لسبب لا يتعلق بأداء الاستثمار. تعد المساهمات والإيداعات والسحوبات والتوزيعات التي تغادر الحساب تدفقات نقدية خارجية. أما الفوائد والأرباح الموزعة التي تبقى مستثمرة والرسوم ومكاسب السوق أو خسائره فتدخل عادة في الأداء، ولذلك لا تسجلوها كتدفقات نقدية. أدخلوا لكل فترة فرعية القيمة السوقية في بدايتها ونهايتها، ثم سجلوا التدفق الخارجي رقما موجبا للمساهمة أو رقما سالبا للسحب. اختاروا البداية عندما كان المبلغ متاحا للاستثمار طوال الفترة الفرعية، واختاروا النهاية عندما وصل بعد تحقق أداء الفترة أو عندما نُفذ السحب بعده. دقة التقييم عند الحدود مهمة؛ فإذا وقع التدفق في منتصف فترة طويلة، أنشئوا حد تقييم عند ذلك الوقت بدلا من وضعه بصورة تقريبية. يجب إدخال الصفوف بترتيب زمني لأن الحاسبة تربط العوائد بالترتيب نفسه.
افهموا معادلات الفترات الفرعية وطريقة الربط
عندما يوضع التدفق في النهاية، تطرح الحاسبة قيمته من القيمة النهائية ثم تقسم القيمة النهائية المعدلة على القيمة الابتدائية. وعندما يوضع في البداية، تضيفه إلى القيمة الابتدائية وتقسم القيمة النهائية على رأس المال المستثمر الناتج. يؤدي طرح واحد من أي من النسبتين إلى عائد الفترة الفرعية. بعد ذلك تحول الحاسبة كل عائد إلى معامل نمو، وتضرب جميع المعاملات، ثم تطرح واحدا من حاصل الضرب. فمثلا، لا يؤخذ متوسط ربح تتبعه خسارة، بل يركبان تراكميا؛ إذ لا تلغي نسبتان موجبة وسالبة متساويتان إحداهما الأخرى لأن الثانية تطبق على أساس رأسمالي مختلف. تتضمن الإجابة الصيغة العشرية والمئوية لعائد كل فترة، ومعامل النمو النهائي، والعائد التراكمي المرجح بالوقت. لا يطبق التقريب إلا على القيم المعروضة بعد إدخال كل حساب بكامل دقته في سلسلة الربط. يحافظ ذلك على ثبات النتائج ويتجنب الانحراف الذي قد ينشأ من ربط نسب وسيطة سبق تقريبها.
فسروا النتيجة وانتبهوا إلى حدود استخدامها
استخدموا النسبة النهائية لتقييم عملية الاستثمار بمعزل عن قرارات صاحب الحساب المتعلقة بتمويله. تناسب هذه النتيجة بوجه خاص مقارنة مديري الاستثمار والمؤشرات المرجعية والمحافظ النموذجية أو الاستراتيجية نفسها بين حسابات تختلف فيها جداول المساهمات. تعني النتيجة الموجبة أن وحدة من رأس المال المعرضة للاستثمار خلال جميع الفترات الفرعية قد نمت، بينما تعني النتيجة السالبة أنها انخفضت. يعبر معامل النمو عن النتيجة نفسها بصيغة ضربية؛ فما فوق الواحد نمو وما دونه خسارة. لا يمثل العائد المرجح بالوقت العائد الشخصي للمستثمر عندما تكون هناك إيداعات أو سحوبات كبيرة. للإجابة عن ذلك، يستخدم العائد المرجح بالنقود أو معدل العائد الداخلي أوزانا للتدفقات بحسب توقيتها وحجمها. كذلك لا تحول هذه الحاسبة النتيجة إلى معدل سنوي، ولا تستنتج التقييمات المفقودة، ولا تقدر تواريخ التدفقات داخل الفترة، ولا تقارن بمؤشر مرجعي. تعتمد الدقة على التصنيف الصحيح للتدفقات الخارجية وتوافر قيم سوقية عند الحدود المناسبة. راجعوا عوائد الفترات المدرجة لاكتشاف أي صف غير معقول قبل الاعتماد على النتيجة في تقرير أو تحليل.
حالات الاستخدام
تقييم مدير محفظة
استبعدوا الإيداعات والسحوبات التي يقررها العميل حتى يعكس العائد قرارات الاستثمار لا توقيت التمويل.
مقارنة المحافظ النموذجية
اربطوا عوائد متسقة لاستراتيجيات تتبعها حسابات ذات أرصدة وجداول مساهمات مختلفة.
إعداد تقارير الأداء
أنشئوا عائدا تراكميا قابلا للمراجعة مع عوائد الفترات التي استُخدمت في الربط.
الأسئلة الشائعة
ما كلفة استخدام الحاسبة؟
تبلغ كلفة كل طلب API مقدار $0.002. ويمكن أيضا تنفيذ الحساب الحتمي نفسه داخل المتصفح.
هل تُدخل المساهمات بقيمة موجبة أم سالبة؟
أدخلوا المساهمات كتدفقات نقدية موجبة والسحوبات كتدفقات نقدية سالبة.
متى نختار البداية بدلا من النهاية؟
اختاروا البداية إذا ظل التدفق مستثمرا طوال الفترة الفرعية، واختاروا النهاية إذا وقع بعد تحقق أداء تلك الفترة.
هل العائد المرجح بالوقت هو معدل العائد الداخلي نفسه؟
لا. يزيل العائد المرجح بالوقت أثر حجم التدفقات الخارجية وتوقيتها، بينما يقيس معدل العائد الداخلي تجربة المستثمر مرجحة بالنقود.
هل تحول النتيجة الأداء إلى معدل سنوي؟
لا. النتيجة هي العائد التراكمي عبر الفترات المدخلة. ويتطلب التحويل السنوي المدة المنقضية، وهي ليست جزءا من هذه المدخلات.
للمطوّرين — الوصول عبر API
كل ما في هذه الصفحة متاح برمجيًا. هذا القسم موجّه للفرق التقنية التي تريد ربط الأداة بأنظمتها الخاصة؛ بقية المستخدمين يمكنهم استخدام الأداة أعلاه مباشرة دون الحاجة لقراءة ما يلي.
الـEndpoint
صادِق على طلبك بترويسة Bearer، وأرسل طلب POST واحدًا لتدخل مهمتك قائمة التنفيذ فورًا؛ ثم تستلم النتيجة عبر webhook أو رابط موقّع.
استدعِ الخدمة من بيئتك
curl -X POST https://api.kit.forhosting.com/finance/time-weighted-return \
-H "Authorization: Bearer $KIT_KEY" \
-H "Content-Type: application/json" \
-d '{"periods":[{"beginning_value":10000,"ending_value":10800,"cash_flow":500,"cash_flow_timing":"end"},{"beginning_value":11300,"ending_value":11752,"cash_flow":0,"cash_flow_timing":"end"}]}'const res = await fetch("https://api.kit.forhosting.com/finance/time-weighted-return", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.KIT_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"periods": [
{
"beginning_value": 10000,
"ending_value": 10800,
"cash_flow": 500,
"cash_flow_timing": "end"
},
{
"beginning_value": 11300,
"ending_value": 11752,
"cash_flow": 0,
"cash_flow_timing": "end"
}
]
})
});
const { task_id } = await res.json();import os, requests
res = requests.post(
"https://api.kit.forhosting.com/finance/time-weighted-return",
headers={"Authorization": f"Bearer {os.environ['KIT_KEY']}"},
json={
"periods": [
{
"beginning_value": 10000,
"ending_value": 10800,
"cash_flow": 500,
"cash_flow_timing": "end"
},
{
"beginning_value": 11300,
"ending_value": 11752,
"cash_flow": 0,
"cash_flow_timing": "end"
}
]
},
)
task_id = res.json()["task_id"]<?php
$res = file_get_contents("https://api.kit.forhosting.com/finance/time-weighted-return", false, stream_context_create([
"http" => [
"method" => "POST",
"header" => "Authorization: Bearer " . getenv("KIT_KEY") . "\r\nContent-Type: application/json",
"content" => '{"periods":[{"beginning_value":10000,"ending_value":10800,"cash_flow":500,"cash_flow_timing":"end"},{"beginning_value":11300,"ending_value":11752,"cash_flow":0,"cash_flow_timing":"end"}]}',
],
]));
$task = json_decode($res, true);body := bytes.NewBufferString(`{"periods":[{"beginning_value":10000,"ending_value":10800,"cash_flow":500,"cash_flow_timing":"end"},{"beginning_value":11300,"ending_value":11752,"cash_flow":0,"cash_flow_timing":"end"}]}`)
req, _ := http.NewRequest("POST", "https://api.kit.forhosting.com/finance/time-weighted-return", body)
req.Header.Set("Authorization", "Bearer "+os.Getenv("KIT_KEY"))
req.Header.Set("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)مثال على الطلب
{
"periods": [
{
"beginning_value": 10000,
"ending_value": 10800,
"cash_flow": 500,
"cash_flow_timing": "end"
},
{
"beginning_value": 11300,
"ending_value": 11752,
"cash_flow": 0,
"cash_flow_timing": "end"
}
]
}مثال على الاستجابة
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "finance.time_weighted_return",
"status": "queued",
"_links": {
"result": "/tasks/tsk_…/result"
}
}الواجهة غير متزامنة: تستلم task_id فور الإرسال، ويمكنك الاستعلام عن الحالة بمعدل طلب واحد في الثانية.
الأسعار
السعر معلن كما تراه: لا tokens ولا نظام نقاط؛ وإن فشلت المهمة فلن تُحاسَب عليها.
الأخطاء
| HTTP | الرمز | المعنى |
|---|---|---|
401 | unauthorized | مفتاح الوصول مفقود أو غير صالح؛ تحقق من ترويسة Bearer في طلبك. |
402 | insufficient_balance | رصيدك لا يكفي لتنفيذ هذه المهمة؛ أعد شحن الرصيد ثم أعد المحاولة. |
404 | unknown_type | نوع المهمة المطلوب غير موجود في الكتالوج — راجع الاسم المرسل في الطلب. |
429 | rate_limited | تجاوزت الحد المسموح من الطلبات؛ انتظر قليلًا ثم أعد المحاولة. |