মাসিক স্টক রিটার্ন গণনার পদ্ধতি
মাসিক স্টক রিটার্ন নির্ভর করে আপনি কোন দুটি মূল্য ব্যবহার করছেন, লভ্যাংশ বা dividends অন্তর্ভুক্ত করছেন কি না এবং শেয়ার split সমন্বয় করা হয়েছে কি না তার ওপর।
কোনো শেয়ার "জুন মাসে কী করেছে" তা জানতে চাইলে আপনি বিভিন্ন উৎস থেকে ভিন্ন ভিন্ন সংখ্যা পাবেন—যার প্রতিটিই সঠিক। একটি মাসিক শেয়ারের রিটার্ন বা মুনাফা মূলত কিছু বিষয়ের ওপর নির্ভর করে যা সাধারণ মানুষ সাধারণত দেখেন না: কোন দুটি মূল্য দিয়ে মাসের শুরু ও শেষ নির্ধারণ করা হবে, লভ্যাংশ (dividends) অন্তর্ভুক্ত করা হবে কি না, এবং শেয়ার বিভাজনের (splits) জন্য মূল্য তালিকাটি সমন্বয় (adjusted) করা হয়েছে কি না। এই পৃষ্ঠাটি প্রকৃত বাজারের তথ্যের ভিত্তিতে বিভিন্ন প্রচলিত পদ্ধতিগুলো পাশাপাশি উপস্থাপন করে, যাতে এই পার্থক্যগুলো আর রহস্যময় না থাকে।
Close-to-close: আদর্শ রীতি
ইনডেক্স প্রদানকারী, ফান্ড ফ্যাক্ট শিট এবং অধিকাংশ কোট পেজে এই রীতিটি ব্যবহৃত হয়: মাসের রিটার্ন গণনা করা হয় পূর্ববর্তী মাসের শেষ রেগুলার-সেশনের ক্লোজিং প্রাইস থেকে এই মাসের শেষ ক্লোজ পর্যন্ত। মে মাসের শেষ ক্লোজ হলো জুনের শুরুর বিন্দু। এর গাণিতিক হিসাবটি খুবই সহজ — শেষ মূল্য থেকে শুরুর মূল্য বিয়োগ করে শুরুর মূল্য দিয়ে ভাগ করা। একটি উদাহরণ দেওয়া হলো: একটি স্টক মে মাসে $50.00 এ শেষ হলো এবং জুনে $53.50 এ শেষ হলো, তবে ওই মাসের রিটার্ন হলো (53.50 − 50.00) ÷ 50.00 = 0.07, বা ৭%। এই পৃষ্ঠার প্রতিটি রীতি সেই একই ফর্মুলায় ভিন্ন ভিন্ন ইনপুট প্রদান করে। জুন ২০২৬-এর প্রকৃত তথ্যের ভিত্তিতে প্রধান বিকল্পটির সাথে এর তুলনা নিচে দেওয়া হলো:
প্রতিটি সংখ্যার পেছনের সঠিক SQL
SELECT ticker,
round(argMaxIf(cl, day, day <= '2026-05-31'), 2) AS may_final_close,
round(argMinIf(op, day, day >= '2026-06-01'), 2) AS june_first_open,
round(argMaxIf(cl, day, day <= '2026-06-30'), 2) AS june_final_close,
round(100 * (argMaxIf(cl, day, day <= '2026-06-30') - argMaxIf(cl, day, day <= '2026-05-31'))
/ argMaxIf(cl, day, day <= '2026-05-31'), 2) AS close_to_close_pct,
round(100 * (argMaxIf(cl, day, day <= '2026-06-30') - argMinIf(op, day, day >= '2026-06-01'))
/ argMinIf(op, day, day >= '2026-06-01'), 2) AS open_to_close_pct,
round(abs(100 * (argMaxIf(cl, day, day <= '2026-06-30') - argMinIf(op, day, day >= '2026-06-01'))
/ argMinIf(op, day, day >= '2026-06-01')
- 100 * (argMaxIf(cl, day, day <= '2026-06-30') - argMaxIf(cl, day, day <= '2026-05-31'))
/ argMaxIf(cl, day, day <= '2026-05-31')), 2) AS convention_gap_points
FROM (
SELECT ticker,
toDate(toTimeZone(window_start, 'America/New_York')) AS day,
argMinIf(toFloat64(open), window_start, rth) AS op,
argMaxIf(toFloat64(close), window_start, rth) AS cl
FROM (
SELECT ticker, window_start, open, close,
toTimeZone(window_start, 'America/New_York') >= toDateTime(concat(toString(toDate(toTimeZone(window_start, 'America/New_York'))), ' 09:30:00'), 'America/New_York')
AND toTimeZone(window_start, 'America/New_York') < toDateTime(concat(toString(toDate(toTimeZone(window_start, 'America/New_York'))), ' 16:00:00'), 'America/New_York') AS rth
FROM global_markets.delayed_stocks_minute_aggs
WHERE ticker IN ('NVDA', 'SPY')
AND window_start >= '2026-05-28 04:00:00'
AND window_start < '2026-07-01 08:00:00'
)
GROUP BY ticker, day
)
GROUP BY ticker
ORDER BY tickerNVDA-এর জুন মাস ছিল -5.39% close-to-close — কিন্তু -7.4% জুনের প্রথম রেগুলার-সেশনের ওপেন থেকে শেষ ক্লোজ পর্যন্ত পরিমাপ করা হয়েছে। একই স্টক, একই মাস, তবে এই দুটি সঠিক উত্তরের মধ্যে পার্থক্য হলো 2.01 শতাংশ পয়েন্ট। এই পার্থক্যের একমাত্র কারণ হলো একটি রাত ও সপ্তাহান্তের সময়সীমা: NVDA মে মাসে $211.15 এ ক্লোজ করেছিল এবং জুনে $215.73 এ ওপেন করেছিল — এই লাফটি "open-to-close" রিতিতে "জুন" মাসের অন্তর্ভুক্ত, কিন্তু "close-to-close" রিতিতে এটি সীমানার অন্তর্ভুক্ত। SPY একই বিষয় আরও স্পষ্টভাবে দেখায়: -1.33% close-to-close বনাম -1.2% open-to-close।
কোনো সংখ্যাই ভুল নয়। Close-to-close উত্তর দেয় "মাস পরিবর্তনের সময় একজন দীর্ঘমেয়াদী বিনিয়োগকারী কী অভিজ্ঞতা অর্জন করেছেন?" আর open-to-close উত্তর দেয় "জুনের ওপেনে কেনা একজন বিনিয়োগকারীর জন্য ওই মাসের ট্রেডিং কী ফলাফল দিয়েছে?" যখনই বাজারের সীমানায় গ্যাপ তৈরি হয় তখনই এই দুইয়ের মধ্যে পার্থক্য দেখা যায় — এবং overnight gaps খুবই সাধারণ বিষয়, কোনো বিরল ঘটনা নয়।
লভ্যাংশ: প্রাইস রিটার্ন বনাম টোটাল রিটার্ন
দ্বিতীয় বিকল্পটি হলো: মাসে শেয়ার থেকে প্রাপ্ত নগদ অর্থ কি গণনায় আসবে? একটি price return এটি উপেক্ষা করে; একটি total return এটি পুনরায় যোগ করে। অধিকাংশ ক্ষেত্রে এক মাসের ব্যবধান খুব সামান্য হয় — একটি ত্রৈমাসিক লভ্যাংশ প্রদানকারী প্রতি ত্রৈমাসিকে তার ইল্ডের (yield) প্রায় এক-চতুর্থাংশ প্রদান করে — কিন্তু বছরের পর বছর ধরে এটি একটি বিশাল ব্যবধানে পরিণত হয়। জুন ২০২৬ ছিল একটি SPY পেমেন্ট মাস:
প্রতিটি সংখ্যার পেছনের সঠিক SQL
WITH px AS (
SELECT argMaxIf(cl, day, day <= '2026-05-31') AS may_close,
argMaxIf(cl, day, day <= '2026-06-30') AS jun_close
FROM (
SELECT ticker,
toDate(toTimeZone(window_start, 'America/New_York')) AS day,
argMinIf(toFloat64(open), window_start, rth) AS op,
argMaxIf(toFloat64(close), window_start, rth) AS cl
FROM (
SELECT ticker, window_start, open, close,
toTimeZone(window_start, 'America/New_York') >= toDateTime(concat(toString(toDate(toTimeZone(window_start, 'America/New_York'))), ' 09:30:00'), 'America/New_York')
AND toTimeZone(window_start, 'America/New_York') < toDateTime(concat(toString(toDate(toTimeZone(window_start, 'America/New_York'))), ' 16:00:00'), 'America/New_York') AS rth
FROM global_markets.delayed_stocks_minute_aggs
WHERE ticker IN ('NVDA', 'SPY')
AND window_start >= '2026-05-28 04:00:00'
AND window_start < '2026-07-01 08:00:00'
)
GROUP BY ticker, day
)
WHERE ticker = 'SPY'
),
dv AS (
SELECT sum(cash_amount) AS div_per_share
FROM global_markets.stocks_dividends
WHERE ticker = 'SPY'
AND ex_dividend_date >= '2026-06-01'
AND ex_dividend_date <= '2026-06-30'
)
SELECT round(may_close, 2) AS may_final_close,
round(jun_close, 2) AS june_final_close,
round(div_per_share, 4) AS june_dividend_per_share,
round(100 * (jun_close - may_close) / may_close, 2) AS price_return_pct,
round(100 * div_per_share / may_close, 2) AS dividend_contribution_pct,
round(100 * ((jun_close + div_per_share) - may_close) / may_close, 2) AS total_return_pct
FROM px CROSS JOIN dvSPY-এর জুন মাসের price return ছিল -1.33%; সেই মাসে ex-dividend হওয়া প্রতি শেয়ারের $1.9035 লভ্যাংশ যোগ করলে total return বেড়ে হয় -1.08% — যেখানে নগদ অর্থের অবদান 0.25%। ইনডেক্স পরিবারগুলো উভয় প্রকারের তথ্যই প্রকাশ করে (আপনি যে "S&P 500" দেখেন সেটি সাধারণত price index হয়), ফান্ড পারফরম্যান্স পেজে total return দেখানো বাধ্যতামূলক, এবং স্কিনারগুলোতে (screeners) এই দুটির মিশ্রণ দেখা যায়। কোনো লভ্যাংশ প্রদানকারী শেয়ারের ক্ষেত্রে যদি দুই উৎসের তথ্যে দশমিকের কয়েকের ভগ্নাংশ পার্থক্য থাকে, তবে লভ্যাংশই প্রথম সন্দেহভাজন বিষয় — ex-dividend date নির্ধারণ করে যে একটি পেমেন্ট কোন মাসের অন্তর্ভুক্ত হবে।
একটি মাত্র জুন মাস মাত্র কয়েক শতাংশের ভগ্নাংশ মাত্র। দীর্ঘ সময়কালই এই দুটি পদ্ধতির মধ্যে পার্থক্য তৈরি করে — নিচে পাঁচ বছরব্যাপী একই গাণিতিক হিসাব দেওয়া হলো:
প্রতিটি সংখ্যার পেছনের সঠিক SQL
WITH daily AS (
SELECT toDate(toTimeZone(window_start, 'America/New_York')) AS day,
argMaxIf(toFloat64(close), window_start,
toTimeZone(window_start, 'America/New_York') >= toDateTime(concat(toString(toDate(toTimeZone(window_start, 'America/New_York'))), ' 09:30:00'), 'America/New_York')
AND toTimeZone(window_start, 'America/New_York') < toDateTime(concat(toString(toDate(toTimeZone(window_start, 'America/New_York'))), ' 16:00:00'), 'America/New_York')) AS cl
FROM global_markets.delayed_stocks_minute_aggs
WHERE ticker = 'SPY'
AND ((window_start >= '2021-06-28 04:00:00' AND window_start < '2021-07-01 08:00:00')
OR (window_start >= '2026-06-26 04:00:00' AND window_start < '2026-07-01 08:00:00'))
GROUP BY day
),
px AS (
SELECT argMaxIf(cl, day, day <= '2021-06-30') AS start_close,
argMaxIf(cl, day, day <= '2026-06-30') AS end_close
FROM daily
),
dv AS (
SELECT round(sum(cash_amount), 2) AS divs_per_share,
count() AS payments
FROM global_markets.stocks_dividends
WHERE ticker = 'SPY'
AND ex_dividend_date >= '2021-07-01'
AND ex_dividend_date <= '2026-06-30'
)
SELECT round(start_close, 2) AS june_2021_close,
round(end_close, 2) AS june_2026_close,
divs_per_share AS dividends_paid_per_share,
payments AS dividend_payments,
round(100 * (end_close - start_close) / start_close, 2) AS five_year_price_return_pct,
round(100 * ((end_close + divs_per_share) - start_close) / start_close, 2) AS five_year_return_with_divs_pct,
round(100 * divs_per_share / start_close, 2) AS dividend_points_added
FROM px CROSS JOIN dv২০২১ সালের জুন মাসের $428.07 ক্লোজিং থেকে ২০২৬ সালের জুন মাসের $746.32 ক্লোজিং পর্যন্ত, SPY-এর পাঁচ বছরের price return হলো 74.35%। একই সময়ের মধ্যে এটি মোট $34.07 প্রতি শেয়ার লভ্যাংশ হিসেবে 20 বার প্রদান করেছে; সেই নগদ অর্থ গণনা করলে এই সংখ্যাটি বেড়ে হয় 82.3% — একটি লভ্যাংশ পুনরায় বিনিয়োগ করার আগে ব্যবধানটি হলো 7.96 পয়েন্ট। একটি প্রকৃত total-return ইনডেক্স প্রতিটি পেমেন্টকে তার ex-date-এ পুনরায় বিনিয়োগ করে, এবং সেই পুনঃবিনিয়োগকৃত শেয়ারগুলো ব্যবধানটিকে আরও বাড়িয়ে দেয়। একটি প্রতিষ্ঠিত কোম্পানি বা payer-এর ক্ষেত্রে, "large margins" কোনো বাগধারা নয়; এটি বছরের পর বছর ত্রৈমাসিক নগদ প্রবাহের স্বাভাবিক ফলাফল।
Adjusted close বনাম raw close: বিভাজনের ফাঁদ
অধিকাংশ চার্ট টুলস — যেমন Yahoo Finance, Google Finance, এবং বেশিরভাগ ব্রোকার অ্যাপ — একটি adjusted close প্রদান করে: এটি এমন একটি ঐতিহাসিক প্রাইস সিরিজ যেখানে অতীতের প্রাইসগুলোকে স্টক স্প্লিটের ভিত্তিতে ভাগ করা হয়েছে (এবং কিছু প্ল্যাটফর্মে ডিভিডেন্ডের জন্যও সমন্বয় করা হয়), যাতে সময়ের সাথে লাইনের তুলনা করা যায়। আমাদের ডেটাবেস প্রকৃত প্রিন্ট করা প্রাইস সংরক্ষণ করে। সাধারণ মাসে এই দুটির মান মিলে যায়। কিন্তু যে মাসে স্টক স্প্লিট ঘটে, সেখানে এরা সম্পূর্ণ ভিন্ন তথ্য দেয় — যেমন ২০২৪ সালের ১০ জুন ঘটে যাওয়া NVDA-এর ১০-for-one স্প্লিট:
প্রতিটি সংখ্যার পেছনের সঠিক SQL
WITH px AS (
SELECT argMaxIf(cl, day, day <= '2024-05-31') AS may_close,
argMaxIf(cl, day, day <= '2024-06-30') AS jun_close
FROM (
SELECT toDate(toTimeZone(window_start, 'America/New_York')) AS day,
argMaxIf(toFloat64(close), window_start,
toTimeZone(window_start, 'America/New_York') >= toDateTime(concat(toString(toDate(toTimeZone(window_start, 'America/New_York'))), ' 09:30:00'), 'America/New_York')
AND toTimeZone(window_start, 'America/New_York') < toDateTime(concat(toString(toDate(toTimeZone(window_start, 'America/New_York'))), ' 16:00:00'), 'America/New_York')) AS cl
FROM global_markets.delayed_stocks_minute_aggs
WHERE ticker = 'NVDA'
AND window_start >= '2024-05-29 04:00:00'
AND window_start < '2024-07-01 08:00:00'
GROUP BY day
)
),
sp AS (
SELECT split_to / split_from AS ratio
FROM global_markets.stocks_splits
WHERE ticker = 'NVDA'
AND execution_date >= '2024-06-01'
AND execution_date <= '2024-06-30'
)
SELECT round(may_close, 2) AS may_final_close_raw,
round(jun_close, 2) AS june_final_close_raw,
toInt32(ratio) AS shares_after_split_per_old_share,
round(100 * (jun_close - may_close) / may_close, 2) AS raw_price_change_pct,
round(may_close / ratio, 2) AS may_close_split_adjusted,
round(100 * (jun_close - may_close / ratio) / (may_close / ratio), 2) AS adjusted_return_pct
FROM px CROSS JOIN spRaw ডেটা অনুযায়ী, সেই জুন মাসে NVDA $1097.46 থেকে $123.41 এ নেমেছে — যা একটি -88.75% পতন। বাস্তবে এমন কিছুই ঘটেনি: স্প্লিটের তারিখে প্রতিটি পুরনো শেয়ার 10টি নতুন শেয়ারে রূপান্তরিত হয় এবং প্রাইস সেই অনুপাতে ভাগ হয়ে যায়, ফলে প্রতিটি হোল্ডারের ডলার ভ্যালু অপরিবর্তিত থাকে। মে মাসের ক্লোজ প্রাইস একই রেশিও দিয়ে ভাগ করলে — যা স্প্লিট-অ্যাডজাস্টেড হিসেবে $109.75 — জুন ২০২৪ এর মান হয় 12.45%, যা একটি ঊর্ধ্বমুখী মাস। যে কোনো সোর্স যদি অ্যাডজাস্টেড ডেটা প্রদান করে, তবে তারা দ্বিতীয় ফিগারটির কাছাকাছি ফলাফল দেখাবে; আর raw প্রিন্টের ওপর ভিত্তি করে করা সাধারণ গণনা প্রথমটি দেখাবে। ঐতিহাসিক মাসিক রিটার্নের ক্ষেত্রে দুটি সোর্সের মধ্যে বড় ধরনের অমিল হওয়ার সবচেয়ে সাধারণ কারণ হলো adjusted close। যখন কোনো ফিগার যেকোনো একদিকে অসম্ভব বড় দেখায়, তখন অন্য সবকিছুর আগে split calendar পরীক্ষা করে দেখুন।
কোন "ক্লোজ"টি প্রকৃত ক্লোজ?
প্রথাগত নিয়মাবলির মধ্যে আরও একটি সীমাবদ্ধতা রয়েছে: ক্লোজিং প্রাইস বা সমাপনী মূল্য। প্রতিটি ফ্যাক্ট শিটে ব্যবহৃত সংখ্যাটি হলো অফিসিয়াল ক্লোজিং-অকশন প্রিন্ট — যা পূর্বাহ্নে ৪:০০ PM ET সময়ে closing auction দ্বারা নির্ধারিত একটি একক মূল্য। কিন্তু অফিসিয়াল সময়ের পরেও ট্রেডিং চলতে থাকে, এবং বর্ধিত সেশনের শেষ প্রিন্টটি অফিসিয়াল ক্লোজ থেকে ভিন্ন হতে পারে:
প্রতিটি সংখ্যার পেছনের সঠিক SQL
SELECT round(argMaxIf(toFloat64(close), window_start, rth), 2) AS regular_session_close,
round(argMax(toFloat64(close), window_start), 2) AS last_extended_print,
round(100 * (argMax(toFloat64(close), window_start) - argMaxIf(toFloat64(close), window_start, rth))
/ argMaxIf(toFloat64(close), window_start, rth), 3) AS after_hours_drift_pct
FROM (
SELECT window_start, close,
toTimeZone(window_start, 'America/New_York') >= toDateTime('2026-06-30 09:30:00', 'America/New_York')
AND toTimeZone(window_start, 'America/New_York') < toDateTime('2026-06-30 16:00:00', 'America/New_York') AS rth
FROM global_markets.delayed_stocks_minute_aggs
WHERE ticker = 'SPY'
AND window_start >= '2026-06-30 04:00:00'
AND window_start < '2026-07-01 08:00:00'
)৩০ জুন এই দুটির মধ্যে পার্থক্য ছিল -0.003% — সেই সন্ধ্যায় এটি ছিল সামান্য, কিন্তু কোনো নির্দিষ্ট স্টকের আর্নিং নাইটে বর্ধিত সেশনে এমন বড় পরিবর্তন হতে পারে যা অফিসিয়াল মাসিক রিটার্নে পরবর্তী মাসের হিসেবে গণ্য হবে। After-hours and premarket trading এই বিষয়টি বিস্তারিতভাবে ব্যাখ্যা করে। একটি সংশ্লিষ্ট ব্যতিক্রম হলো: মাসের শেষ দিনটি কখনও কখনও ছুটির কারণে সংক্ষিপ্ত সেশনের ওপর পড়ে, যেখানে সাধারণ লেনদেন দুপুর ১:০০ PM ET সময়ে শেষ হয় এবং অফিসিয়াল ক্লোজ একটি দ্রুত ক্লোজিং অকশনের মাধ্যমে নির্ধারিত হয় — market holiday schedule এ এগুলোর তালিকা রয়েছে।
Compounding twelve months into a year
A yearly return is not the sum of twelve monthly returns — it is their product. The linking formula: convert each month into a growth factor (1 + return), multiply the twelve factors together, subtract 1. A −5% month followed by a +5% month sums to zero but compounds to 0.95 × 1.05 − 1 = −0.25%. Here is SPY's actual monthly path over the twelve months ending June 2026:
প্রতিটি সংখ্যার পেছনের সঠিক SQL
WITH daily AS (
SELECT toDate(toTimeZone(window_start, 'America/New_York')) AS day,
argMaxIf(toFloat64(close), window_start,
toTimeZone(window_start, 'America/New_York') >= toDateTime(concat(toString(toDate(toTimeZone(window_start, 'America/New_York'))), ' 09:30:00'), 'America/New_York')
AND toTimeZone(window_start, 'America/New_York') < toDateTime(concat(toString(toDate(toTimeZone(window_start, 'America/New_York'))), ' 16:00:00'), 'America/New_York')) AS cl
FROM global_markets.delayed_stocks_minute_aggs
WHERE ticker = 'SPY'
AND window_start >= '2025-06-24 04:00:00'
AND window_start < '2026-07-01 08:00:00'
GROUP BY day
),
monthly AS (
SELECT toStartOfMonth(day) AS month_start,
argMax(cl, day) AS month_close
FROM daily
GROUP BY month_start
),
rets AS (
SELECT month_start,
formatDateTime(month_start, '%Y-%m') AS month,
round(month_close, 2) AS month_final_close,
100 * (month_close / lagInFrame(month_close) OVER (ORDER BY month_start) - 1) AS r
FROM monthly
)
SELECT month,
month_final_close,
round(r, 2) AS simple_return_pct,
round(100 * log(1 + r / 100), 2) AS log_return_pct
FROM rets
WHERE isFinite(r)
ORDER BY month_startTwelve close-to-close months, from 2.28% in 2025-07 to -1.33% in 2026-06 — the last row is the same SPY June 2026 figure the first panel measured. Link the twelve properly and compare against the shortcut of just adding the percentages:
প্রতিটি সংখ্যার পেছনের সঠিক SQL
WITH daily AS (
SELECT toDate(toTimeZone(window_start, 'America/New_York')) AS day,
argMaxIf(toFloat64(close), window_start,
toTimeZone(window_start, 'America/New_York') >= toDateTime(concat(toString(toDate(toTimeZone(window_start, 'America/New_York'))), ' 09:30:00'), 'America/New_York')
AND toTimeZone(window_start, 'America/New_York') < toDateTime(concat(toString(toDate(toTimeZone(window_start, 'America/New_York'))), ' 16:00:00'), 'America/New_York')) AS cl
FROM global_markets.delayed_stocks_minute_aggs
WHERE ticker = 'SPY'
AND window_start >= '2025-06-24 04:00:00'
AND window_start < '2026-07-01 08:00:00'
GROUP BY day
),
monthly AS (
SELECT toStartOfMonth(day) AS month_start,
argMax(cl, day) AS month_close
FROM daily
GROUP BY month_start
),
rets AS (
SELECT month_start,
100 * (month_close / lagInFrame(month_close) OVER (ORDER BY month_start) - 1) AS r
FROM monthly
),
ends AS (
SELECT argMin(month_close, month_start) AS base_close,
argMax(month_close, month_start) AS final_close
FROM monthly
)
SELECT count() AS months_linked,
round(sum(r), 2) AS simple_sum_pct,
round(100 * (exp(sum(log(1 + r / 100))) - 1), 2) AS geometric_compound_pct,
round(100 * (any(final_close) / any(base_close) - 1), 2) AS direct_twelve_month_pct,
round(100 * (exp(sum(log(1 + r / 100))) - 1) - sum(r), 2) AS compounding_gap_points,
round(sum(100 * log(1 + r / 100)), 2) AS sum_of_monthly_log_returns_pct,
round(100 * log(any(final_close) / any(base_close)), 2) AS twelve_month_log_return_pct
FROM rets CROSS JOIN ends
WHERE isFinite(r)The twelve months sum to 19.83% but compound to 20.79% — and the direct calculation, June 2025's close straight to June 2026's, gives 20.79%, matching the compounded figure rather than the sum. The gap here is 0.96 points on one calm-ish year; it widens with volatility and horizon. Adding monthly percentages is a common spreadsheet habit, and it is quietly wrong.
The last two columns show the convention built for adding: the log return, the natural logarithm of the growth factor, ln(1 + return). Monthly log returns sum to 18.89% — identical to the twelve-month log return of 18.89%, which is exactly why analysts and risk models use them. For small months the two conventions barely differ (2025-11: 0.21% simple, 0.21% log); the bigger the month, the wider they split (2026-04: 10.49% simple, 9.97% log). Fund fact sheets quote simple returns; log returns live in research papers and volatility math.
যেকোনো দুটি উৎসের মধ্যে অমিল দূর করার চেকলিস্ট
যখন দুটি মাসিক রিটার্ন ফিগার বা অংকের মধ্যে অমিল দেখা দেয়, তখন তা সাধারণত নিচের চারটি বিষয়ের যেকোনো একটির কারণে ঘটে:
- Endpoints — close-to-close (মানদণ্ড হিসেবে ব্যবহৃত) অথবা open-to-close (মাসের নিজস্ব ট্রেডিং)। যখন সীমানা বা boundary গ্যাপ থাকে, তখন এই দুইয়ের মধ্যে পার্থক্য দেখা যায়।
- Dividends — price return অথবা total return। যে কোনো মাসে যদি ex-dividend তারিখ থাকে, তবে এই দুইয়ের মধ্যে পার্থক্য দেখা যায়।
- Adjustment — raw prints অথবা adjusted-close series। যে কোনো মাসে যদি split ঘটে, তবে এই দুইয়ের মধ্যে ব্যাপক পার্থক্য দেখা যায়।
- The close itself — অফিসিয়াল অকশন প্রিন্ট (মানদণ্ড হিসেবে ব্যবহৃত) অথবা শেষ ট্রেড যা extended hours অন্তর্ভুক্ত করতে পারে।
উভয় উৎসের জন্য একই সুইচ বা সেটিংস ব্যবহার করলে অমিলটি দূর হয়ে যায় — এবং একটি fund-versus-index তুলনা তখনই সঠিক হয় যখন উভয় ফিগার একই চারটি সেটিংস অনুসরণ করে; একটিতেও অমিল থাকলে তুলনাটি পারফরম্যান্সের পরিবর্তে সেই সেটিংসের পার্থক্যকেই পরিমাপ করে। আমাদের নিজস্ব June 2026 recap ঠিক এই কারণেই এর নিয়মাবলী আগেভাগেই জানিয়ে দেয় — সেখানে প্রতিটি মাসিক সংখ্যা হলো close-to-close, official prints, এবং price return।
মাসিক রিটার্ন সংক্রান্ত সাধারণ জিজ্ঞাসা
close-to-close রিটার্ন কী?
পূর্ববর্তী পিরিয়ডের নিয়মিত সেশনের শেষ ক্লোজিং প্রাইস থেকে বর্তমান পিরিয়ডের শেষ ক্লোজিং প্রাইসের শতাংশ পরিবর্তনকে close-to-close রিটার্ন বলা হয়। ফ্যাক্ট শিট এবং ইনডেক্স রিপোর্টে দৈনিক, মাসিক এবং বার্ষিক স্টক রিটার্নের ক্ষেত্রে এটি একটি আদর্শ পদ্ধতি।
একই স্টক এবং মাসের জন্য দুটি ওয়েবসাইটে ভিন্ন ভিন্ন রিটার্ন কেন দেখা যায়?
এর কারণ প্রায়শই চারটি পদ্ধতির মধ্যে যেকোনো একটি হতে পারে: ভিন্ন এন্ডপয়েন্ট (close-to-close বনাম open-to-close), ডিভিডেন্ড অন্তর্ভুক্ত করা হয়েছে কি হয়নি, র র প্রাইস বনাম স্প্লিট-অ্যাডজাস্টেড প্রাইস, অথবা ক্লোজিং প্রাইসের ভিন্ন উৎস। শুধুমাত্র প্রথম পরিবর্তনের ক্ষেত্রেই NVDA-এর ২০২৬ সালের জুন মাসের পরিমাপে -5.39% অথবা -7.4% দেখা যায়।
স্টক স্প্লিট কি মাসিক রিটার্ন গণনা পরিবর্তন করে?
এটি পরিবর্তন করা উচিত নয় — স্প্লিট শেয়ার সংখ্যা এবং দাম উভয়কেই একসাথে পরিবর্তন করে, ফলে পজিশন ভ্যালু অপরিবর্তিত থাকে — কিন্তু এটি র র প্রাইসের ওপর করা যেকোনো গণনাকে ভুল করে দেয়। NVDA-এর ২০২৪ সালের জুন মাসের র র ক্লোজ অনুযায়ী ফলাফল -88.75% এর মতো দেখায় এবং ১০-for-one স্প্লিট অ্যাডজাস্ট করার পর এটি 12.45% পরিমাপ করে।
মাসিক স্টক রিটার্নে কি ডিভিডেন্ড অন্তর্ভুক্ত থাকে?
শুধুমাত্র টোটাল রিটার্নে এটি অন্তর্ভুক্ত থাকে। প্রাইস রিটার্ন — যার মধ্যে প্রধান S&P 500 ইনডেক্স লেভেল অন্তর্ভুক্ত — ডিভিডেন্ড বাদ দিয়ে গণনা করা হয়। ২০২৬ সালের জুনে SPY-এর মাসিক রিটার্নে ডিভিডেন্ড 0.25% যোগ করেছিল, যা এর প্রাইস এবং টোটাল রিটার্নের মধ্যে পার্থক্য নির্দেশ করে।
আমার ব্যক্তিগত পোর্টফোলিও-র মাসিক রিটার্ন কি একইভাবে গণনা করা হয়?
নগদ অর্থ লেনদেন (in or out) শুরু হলে তা আর একইভাবে গণনা করা হয় না। এই পৃষ্ঠায় দেখানো সিঙ্গেল-সিকিউরিটি রিটার্নগুলো হলো time-weighted; কিন্তু ডিপোজিট এবং উইথড্রয়াল যুক্ত অ্যাকাউন্টের ক্ষেত্রে money-weighted (internal-rate-of-return) গণনা প্রয়োজন, অন্যথায় নগদ প্রবাহের কারণে পারফরম্যান্স ভুল দেখাবে। বেশিরভাগ ব্রোকার আপনার ডিপোজিটগুলোকে সংখ্যা থেকে বাদ দেওয়ার জন্য সুনির্দিষ্টভাবে time-weighted ফিগার রিপোর্ট করে।
উপরে উল্লিখিত প্রতিটি সংখ্যা র র টেপ-এর একটি সংরক্ষিত এবং ভার্সনযুক্ত কুয়েরি — যেকোনো প্যানেলের SQL বিস্তারিত দেখুন, অথবা Strasmore টার্মিনালে যেকোনো কনভেনশনের অধীনে যেকোনো টিকারের মাস পরিমাপ করুন।