حساب عائد توزيعات أرباح المحفظة بالمتوسط المرجّح
تعلّم حساب عائد توزيعات أرباح المحفظة بقسمة الدخل السنوي على القيمة السوقية، ولماذا يضللك متوسط عمود العوائد، وكيف تصلح الحساب بدقة.
عائد توزيعات أرباح محفظتك هو رقم واحد: إجمالي دخل توزيعات الأرباح السنوي الذي يُتوقع أن تدفعه مراكزك، مقسوماً على إجمالي القيمة السوقية لهذه المراكز. وبصياغة أخرى، هو متوسط مرجّح بالقيمة السوقية للعوائد الفردية، حيث يمثّل وزن كل مركز قيمته بالدولار كنسبة من إجمالي المحفظة. أما متوسط عمود العوائد الظاهر على شاشة الوسيط فهو رقم مختلف، وفي معظم المحافظ الفعلية يكون هو الرقم الأكثر إغراءً ظاهرياً.
كيفية حساب عائد توزيعات أرباح المحفظة
لكل مركز، اضرب عدد الأسهم في توزيعات الأرباح السنوية لكل سهم. يعطيك ذلك الدخل السنوي للمركز بالدولار. اجمع هذه الدخول، ثم اقسمها على مجموع حاصل ضرب عدد الأسهم في السعر عبر جميع المراكز، واضرب الناتج في 100. هذه هي العملية الحسابية كاملة، سواء كانت المحفظة تضم أربعة مراكز أو أربعين.
يمكن كتابة ذلك بطريقتين متكافئتين:
- إجمالي الدخل السنوي مقسوماً على إجمالي القيمة السوقية للمحفظة.
- مجموع حاصل ضرب الوزن في العائد عبر جميع المراكز، حيث يساوي الوزن قيمة المركز مقسومة على قيمة المحفظة.
توضح الصيغة الثانية موطن الخطأ في المتوسط البسيط. يظهر كل مركز في الصيغتين، لكن كل مركز في الصيغة الصحيحة يحمل وزن دولاراته، لا صوتاً واحداً فقط. وينبغي أن يدخل النقد الذي تعدّه جزءاً من المحفظة في المقام أيضاً. فاستبعاده يرفع العائد المعلن من دون أن يضيف سنتاً واحداً إلى الدخل. وللحساب الخاص بسهم واحد، ابدأ من كيفية حساب عائد توزيعات الأرباح.
لماذا يبالغ متوسط عمود العوائد في تقدير دخلك
يسهل رؤية الفارق بين الطريقتين من خلال مثال عملي. الشيفرة أدناه مكتوبة بلغة Python 3 العادية، ولا تستورد أي شيء. ويمكن تشغيلها على أي جهاز يحتوي على python3. المراكز الخمسة افتراضية وأرقامها تقريبية، وقد اختيرت لتوضيح الأثر: اسم، وعدد أسهم، وسعر، وتوزيعات أرباح سنوية لكل سهم.
#!/usr/bin/env python3
# each row: (name, shares, price, annual dividend per share)
holdings = [
('A', 200, 50.00, 1.50),
('B', 150, 100.00, 2.00),
('C', 100, 80.00, 0.80),
('D', 300, 20.00, 1.00),
('E', 100, 10.00, 0.90),
]
total_value = sum(sh * px for _, sh, px, _ in holdings)
total_income = sum(sh * dps for _, sh, _, dps in holdings)
naive = sum(100 * dps / px for _, _, px, dps in holdings) / len(holdings)
print(f'market value : ${total_value:,.2f}')
print(f'annual income : ${total_income:,.2f}')
print(f'portfolio yield : {100 * total_income / total_value:.2f}%')
print(f'average of yields : {naive:.2f}%')
for name, sh, px, dps in holdings:
value = sh * px
income = sh * dps
print(
f'{name} weight {100 * value / total_value:5.1f}%'
f' yield {100 * dps / px:5.2f}%'
f' income ${income:8,.2f}'
f' share of income {100 * income / total_income:5.1f}%'
)
شغّل الشيفرة، وستجد اختلافاً حاداً بين السطرين الرئيسيين. تبلغ قيمة الأسهم في المحفظة $40,000، وتدفع $1,070 سنوياً، أي إن العائد المرجّح يبلغ 2.68%. أما المتوسط البسيط لأرقام العوائد الخمسة فيظهر عند 4.00%، أي نحو مرة ونصف المستوى الفعلي.
المركز E يفسّر النتيجة بالكامل. فعائده يبلغ 9.00%، وهو الأعلى في المحفظة، لكن قيمة أسهمه لا تتجاوز $1,000. ويمثّل ذلك 2.5% من قيمة المحفظة و8.4% من دخلها. أما في المتوسط البسيط، فيحصل هذا المركز على خُمس الأصوات، مثل مركز قيمته $15,000 بجواره. ولا يكتسب رقم العائد معنى فعلياً إلا بعد ربطه بالدولارات التي تقف وراءه.
كيف يبدو الترجيح في المراكز الفعلية
تتوزع الأسهم التي تدفع توزيعات أرباح على نطاق واسع من العوائد، وهذا ما يجعل اختيار طريقة الترجيح مهماً. يحسب الجزء أدناه العائد اللاحق لكل سهم من توزيعات الأرباح المعلنة لكل سهم خلال آخر اثني عشر شهراً، مقسوماً على أحدث سعر إغلاق يومي.
استعلام SQL الدقيق وراء كل رقم
WITH
last_px AS
(
SELECT
ticker,
toFloat64(argMax(close, date)) AS px,
formatDateTime(max(date), '%b %e, %Y') AS priced_through
FROM global_markets.stocks_daily_aggs
WHERE ticker IN ('AAPL', 'MSFT', 'HD', 'KO', 'PG', 'PEP', 'JNJ', 'XOM', 'CVX', 'VZ')
AND date >= today() - 30
GROUP BY ticker
),
ttm_dps AS
(
SELECT
ticker,
sum(amount) AS dps
FROM
(
SELECT
ticker,
id,
toFloat64(any(cash_amount)) AS amount
FROM global_markets.stocks_dividends
WHERE ticker IN ('AAPL', 'MSFT', 'HD', 'KO', 'PG', 'PEP', 'JNJ', 'XOM', 'CVX', 'VZ')
AND ex_dividend_date > today() - 365
AND ex_dividend_date <= today()
GROUP BY ticker, id
)
GROUP BY ticker
)
SELECT
p.ticker AS symbol,
round(d.dps, 2) AS ttm_dividend_usd,
round(100 * d.dps / p.px, 2) AS yield_pct,
p.priced_through AS priced_through
FROM last_px AS p
INNER JOIN ttm_dps AS d ON d.ticker = p.ticker
ORDER BY yield_pct DESCعبر هذه الأسماء البالغ عددها 10، والتي جرى تسعيرها حتى Aug 7, 2026، تتراوح العوائد من 5.96% عند VZ إلى 0.34% عند AAPL. ولا تقترب محفظة مبنية على فروق كهذه من منتصف العمود، إلا إذا تساوت المراكز تقريباً من حيث القيمة بالدولار.
والآن ضع خمسة منها في محفظة ذات أعداد أسهم ثابتة، واقرأ رقمين جنباً إلى جنب: حصة كل مركز من القيمة السوقية، وحصته من الدخل السنوي.
استعلام SQL الدقيق وراء كل رقم
WITH
positions AS
(
SELECT
tupleElement(p, 1) AS ticker,
toFloat64(tupleElement(p, 2)) AS shares
FROM
(
SELECT arrayJoin([('MSFT', 30.), ('PG', 60.), ('XOM', 80.), ('KO', 100.), ('VZ', 60.)]) AS p
)
),
last_px AS
(
SELECT
ticker,
toFloat64(argMax(close, date)) AS px
FROM global_markets.stocks_daily_aggs
WHERE ticker IN ('MSFT', 'PG', 'XOM', 'KO', 'VZ')
AND date >= today() - 30
GROUP BY ticker
),
ttm_dps AS
(
SELECT
ticker,
sum(amount) AS dps
FROM
(
SELECT
ticker,
id,
toFloat64(any(cash_amount)) AS amount
FROM global_markets.stocks_dividends
WHERE ticker IN ('MSFT', 'PG', 'XOM', 'KO', 'VZ')
AND ex_dividend_date > today() - 365
AND ex_dividend_date <= today()
GROUP BY ticker, id
)
GROUP BY ticker
),
holding AS
(
SELECT
pos.ticker AS ticker,
pos.shares * lp.px AS value_usd,
pos.shares * d.dps AS income_usd
FROM positions AS pos
INNER JOIN last_px AS lp ON lp.ticker = pos.ticker
INNER JOIN ttm_dps AS d ON d.ticker = pos.ticker
)
SELECT
h.ticker AS symbol,
round(100 * h.value_usd / t.total_value, 1) AS weight_pct,
round(100 * h.income_usd / t.total_income, 1) AS income_share_pct,
round(100 * h.income_usd / h.value_usd, 2) AS yield_pct
FROM holding AS h
CROSS JOIN
(
SELECT
sum(value_usd) AS total_value,
sum(income_usd) AS total_income
FROM holding
) AS t
ORDER BY weight_pct DESCيتكرر نمط الشيفرة مع الأسعار الفعلية. فالمركز MSFT هو الأكبر، إذ يمثل 31.4% من القيمة السوقية، بينما يوفر 10% من الدخل، بعائد يبلغ 0.72%. وعلى الطرف الآخر، يمثل VZ نسبة 5.9% من القيمة، ويدفع 15.7% من الدخل، بعائد يبلغ 5.96%. وينفصل الوزن عن حصة الدخل كلما اختلفت العوائد.
عند حساب المتوسط بالطريقتين، تعطي المراكز الخمسة نفسها إجابتين مختلفتين.
استعلام SQL الدقيق وراء كل رقم
WITH
positions AS
(
SELECT
tupleElement(p, 1) AS ticker,
toFloat64(tupleElement(p, 2)) AS shares
FROM
(
SELECT arrayJoin([('MSFT', 30.), ('PG', 60.), ('XOM', 80.), ('KO', 100.), ('VZ', 60.)]) AS p
)
),
last_px AS
(
SELECT
ticker,
toFloat64(argMax(close, date)) AS px
FROM global_markets.stocks_daily_aggs
WHERE ticker IN ('MSFT', 'PG', 'XOM', 'KO', 'VZ')
AND date >= today() - 30
GROUP BY ticker
),
ttm_dps AS
(
SELECT
ticker,
sum(amount) AS dps
FROM
(
SELECT
ticker,
id,
toFloat64(any(cash_amount)) AS amount
FROM global_markets.stocks_dividends
WHERE ticker IN ('MSFT', 'PG', 'XOM', 'KO', 'VZ')
AND ex_dividend_date > today() - 365
AND ex_dividend_date <= today()
GROUP BY ticker, id
)
GROUP BY ticker
),
holding AS
(
SELECT
pos.shares * lp.px AS value_usd,
pos.shares * d.dps AS income_usd
FROM positions AS pos
INNER JOIN last_px AS lp ON lp.ticker = pos.ticker
INNER JOIN ttm_dps AS d ON d.ticker = pos.ticker
)
SELECT
tupleElement(m, 1) AS method,
round(tupleElement(m, 2), 2) AS yield_pct
FROM
(
SELECT arrayJoin([
('Market-value weighted portfolio yield', weighted_yield),
('Simple average of the five yields', naive_yield)
]) AS m
FROM
(
SELECT
100 * sum(income_usd) / sum(value_usd) AS weighted_yield,
avg(100 * income_usd / value_usd) AS naive_yield
FROM holding
)
)
ORDER BY yield_pct DESCالخط الأعلى، عند 2.93%، هو رقم Simple average of the five yields. أما الرقم الآخر فيظهر عند 2.24%. واحد منهما فقط يتوافق مع النقد الفعلي. اضرب الرقم المرجّح في القيمة السوقية للمحفظة، فتستعيد الدخل السنوي. وافعل الشيء نفسه مع المتوسط البسيط، وستحصل على رقم لن يظهر في أي كشف حساب. والاتجاه هنا هيكلي: عندما تكون الأسماء الأعلى عائداً هي المراكز الأصغر، يكون المتوسط البسيط أعلى من عائد المحفظة الحقيقي. وعندما تكون الأسهم الأعلى عائداً هي المراكز الأكبر، يكون المتوسط البسيط أدنى منه.
العائد على التكلفة ليس عائد المحفظة
يقسم العائد على التكلفة توزيعات الأرباح السنوية الحالية على السعر الذي دفعته، لا على قيمة المركز اليوم. فإذا اشتريت مركزاً بسعر $20 ويتداول الآن عند $80، وما زال يدفع $1.00 سنوياً لكل سهم، فسيظهر العائد على التكلفة عند 5.00% مقابل عائد حالي يبلغ 1.25%. توزيعات الأرباح هي نفسها بالدولار. الذي تغيّر هو المقام فقط.
كلا الرقمين صحيح، لكن كل واحد يجيب عن سؤال مختلف. استخدام القيمة السوقية الحالية في المقام يخبرك بالعائد الذي تحققه المحفظة اليوم، وهو الرقم القابل للمقارنة مع عائد توزيعات أرباح جيد أو مع أذون الخزانة. أما استخدام أساس التكلفة في المقام فيخبرك عن عملية شراء أجريتها في الماضي. وتبدأ المشكلة عند خلط الرقمين داخل إجمالي واحد للمحفظة: عائد حالي للمشتريات الحديثة، وعائد على التكلفة للمراكز المحتفظ بها منذ عقد. ويؤدي هذا المزج بانتظام إلى مضاعفة العائد الظاهري لمحفظة الدخل، كما أنه لا يطابق أي رقم يعلنه الوسيط. يتناول مصائد عائد توزيعات الأرباح الوهم المعاكس، أي العائد الذي يظهر مرتفعاً بعد هبوط حاد في السعر.
تغيّر المدخلات اللاحقة أو المستقبلية النتيجة
تعتمد كل الأرقام أعلاه على رقم توزيعات الأرباح الذي يدخل في البسط. يجمع العائد اللاحق المدفوعات التي أُعلنت فعلياً خلال آخر اثني عشر شهراً. أما العائد المستقبلي فيحوّل أحدث دفعة إلى أساس سنوي، وعادةً ما يضرب أحدث توزيعات ربع سنوية في أربعة. ويختلف الرقمان لأي سهم غيّر توزيعاته أو دفع توزيعات خاصة خلال السنة. كما يمكن لمركز كبير واحد أن يغيّر إجمالي المحفظة بدرجة مؤثرة بمفرده. تستخدم الأجزاء هنا مدخلات لاحقة. ويوضح العائد اللاحق مقابل المستقبلي لتوزيعات الأرباح متى يكون كل منهما الخيار الصحيح.
العائد معدل، أما النقد فيصل على دفعات
العائد المرجّح هو معدل سنوي، وليس جدولاً للمدفوعات. وتدفع المراكز الخمسة نفسها توزيعاتها خلال عدد محدود من الأشهر المتقاربة، لأن معظم الشركات الأمريكية تصبح أسهمها ex-dividend كل ثلاثة أشهر، وتستخدم تقاويم متشابهة.
استعلام SQL الدقيق وراء كل رقم
WITH
positions AS
(
SELECT
tupleElement(p, 1) AS ticker,
toFloat64(tupleElement(p, 2)) AS shares
FROM
(
SELECT arrayJoin([('MSFT', 30.), ('PG', 60.), ('XOM', 80.), ('KO', 100.), ('VZ', 60.)]) AS p
)
),
payments AS
(
SELECT
ticker,
id,
any(ex_dividend_date) AS ex_date,
toFloat64(any(cash_amount)) AS amount
FROM global_markets.stocks_dividends
WHERE ticker IN ('MSFT', 'PG', 'XOM', 'KO', 'VZ')
AND ex_dividend_date > today() - 365
AND ex_dividend_date <= today()
GROUP BY ticker, id
)
SELECT
formatDateTime(toStartOfMonth(pay.ex_date), '%Y-%m') AS month,
formatDateTime(toStartOfMonth(pay.ex_date), '%b %Y') AS month_label,
round(sum(pos.shares * pay.amount), 2) AS income_usd
FROM payments AS pay
INNER JOIN positions AS pos ON pos.ticker = pay.ticker
GROUP BY month, month_label
ORDER BY monthوصل النقد خلال 12 شهراً مختلفاً من السنة اللاحقة، وكان أحدثها Jul 2026 عند $107.76. ولا يخبرك عائد محفظة يبلغ بضعة في المئة بأي شيء عن الشهر الذي يصل فيه المال. لذلك يحتاج أي تصور للدخل مبني على رقم شهري إلى التقويم إلى جانب المعدل. ولمعرفة المستوى العام للسوق الذي تُقارن به أرقام هذه المحافظ، راجع عائد توزيعات أرباح S&P 500.
الأسئلة الشائعة
كيف أحسب عائد توزيعات الأرباح لمحفظتي بالكامل؟
اجمع الدخل السنوي من توزيعات الأرباح لكل مركز، أي عدد الأسهم مضروباً في توزيعات الأرباح السنوية لكل سهم. ثم اجمع القيمة السوقية لكل مركز، أي عدد الأسهم مضروباً في السعر. بعد ذلك اقسم إجمالي الدخل على إجمالي القيمة واضرب الناتج في 100. النتيجة هي متوسط عوائد مراكزك المرجّح بالقيمة السوقية.
لماذا يكون متوسط عوائد مراكزي أعلى من عائد محفظتي؟
يعطي المتوسط البسيط كل مركز صوتاً واحداً. أما عائد المحفظة فيعطي كل مركز وزناً يتناسب مع دولاراته. وعندما تكون الأسماء الأعلى عائداً هي مراكزك الأصغر، يكون المتوسط البسيط أعلى من العائد الذي تدفعه المحفظة فعلياً، وقد يزيد عليه أحياناً بنحو النصف.
هل يدخل النقد في عائد توزيعات أرباح المحفظة؟
إذا كنت تعدّ النقد جزءاً من المحفظة، فينبغي أن يدخل في المقام مع عائد صفري، ما يخفض العائد. أما استبعاده فيعطي عائد الجزء المستثمر فقط. وكلتا الطريقتين صحيحة، ما دمت تطبق الطريقة نفسها في كل مرة تقيس فيها العائد.
هل العائد على التكلفة هو نفسه عائد محفظتي؟
لا. يقسم العائد على التكلفة توزيعات الأرباح الحالية على السعر الذي دفعته قبل سنوات، ولذلك يرتفع كلما ارتفع السهم. أما عائد المحفظة فيستخدم القيمة السوقية الحالية، وهي القيمة التي ترتبط بالدخل الذي تولده مراكزك الحالية.
هل تؤدي إضافة سهم واحد مرتفع العائد إلى رفع عائد محفظتي كثيراً؟
فقط بما يتناسب مع الدولارات المستثمرة فيه. فإذا كان سهم بعائد 9% يمثل 2.5% من المحفظة، فإنه يضيف نحو 0.2 نقطة مئوية إلى العائد المرجّح، أي 0.09 مضروباً في 0.025، بغض النظر عن تأثيره في متوسط عمود العوائد.
يتضمن كل جزء هنا استعلام SQL الدقيق الذي أنتجه، لذلك يمكن تدقيق عملية الترجيح سطراً بسطر. ولتشغيل الحساب نفسه على قائمة الأسماء وأعداد الأسهم الخاصة بك، اطلب ذلك باللغة الإنجليزية البسيطة على منصة Strasmore.