احتمال بیشبرازش بکتست (PBO) عددی بین صفر و یک است: احتمال اینکه بهترین استراتژیِ بکتست، خارج از نمونه از میانهٔ رقبایش بدتر باشد.
اگر صد ترکیب پارامتر را آزمایش کنید و بهترینش را نگه دارید، آن «بهترین» تا حدی محصول شانس است. سؤال این نیست که شانس در کار بوده یا نه؛ سؤال این است که چقدر. PBO همین را اندازه میگیرد — و بهجای یک بکتست زیبا، به شما یک عدد قابلدفاع برای تصمیم میدهد.
جواب کوتاه
- PBO چیست؟ احتمال اینکه فرایند انتخاب شما (آزمایش N پیکربندی و برداشتن بهترین) خارج از نمونه، گزینهای زیر میانه تحویل بدهد.
- چطور حساب میشود؟ با روش CSCV (اعتبارسنجی متقاطع ترکیبیِ متقارن): داده به S بلوک تقسیم میشود، همهٔ ترکیبهای نیمهبهنیمه بهعنوان داخل/خارج نمونه امتحان میشوند، و شمرده میشود چند بار برندهٔ داخل نمونه، بیرون از آن زیر میانه افتاده.
- چه عددی خوب است؟ نزدیک صفر یعنی انتخاب شما اطلاعات واقعی دارد. حدود ۰٫۵ یعنی انتخاب شما با سکهانداختن فرقی ندارد.
- منبع اصلی: Bailey، Borwein، López de Prado و Zhu، «The Probability of Backtest Overfitting»، Journal of Computational Finance.
مسئله: بکتست یک آزمایش نیست، یک مسابقه است
در ارزیابی یک استراتژی خوب برای ربات تریدر گفتم که نمودار سرمایهٔ صعودی مدرک نیست. دلیلش آماری است، نه سلیقهای: وقتی چندین پیکربندی را آزمایش میکنید، بکتست دیگر یک اندازهگیری نیست — یک مسابقه است، و برندهٔ هر مسابقهای، حتی بین گزینههای کاملاً بیارزش، عدد بزرگی نشان میدهد.
این را میشود دقیق حساب کرد. فرض کنید N استراتژی مستقل دارید که همه نسبت شارپ واقعیِ صفر دارند. شارپ سالانهٔ بهترینشان در بکتست، بهطور میانگین چقدر است؟ جدول زیر حداقل طول بکتست (MinBTL) را نشان میدهد: چند سال داده لازم است تا بهترینِ N گزینهٔ بیارزش، بهطور مورد انتظار شارپ سالانهٔ ۱ نشان ندهد.
| تعداد پیکربندی آزمایششده (N) | بیشینهٔ مورد انتظار (واحد انحراف معیار) | حداقل طول بکتست برای شارپ ۱ |
|---|---|---|
| ۷ | ۱٫۳۹ | حدود ۲ سال |
| ۲۰ | ۱٫۹۰ | حدود ۳٫۶ سال |
| ۴۵ | ۲٫۲۴ | حدود ۵ سال |
| ۱۰۰ | ۲٫۵۳ | حدود ۶٫۴ سال |
| ۱۰۰۰ | ۳٫۲۶ | حدود ۱۰٫۶ سال |
معنی عملیاش: با دو سال داده و فقط هفت بار تغییر پارامتر، انتظار میرود دستکم یک نسخه شارپ ۱ نشان بدهد — حتی وقتی هیچکدام مزیتی ندارند. یک بهینهسازی معمولی، مثل hyperopt در Freqtrade، در یک شب هزاران پیکربندی را امتحان میکند. (اعداد جدول از فرمول بیشینهٔ مورد انتظار در مقالهٔ «Pseudo-Mathematics and Financial Charlatanism» محاسبه و با شبیهسازی مونتکارلو بررسی شدهاند.)
چرا روشهای معمول جواب نمیدهند
یک برش ساده داخل/خارج نمونه کافی نیست. اگر بعد از دیدن نتیجهٔ خارج از نمونه دوباره پارامتر عوض کنید — که تقریباً همه میکنند — دادهٔ خارج از نمونه عملاً جزو دادهٔ آموزش شده است. یک برش واحد هم فقط یک نمونه از مسیر قیمت است؛ ممکن است تصادفاً به نفع شما باشد.
اعتبارسنجی پیشرو (walk-forward) هم یک مسیر است. مفید است، ولی فقط یک توالی زمانی را آزمایش میکند و نمیگوید فرایند انتخاب شما چقدر به شانس وابسته است.
خطاهای دادهای را جدا حل کنید. PBO بیشبرازش ناشی از انتخاب را میسنجد، نه خطاهای داده را. سوگیری نگاه به آینده یا دادهٔ OHLCV خراب هر دو، همهٔ پیکربندیها را با هم بهتر نشان میدهند و PBO آنها را نمیبیند. اول داده را تمیز کنید، بعد بیشبرازش را بسنجید.
روش CSCV، قدمبهقدم
- ماتریس بازده بسازید. برای هر پیکربندی که آزمایش کردهاید (همه، نه فقط خوبها)، سری بازده دورهای را نگه دارید. نتیجه ماتریسی T×N است: T دوره، N پیکربندی.
- ردیفها را به S بلوک زمانی پشتسرهم تقسیم کنید. S زوج است، معمولاً ۸ تا ۱۶. ترتیب زمانی داخل بلوکها حفظ میشود.
- همهٔ ترکیبهای S/2 بلوکی را بسازید. برای S=16، این یعنی ۱۲٬۸۷۰ ترکیب. هر ترکیب نقش «داخل نمونه» را دارد و بلوکهای باقیمانده «خارج نمونه» هستند.
- در هر ترکیب، همان کاری را بکنید که در واقعیت میکنید: با معیار خودتان (مثلاً شارپ) بهترین پیکربندی داخل نمونه را انتخاب کنید.
- رتبهٔ نسبی همان پیکربندی را خارج از نمونه پیدا کنید — عددی بین صفر و یک — و لاجیت آن را حساب کنید: λ = ln(ω / (1 − ω)).
- PBO سهم ترکیبهایی است که در آنها λ ≤ 0 بوده؛ یعنی برندهٔ داخل نمونه، بیرون از آن به نیمهٔ پایینی سقوط کرده.
نقطهٔ قوت CSCV تقارن آن است: هر بلوک به همان تعدادی که داخل نمونه است، خارج نمونه هم هست، پس نتیجه به انتخاب دلبخواهیِ یک برش وابسته نیست.
پیادهسازی در پایتون
این نسخهٔ حداقلی همهٔ منطق روش را دارد. ورودی، ماتریس بازدهٔ همهٔ پیکربندیهای آزمایششده است:
import itertools
import numpy as np
def sharpe(r):
sd = r.std(axis=0, ddof=1)
return np.where(sd > 0, r.mean(axis=0) / sd, 0.0)
def pbo_cscv(returns, n_splits=16, metric=sharpe):
"""Probability of Backtest Overfitting via CSCV.
returns: array (T, N) - one column of period returns per configuration tried.
n_splits: S, even; the number of IS/OOS combinations is C(S, S/2).
"""
T, N = returns.shape
blocks = np.array_split(np.arange(T), n_splits)
logits = []
for is_ids in itertools.combinations(range(n_splits), n_splits // 2):
oos_ids = [b for b in range(n_splits) if b not in is_ids]
is_rows = np.concatenate([blocks[b] for b in is_ids])
oos_rows = np.concatenate([blocks[b] for b in oos_ids])
best = np.argmax(metric(returns[is_rows])) # what you would pick
oos_perf = metric(returns[oos_rows])
rank = (oos_perf < oos_perf[best]).sum() + 1 # 1 ... N
w = rank / (N + 1) # relative rank in (0, 1)
logits.append(np.log(w / (1 - w)))
logits = np.array(logits)
return (logits <= 0).mean(), logits
آزمون سلامت: روی پنجاه پیکربندی که فقط نویز تصادفیاند، میانگین PBO در چهل نمونهٔ مستقل حدود ۰٫۴۸ درآمد — همان ۰٫۵ نظری (یک نمونهٔ تکی میتواند بین حدود ۰٫۳ و ۰٫۷ نوسان کند). در آزمونی دیگر با صد پیکربندی، وقتی به پنجتا مزیت واقعی کوچکی اضافه شد، PBO به صفر رسید. اگر پیادهسازی شما روی نویز خالص عددی نزدیک صفر بدهد، جایی از داده نشت میکند. برای R، بستهٔ pbo روی CRAN همین روش را پیاده کرده است.
عدد PBO را چطور بخوانید
| PBO | معنی | تصمیم پیشنهادی |
|---|---|---|
| کمتر از ۰٫۱ | برندهٔ داخل نمونه معمولاً بیرون هم بالای میانه میماند | مجاز برای ورود به معاملهٔ کاغذی |
| ۰٫۱ تا ۰٫۳ | بخشی از برتری، محصول انتخاب است | فضای جستوجو را کوچک کنید، داده اضافه کنید |
| بیشتر از ۰٫۳ | انتخاب شما بیشتر شانس را انتخاب میکند تا مزیت را | رد کنید؛ فرضیه را بازبینی کنید، نه پارامترها را |
این آستانهها قاعدهٔ کاری من است، نه بخشی از مقالهٔ اصلی؛ مقاله آستانهٔ جهانی تعریف نمیکند. کنار PBO دو خروجی دیگر CSCV را هم ببینید: افت عملکرد (شیب رگرسیون عملکرد خارج از نمونه روی داخل نمونه — اگر منفی باشد، هرچه داخل نمونه بهتر، بیرون بدتر) و احتمال زیان (سهم ترکیبهایی که برنده، خارج از نمونه زیانده بوده).
PBO، شارپ تعدیلشده و حداقل طول بکتست: کدام برای چه؟
| ابزار | به چه سؤالی جواب میدهد | ورودی لازم |
|---|---|---|
| PBO (با CSCV) | آیا فرایند انتخاب من به شانس وابسته است؟ | بازده همهٔ پیکربندیهای آزمایششده |
| Deflated Sharpe Ratio | آیا شارپِ این یک استراتژی، با احتساب تعداد آزمایشها، معنادار است؟ | شارپ، تعداد آزمایشها، چولگی و کشیدگی |
| Minimum Backtest Length | با این تعداد آزمایش، چند سال داده لازم دارم؟ | تعداد آزمایشها و شارپ هدف |
این سه رقیب نیستند؛ لایههای یک دروازهاند. MinBTL پیش از شروع تحقیق میگوید چقدر حق آزمایش دارید. PBO بعد از جستوجو میگوید فرایند انتخاب سالم بوده یا نه. Deflated Sharpe روی تکاستراتژیِ نهایی، معناداری را میسنجد.
جای PBO در یک سیستم کوانت
PBO یک گزارش نیست که یک بار نوشته شود؛ یک دروازه در خط تولید استراتژی است. در طراحی یک سیستم کوانت، مسیر از فرضیه تا سرمایهٔ واقعی چند دروازه دارد، و این یکی بین «تحقیق» و «معاملهٔ کاغذی» مینشیند:
- ثبت همهٔ آزمایشها. هر پیکربندیای که اجرا شد، با بازدهاش ذخیره میشود. بدون این لاگ، PBO قابل محاسبه نیست — و این رایجترین دلیلی است که تیمها هرگز حسابش نمیکنند.
- بودجهٔ آزمایش. پیش از جستوجو، با MinBTL مشخص کنید با دادهٔ موجود چند پیکربندی مستقل مجاز است.
- دروازهٔ آماری. PBO و Deflated Sharpe روی خروجی جستوجو. شکست یعنی برگشت به فرضیه، نه یک دور دیگر تنظیم پارامتر.
- معاملهٔ کاغذی و مقایسه با انتظار. تنها کاندیداهایی که از دروازه رد شدهاند، وارد اجرای زنده بدون سرمایه میشوند؛ آنجا شکاف بکتست و واقعیت اندازهگیری میشود.
نکتهٔ ظریف: اگر بعد از دیدن PBO بالا، پارامترها را عوض کنید و دوباره PBO بگیرید، خود این حلقه بیشبرازش تازهای میسازد. شکست در دروازه باید به بازبینی منبع مزیت برگردد، نه به جستوجوی بیشتر.
اشتباههای رایج
- شمردن فقط پیکربندیهای «جدی». هر آزمایشی که نتیجهاش را دیدید و رویش تصمیم گرفتید، یک آزمایش است — حتی آنهایی که از دفترچه پاک کردید.
- بلوکهای خیلی کوچک. اگر هر بلوک فقط چند معامله داشته باشد، معیار عملکرد نویزی میشود و PBO بیمعنا. هر بلوک باید بهقدر کافی معامله داشته باشد که شارپش عدد قابلاعتمادی باشد.
- پیکربندیهای تقریباً یکسان. صد نسخه با تفاوت جزئی در یک پارامتر، در عمل صد آزمایش مستقل نیستند. PBO این را تا حدی جذب میکند، ولی برای MinBTL باید تعداد آزمایشهای مؤثر را تخمین بزنید.
- یکیگرفتن PBO پایین با سودآوری. PBO پایین یعنی انتخاب شما شانسی نیست؛ نمیگوید بعد از هزینهٔ معامله سودده هستید. آن آزمون جداگانه است.
پرسشهای پرتکرار
PBO دقیقاً چه چیزی را اندازه میگیرد؟
احتمال اینکه پیکربندیِ برتر در داخل نمونه، خارج از نمونه زیر میانهٔ همهٔ پیکربندیهای آزمایششده قرار بگیرد. موضوع آن فرایند انتخاب است، نه یک استراتژی خاص.
برای حسابکردن PBO چند پیکربندی لازم است؟
دستکم دو، ولی عدد وقتی معنا پیدا میکند که همهٔ پیکربندیهایی را که واقعاً آزمایش کردهاید وارد کنید. حذف آزمایشهای ناموفق، PBO را مصنوعی پایین میآورد.
S (تعداد بلوکها) را چقدر بگذارم؟
معمولاً بین ۸ و ۱۶. S بزرگتر ترکیبهای بیشتری میسازد (برای ۱۶، ۱۲٬۸۷۰ ترکیب)، ولی بلوکها کوچکتر میشوند. هر بلوک باید آنقدر داده داشته باشد که معیار عملکرد پایدار بماند.
تفاوت PBO با Deflated Sharpe Ratio چیست؟
PBO فرایند انتخاب را روی همهٔ آزمایشها میسنجد. Deflated Sharpe شارپ یک استراتژی را با درنظرگرفتن تعداد آزمایشها و غیرنرمالبودن بازدهها تعدیل میکند. اولی میپرسد «انتخاب سالم بود؟»، دومی «این عدد معنادار است؟».
آیا walk-forward جای PBO را میگیرد؟
نه. walk-forward یک مسیر زمانی را آزمایش میکند. CSCV همهٔ تقسیمهای متقارن داده را آزمایش میکند و یک توزیع میدهد، نه یک عدد تکی. این دو مکمل هم هستند.
برای استراتژیهای کریپتو هم کاربرد دارد؟
بله، و شاید بیشتر: تاریخچهٔ کوتاهتر، رژیمهای متغیر و ابزارهای بهینهسازیِ دمدستی یعنی تعداد آزمایش زیاد روی دادهٔ کم — دقیقاً شرایطی که بیشبرازش در آن رشد میکند.
منابع
- Bailey, D. H., Borwein, J. M., López de Prado, M., Zhu, Q. J. — The Probability of Backtest Overfitting, Journal of Computational Finance.
- Bailey, D. H., Borwein, J. M., López de Prado, M., Zhu, Q. J. — Pseudo-Mathematics and Financial Charlatanism: The Effects of Backtest Overfitting on Out-of-Sample Performance, Notices of the AMS, 2014.
- Bailey, D. H., López de Prado, M. — The Deflated Sharpe Ratio: Correcting for Selection Bias, Backtest Overfitting and Non-Normality, Journal of Portfolio Management, 2014.
اگر سیستم شما بیش از چند ده پیکربندی را آزمایش میکند و هنوز دروازهٔ آماری بین تحقیق و اجرا ندارد، از طراحی سیستم کوانت شروع کنید: اول تشخیص، بعد ابزار.
نظرات (0)
برای ثبت نظر باید وارد حساب کاربری خود شوید.
ورود / ثبتنام