برتری وزندهی برابر بر بهینهسازی در نمونههای کوتاه
تحلیل عملکرد استراتژی وزندهی برابر در مقایسه با بهینهسازی اندازه موقعیت نشان میدهد که در نمونههای آماری کوتاه، روش 1/N به دلیل عدم نیاز به برآورد، بازدهی پایدارتری دارد.
وزندهی برابر در برابر بهینهسازی اندازه موقعیت
وزندهی برابر (Equal weight) در شرایطی که نمونه آماری برای تعیین دقیق بازده مورد انتظار بسیار کوتاه است، عملکرد بهتری نسبت به بهینهسازی اندازه موقعیت دارد؛ و باید گفت که نمونههای کوتاه، نه یک استثنا، بلکه وضعیت معمول در بازارها هستند. یک بهینهساز (Optimizer)، در واقع محاسبات ریاضی درستی است که بر روی دادههای ورودیِ غیردقیق اعمال میشود. سبد 1/N یا همان وزندهی برابر، هیچ برآوردی انجام نمیدهد و دقیقاً به همین دلیل است که در زمان نادرست بودن برآوردها، همچنان کارایی خود را حفظ میکند.
آیا وزندهی برابر واقعاً از بهینهسازی بهتر عمل میکند؟
تحت یک شرایط خاص، بله. بیایید این مفاهیم را یکبهیک بررسی کنیم. وزندهی برابر که به صورت 1/N نوشته میشود، سرمایه را بهطور مساوی بین N موقعیت تقسیم میکند و به هیچ نوع پیشبینی نیاز ندارد. بهینهسازی میانگین-واریانس، وزنهایی را محاسبه میکند که بهترین بازده مورد انتظار را به ازای هر واحد واریانس برآوردی ارائه میدهند. معیار کلی (Kelly criterion) وزنهایی را محاسبه میکند که رشد مرکب بلندمدت را به حداکثر میرساند؛ در داراییهای فاقد همبستگی، پاسخ این معیار به وزنی متناسب با بازده مازاد مورد انتظار هر دارایی تقسیم بر واریانس آن کاهش مییابد. راهنمای ما در تعیین اندازه موقعیت با معیار کلی این فرمول را با جزئیات بررسی میکند.
هر دو مدل بهینهساز به یک ورودی واحد نیاز دارند: بازده مورد انتظار برای هر دارایی. این همان کمیتی است که نمونهگیری، آن را با بدترین دقت برآورد میکند. نوسانپذیری (Volatility) با دقت قابلقبولی از یک بازه زمانی کوتاه استخراج میشود. اما میانگین چنین نیست و شکاف بین این دو به اندازهای بزرگ است که در هر تاریخچه قیمتی قابل مشاهده است. پنل زیر شش نماد پرطرفدار را انتخاب کرده، هر سال تقویمی از 2015 تا 2024 را بهطور مجزا اندازهگیری میکند و گزارش میدهد که بالاترین و پایینترین برآورد سالانه چقدر با هم فاصله دارند. این کار برای هر نماد دو بار انجام شده است: یک بار برای میانگین بازده روزانه سالانه شده و یک بار برای نوسانپذیری سالانه شده.
کد دقیق SQL پشت هر عدد
WITH prices AS
(
SELECT
ticker,
date,
toFloat64(max(close)) AS c
FROM global_markets.stocks_daily_aggs
WHERE ticker IN ('AAPL', 'MSFT', 'NVDA', 'SPY', 'KO', 'JNJ')
AND date >= '2015-01-01'
AND date < '2025-01-01'
GROUP BY ticker, date
),
rets AS
(
SELECT
ticker,
date,
c / lagInFrame(c, 1) OVER (PARTITION BY ticker ORDER BY date ASC ROWS BETWEEN 1 PRECEDING AND CURRENT ROW) - 1 AS ret
FROM prices
),
yearly AS
(
SELECT
ticker,
toYear(date) AS yr,
avg(ret) * 252 * 100 AS mean_pct,
stddevPop(ret) * sqrt(252) * 100 AS vol_pct
FROM rets
WHERE isFinite(ret)
GROUP BY ticker, yr
HAVING count() >= 200
)
SELECT
ticker,
round(max(mean_pct) - min(mean_pct), 1) AS mean_estimate_range_pct,
round(max(vol_pct) - min(vol_pct), 1) AS vol_estimate_range_pct
FROM yearly
GROUP BY ticker
ORDER BY mean_estimate_range_pct DESCبرای NVDA، دامنه برآورد میانگین سالانه در طول آن ده سال، 184.7 واحد درصد است، در حالی که دامنه نوسانپذیری برای همان نماد در همان سالها 28.6 واحد است. باثباتترین نماد در این پنل، یعنی KO، همچنان میانگین برآورد سالانه خود را به میزان 23.9 واحد تغییر داده است. هر طرحی که میانگین بازده سال گذشته را بهعنوان بازده مورد انتظار سال جاری به یک بهینهساز بدهد، در واقع عددی را به آن تزریق میکند که تا این حد دارای نوسان و عدم قطعیت است.
برای برآورد بازده مورد انتظار به چه بازه زمانی از دادهها نیاز است؟
خطای استاندارد میانگین بازده برآوردشده، برابر است با نوسانپذیری دارایی تقسیم بر جذر طول دوره نمونه به سال. منظور از طول دوره، سال است، نه تعداد مشاهدات؛ چرا که نمونهگیری از همان دوازده ماه به صورت ساعتی به جای روزانه، هیچ ارزش افزودهای ایجاد نمیکند. اگر دارایی با نوسانپذیری 20 درصد را در این فرمول قرار دهیم، یک سال داده تاریخی، خطای استانداردی معادل 20 واحد درصد در سال به دست میدهد. چهار سال داده، این خطا را به 10 واحد درصد کاهش میدهد. رسیدن به دقت یک واحد درصد، یعنی همان دقتی که پیش از رتبهبندی دو دارایی با اختلاف میانگین واقعی دو واحد درصد به آن نیاز دارید، مستلزم چهار قرن داده است.
نوسانپذیری وضعیت متفاوتی دارد. دقت آن با تعداد مشاهدات بهبود مییابد، نه با بازه زمانی تقویمی؛ بنابراین تنها چند ماه داده روزانه کافی است تا دقت آن در محدوده چند واحد قرار گیرد. جدول زیر، بازدههای روزانه یک صندوق شاخصی در بیست سال گذشته را به بلوکهایی با طول ثابت و بدون همپوشانی تقسیم کرده، هر دو برآورد را در هر بلوک محاسبه نموده و میزان پراکندگی این برآوردها را در بلوکهای مختلف گزارش میکند.
کد دقیق SQL پشت هر عدد
WITH prices AS
(
SELECT
date,
toFloat64(max(close)) AS c
FROM global_markets.stocks_daily_aggs
WHERE ticker = 'SPY'
AND date >= '2005-01-01'
AND date < '2025-01-01'
GROUP BY date
),
rets AS
(
SELECT
date,
c / lagInFrame(c, 1) OVER (ORDER BY date ASC ROWS BETWEEN 1 PRECEDING AND CURRENT ROW) - 1 AS ret
FROM prices
),
numbered AS
(
SELECT
ret,
row_number() OVER (ORDER BY date ASC) AS i
FROM rets
WHERE isFinite(ret)
),
sweep AS
(
SELECT
arrayJoin([21, 63, 126, 252, 504]) AS n,
i,
ret
FROM numbered
),
blocks AS
(
SELECT
n,
intDiv(i - 1, n) AS blk,
avg(ret) * 252 * 100 AS mean_pct,
stddevPop(ret) * sqrt(252) * 100 AS vol_pct
FROM sweep
GROUP BY n, blk
HAVING count() = n
)
SELECT
concat(toString(n), ' sessions') AS sample_length,
round(stddevPop(mean_pct), 1) AS mean_estimate_spread_pct,
round(stddevPop(vol_pct), 1) AS vol_estimate_spread_pct,
count() AS window_count
FROM blocks
GROUP BY n
ORDER BY n ASCدر بلوکهای 21 sessions، پراکندگی برآورد میانگین برابر با 53.7 واحد درصد است، در حالی که این رقم برای برآورد نوسانپذیری در همان بلوکهای مشابه، 10.9 واحد است. با افزایش طول بلوک به 504 sessions، پراکندگی میانگین به 10.6 واحد کاهش مییابد. این کاهش طبق رابطه جذر صورت میگیرد: هر نصف کردن خطا، مستلزم چهار برابر کردن حجم دادههاست.
یک شبیهسازی بذرگذاریشده که میتوانید خودتان اجرا کنید
هیچکدام از اینها ثابت نمیکند که خطای تخمین بهاندازهای بزرگ است که پیروزی را به استراتژی 1/N تقدیم کند. اما این مورد ثابت میکند. این دستورالعمل تنها به نصب پایتون نیاز دارد و بس: بدون فایل داده، بدون دانلود و بدون بستههای شخص ثالث. این شبیهسازی، بازدهیهای خود را از پارامترهایی که شما انتخاب میکنید استخراج میکند، بنابراین پاسخ واقعی مشخص است و هر دو تخصیص دارایی را میتوان بر اساس آن امتیازدهی کرد.
- دو ماژول
import randomوimport statistics، بهعلاوهfrom math import logرا وارد کنید. بذر (seed) را در خط بعدی باrandom.seed(20260816)تنظیم کنید. - پنج دارایی با بازدهی سالانه مورد انتظار واقعی 5، 6، 7، 8 و 9 درصد تعریف کنید که هر کدام دارای نوسانپذیری سالانه واقعی 20 درصد و بدون همبستگی باشند. با استفاده از
mu_d = mu_a / 252وsd_d = sd_a / (252 ** 0.5)آنها را به گامهای روزانه تبدیل کنید. - یک طول نمونه T را از بازه
[60, 125, 250, 500, 1000, 2500, 5000]انتخاب کنید. - برای هر دارایی، T بازدهی روزانه را با
random.gauss(mu_d, sd_d)استخراج کنید. این استخراج، کل تاریخی است که مدیر در اختیار دارد. - میانگین هر دارایی را با
statistics.meanو نوسانپذیری آن را باstatistics.stdevتخمین بزنید. این دو تخمین، تمام چیزی است که بهینهساز از آن آگاه است. - سبد با وزن برابر را با تخصیص 0.2 به هر یک از پنج دارایی بسازید. این سبد از هیچکدام از تخمینها استفاده نمیکند.
- سبد بهینهشده را با تنظیم هر وزن خام روی
mu_hat / (sd_hat ** 2)بسازید، سپس هر وزن را بر مجموع وزنهای خام مطلق تقسیم کنید که هر دو سبد را در معرض ریسک ناخالص یکسانی قرار میدهد. - یک مسیر جدید خارج از نمونه (out-of-sample) شامل 2520 بازدهی روزانه برای هر دارایی از پارامترهای واقعی استخراج کنید. هیچکدام از تخصیصها این مسیر را ندیدهاند.
- هر دو را در آن مسیر با میانگین
log(1 + r)امتیازدهی کنید، که در آن r مجموع وزنی بازدهی پنج دارایی در آن روز است. - مراحل 4 تا 9 را برای 2000 آزمایش مستقل در هر T تکرار کنید و سهم آزمایشهایی را که در آنها وزن برابر، عملکرد بهتری نسبت به وزنهای بهینهشده دارد، ثبت کنید.
بازه را از T کوتاه تا T بلند بخوانید. در سمت کوتاه، وزن برابر در اکثریت قاطع آزمایشها پیروز میشود. با افزایش T، این سهم بهطور پیوسته کاهش مییابد و در سمت بلند، وزنهای بهینهشده در بیشتر آنها برنده میشوند. جایی در میانه، این دو با هم تلاقی میکنند. نقطه تلاقی با تغییر بذر و تغییر اسپرد بین میانگینهای واقعی جابهجا میشود. جهت حرکت تغییر نمیکند: دادههای بیشتر به نفع بهینهساز و دادههای کمتر به نفع 1/N است. برای تکرار، عدد صحیح داخل random.seed(20260816) را تغییر دهید و دوباره بازه را اجرا کنید.
چرا بهینهساز، برآورد میانگینِ نادرست را تشدید میکند
به محل ورود برآوردها به وزندهی دقت کنید. برآورد میانگین در صورت کسر و برآورد واریانس در مخرج قرار دارد. دو برابر کردن برآورد میانگین، وزن را دو برابر میکند. کاهش یکچهارمی برآورد واریانس، وزن را یکسوم افزایش میدهد. در یک نمونه خوششانس، هر دو خطا در یک جهت عمل میکنند: یک دوره از دادههای مطلوب، میانگین اندازهگیریشده را بالا میبرد و اغلب واریانس اندازهگیریشده را در همان بازه زمانی کاهش میدهد. بهینهساز، آن دارایی را بهعنوان گزینه برتر گروه شناسایی کرده و وزن آن را متناسب با آن تعیین میکند. در خارج از نمونه، آن دارایی دوباره به یک عضو معمولی از گروه تبدیل میشود. وزن برابر (Equal weight) هرگز آن نمونه خوششانس را ندیده است.
شبیهسازی، نسخه ملایم این مشکل است. پنج دارایی بدون همبستگی، یک ماتریس کوواریانس قطری باقی میگذارند که نیازی به معکوسسازی ندارد. سبدهای واقعی دارای همبستگی هستند و ماتریس کوواریانس نمونه که از تعداد مشاهداتی اندکی بیش از تعداد داراییها ساخته شده، به حالت تکین (singular) نزدیک است. معکوس کردن آن، خطاهای کوچک ورودی را به وزنهای بسیار بزرگ تبدیل میکند؛ این همان فرآیندی است که بهینهساز از طریق آن به موقعیتی میرسد که ارزش آن چندین برابر سرمایه در یک نماد است، در حالی که یک موقعیت فروش (short) جبرانی در جایگزین نزدیک آن دارد. یادداشت ما در مورد ریسک تمرکز در سبد سهام بررسی میکند که چنین وزنی چه تأثیری بر افت ارزش (drawdown) دارد.
ورودیها نیز ثابت نمیمانند. نمودار زیر، میانگین بازده روزانه یکساله متحرک (سالانه شده و بهصورت ماهانه نمونهبرداری شده) را برای یک صندوق شاخصی گسترده در کنار یک نماد بزرگ از بخش کالاهای مصرفی ضروری دنبال میکند.
کد دقیق SQL پشت هر عدد
WITH prices AS
(
SELECT
ticker,
date,
toFloat64(max(close)) AS c
FROM global_markets.stocks_daily_aggs
WHERE ticker IN ('SPY', 'KO')
AND date >= '2015-10-01'
AND date < '2025-01-01'
GROUP BY ticker, date
),
rets AS
(
SELECT
ticker,
date,
c / lagInFrame(c, 1) OVER (PARTITION BY ticker ORDER BY date ASC ROWS BETWEEN 1 PRECEDING AND CURRENT ROW) - 1 AS ret
FROM prices
),
trailing AS
(
SELECT
ticker,
date,
avg(ret) OVER (PARTITION BY ticker ORDER BY date ASC ROWS BETWEEN 251 PRECEDING AND CURRENT ROW) * 252 * 100 AS trailing_mean_pct,
row_number() OVER (PARTITION BY ticker ORDER BY date ASC) AS i
FROM rets
WHERE isFinite(ret)
)
SELECT
toString(toStartOfMonth(date)) AS month,
round(avgIf(trailing_mean_pct, ticker = 'SPY'), 1) AS spy_trailing_mean_pct,
round(avgIf(trailing_mean_pct, ticker = 'KO'), 1) AS ko_trailing_mean_pct
FROM trailing
WHERE i >= 252
AND date >= '2017-01-01'
GROUP BY month
ORDER BY month ASCهر نقطه روی این دو خط، عددی است که هر بهینهسازی ممکن بود آن را بهعنوان بازده مورد انتظار در آن تاریخ بپذیرد. اولین قرائت ماهانه برای SPY برابر با 17.7% و آخرین آن 25.8% است، که 96 قرائت نیز در میان آنها قرار دارد. نماد KO همین بازه را با -0.4% آغاز میکند. یک طرح وزندهی که این سری را ماه به ماه دریافت میکند، تمام نوسانات موجود در آن را به ارث میبرد.
آیا استراتژی Half Kelly و تعدیل Shrinkage مشکل را حل میکنند؟
این روشها اثرات را تعدیل میکنند. در عمل چهار راهکار وجود دارد که هر یک بخشی از بهینگی نظری را در ازای حساسیت کمتر به برآوردها، فدا میکنند.
- استراتژی Half Kelly تمامی وزنها را به نصف کاهش میدهد. منحنی رشد Kelly در نزدیکی قله خود مسطح و در زیر آن تند است؛ بنابراین، تخصیص نصف سرمایه، بخش کوچکی از نرخ رشد نظری را فدا میکند، اما آسیب ناشی از بیشبرآوردیِ برتری (edge) را بهمراتب بیشتر کاهش میدهد. هدفگذاری نوسان (Volatility targeting) همین غریزه را در مخرج کسر به کار میگیرد و اندازه موقعیت را تنها بر اساس ورودیهایی تعیین میکند که یک نمونه آماری کوتاه میتواند فراهم کند.
- روش Shrinkage (کوچکسازی)، میانگینهای برآوردشده را به سمت میانگین مقطعی برآوردها سوق میدهد؛ میزان این جابهجایی با کاهش حجم نمونه، افزایش مییابد. اگر این روش را به حد نهایی برسانیم، تمامی داراییها بازدهی انتظاری یکسانی خواهند داشت؛ در صورت برابر بودن نوسانات، بهینهساز بهطور خودکار وزنهای یکسان ارائه میدهد. وزن برابر، همان سبد کاملاً Shrink شده است.
- محدودیتها، به معنای ممنوعیت فروش استقراضی و تعیین سقف برای هر موقعیت، حد و مرزی برای تأثیر یک برآورد خوشبینانه بر وزن یک دارایی خاص ایجاد میکنند. اینها ابزارهای کنترل خسارت هستند، نه بهبوددهنده برآورد.
- حذف کامل بازدهیهای انتظاری، ما را به سمت واریانس حداقل و برابری ریسک (Risk Parity) سوق میدهد که تنها از کوواریانس استفاده میکنند. این همان ورودی است که نمونه آماری واقعاً قادر به تأمین آن است.
هیچیک از این چهار روش، اطلاعاتی را که در نمونه موجود نیست، تولید نمیکنند. آنچه این روشها تغییر میدهند، میزان اتکای سبد دارایی به اطلاعاتی است که ممکن است در اختیار نداشته باشید.
زمانی که بهینهسازی ارزش خود را اثبات میکند
این تقاطع در هر دو جهت رخ میدهد. هنگامی که T نسبت به اسپرد میانگینهای واقعی بزرگ میشود، تخصیص بهینه پیش میافتد و در همان جایگاه باقی میماند؛ هرچه این اسپرد عریضتر باشد، این اتفاق زودتر رخ میدهد. بهینهسازی همچنین هر زمان که ورودی از دادههای موجود تأمین شود، ابزار مناسبی است: کوواریانس و نسبتهای پوشش ریسک (hedge ratios) بسیار بهتر از بازدههای مورد انتظار برآورد میشوند.
وزندهی برابر (Equal weight) هزینه خاص خود را دارد. این روش اطلاعاتی را که واقعاً در اختیار دارید نادیده میگیرد و در یک فضای محدود، به اندازه هر بهینهسازی دیگری تمرکز ایجاد میکند. با آن به عنوان یک خط مبنا برخورد کنید که هر وزندهی کاندیدا باید در دادههایی که وزنها هرگز ندیدهاند، بر آن غلبه کند. برازش وزنها و امتیازدهی به آنها در همان نمونه، سوگیری نگاه به آینده در بکتست با ظاهری متفاوت است و هر بار بهینهساز را به شکلی کاذب برتر جلوه میدهد. برای داشتن یک بازه صادقانه پیرامون یک مزیت اندازهگیریشده به جای یک برآورد نقطهای واحد، بازه اطمینان بوتاسترپشده ابزار استاندارد است.
پرسشهای متداول
آیا وزندهی برابر واقعاً از بهینهسازی میانگین-واریانس عملکرد بهتری دارد؟
در نمونههای کوچک، اغلب چنین است. یک بهینهساز به برآوردی از بازده مورد انتظار هر دارایی نیاز دارد و این برآورد، خطای استانداردی تقریباً معادل نوسانپذیری دارایی تقسیم بر جذر طول دوره نمونهگیری (به سال) دارد. تا زمانی که این خطا از تفاوتهای واقعی میان داراییها بزرگتر باشد، بهینهساز در حال مرتبسازی نویز است. وزندهی برابر (Equal weight) هیچ برآوردی ندارد که بخواهد در آن دچار خطا شود.
برای برآورد بازده مورد انتظار به چند مشاهده نیاز است؟
بیش از آنچه تقریباً هر کسی در اختیار دارد. برای دارایی با 20 درصد نوسانپذیری، یک سال داده روزانه، خطای استانداردی نزدیک به 20 واحد درصد در سال باقی میگذارد و نصف کردن این خطا، چهار برابر زمان تقویمی نیاز دارد. افزودن مشاهدات درونروزی در همان سال کمکی نمیکند. در مقابل، نوسانپذیری با چند ماه داده قابل استفاده است.
آیا استراتژی Half Kelly صرفاً یک شرطبندی کوچکتر است؟
این یک شرطبندی کوچکتر با شرایط مطلوب است. منحنی رشد Kelly در نزدیکی قله خود تخت است؛ بنابراین نصف کردن سهم، بخش کوچکی از نرخ رشد نظری را فدا میکند، در حالی که نوسانپذیری مسیر را تقریباً به نصف کاهش داده و هزینه برآورد بیشازحدِ مزیت (edge) را کوچک میکند.
پرتفوی 1/N چیست؟
این پرتفویی است که سهم برابری از سرمایه را در هر یک از N موقعیت قرار داده و طبق یک زمانبندی، آن را بازتراز (rebalance) میکند. این پرتفو به هیچ پیشبینی بازده و هیچ برآورد کوواریانسی نیاز ندارد؛ همین ویژگی، آن را به معیار استاندارد (benchmark) برای هر طرح وزندهی که به این موارد نیاز دارد، تبدیل کرده است.
نحوه ساخت پنلها
هر سه پنل، قیمتهای پایانی روزانه را خوانده و بازدههای ساده «پایان به پایان» را محاسبه میکنند؛ ردیفهای تکراری برای هر تیکر در هر تاریخ به یک قیمت پایانی واحد تقلیل مییابند. میانگینها با ضرب بازده روزانه در 252 جلسه معاملاتی سالانه میشوند؛ نوسانپذیریها با ضرب انحراف معیار روزانه در جذر 252 سالانه میشوند. پنل سالانه تنها سالهای تقویمی را نگه میدارد که حداقل 200 جلسه معاملاتی داشته باشند. پنل بلوکی از بلوکهای غیرهمپوشان استفاده کرده و بلوک ناقص نهایی در هر طول را حذف میکند؛ ستون تعداد پنجره (window count) نشان میدهد که هر طول، چند بلوک تولید کرده است. هیچ سود سهامی در محاسبات لحاظ نشده است، بنابراین اینها بازده قیمتی هستند و سطح هر میانگین برای داراییهای دارای سود سهام، کمتر از واقع نشان داده شده است. هدف پنلها نمایش پراکندگی برآوردهاست، نه سطح آنها.
هر پنل در اینجا حاوی کد SQL دقیق زیر نمودار است و شبیهسازی نیز دارای seed مخصوص به خود است. برای اجرای همین بررسی پایداری برآورد روی فهرست نامهای خود، آن را به زبان ساده در ترمینال Strasmore درخواست کنید.