احتمال بیش‌برازش بک‌تست (PBO) چیست؟ سنجش اینکه بک‌تست شما مزیت است یا شانس
مقاله حسین نریمانی ۱۴۰۵/۰۷/۲۹ Quant System Design

احتمال بیش‌برازش بک‌تست (PBO) چیست؟ سنجش اینکه بک‌تست شما مزیت است یا شانس

احتمال بیش‌برازش بک‌تست (PBO) عددی بین صفر و یک است: احتمال اینکه بهترین استراتژیِ بک‌تست، خارج از نمونه از میانهٔ رقبایش بدتر باشد. اگر صد ترکیب پارامتر را آزمایش کنید و بهترینش را نگه دارید، آن «بهترین» تا حدی...

احتمال بیش‌برازش بک‌تست (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، قدم‌به‌قدم

  1. ماتریس بازده بسازید. برای هر پیکربندی که آزمایش کرده‌اید (همه، نه فقط خوب‌ها)، سری بازده دوره‌ای را نگه دارید. نتیجه ماتریسی T×N است: T دوره، N پیکربندی.
  2. ردیف‌ها را به S بلوک زمانی پشت‌سرهم تقسیم کنید. S زوج است، معمولاً ۸ تا ۱۶. ترتیب زمانی داخل بلوک‌ها حفظ می‌شود.
  3. همهٔ ترکیب‌های S/2 بلوکی را بسازید. برای S=16، این یعنی ۱۲٬۸۷۰ ترکیب. هر ترکیب نقش «داخل نمونه» را دارد و بلوک‌های باقی‌مانده «خارج نمونه» هستند.
  4. در هر ترکیب، همان کاری را بکنید که در واقعیت می‌کنید: با معیار خودتان (مثلاً شارپ) بهترین پیکربندی داخل نمونه را انتخاب کنید.
  5. رتبهٔ نسبی همان پیکربندی را خارج از نمونه پیدا کنید — عددی بین صفر و یک — و لاجیت آن را حساب کنید: λ = ln(ω / (1 − ω)).
  6. 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 یک گزارش نیست که یک بار نوشته شود؛ یک دروازه در خط تولید استراتژی است. در طراحی یک سیستم کوانت، مسیر از فرضیه تا سرمایهٔ واقعی چند دروازه دارد، و این یکی بین «تحقیق» و «معاملهٔ کاغذی» می‌نشیند:

  1. ثبت همهٔ آزمایش‌ها. هر پیکربندی‌ای که اجرا شد، با بازده‌اش ذخیره می‌شود. بدون این لاگ، PBO قابل محاسبه نیست — و این رایج‌ترین دلیلی است که تیم‌ها هرگز حسابش نمی‌کنند.
  2. بودجهٔ آزمایش. پیش از جست‌وجو، با MinBTL مشخص کنید با دادهٔ موجود چند پیکربندی مستقل مجاز است.
  3. دروازهٔ آماری. PBO و Deflated Sharpe روی خروجی جست‌وجو. شکست یعنی برگشت به فرضیه، نه یک دور دیگر تنظیم پارامتر.
  4. معاملهٔ کاغذی و مقایسه با انتظار. تنها کاندیداهایی که از دروازه رد شده‌اند، وارد اجرای زنده بدون سرمایه می‌شوند؛ آن‌جا شکاف بک‌تست و واقعیت اندازه‌گیری می‌شود.

نکتهٔ ظریف: اگر بعد از دیدن 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 همهٔ تقسیم‌های متقارن داده را آزمایش می‌کند و یک توزیع می‌دهد، نه یک عدد تکی. این دو مکمل هم هستند.

برای استراتژی‌های کریپتو هم کاربرد دارد؟

بله، و شاید بیشتر: تاریخچهٔ کوتاه‌تر، رژیم‌های متغیر و ابزارهای بهینه‌سازیِ دم‌دستی یعنی تعداد آزمایش زیاد روی دادهٔ کم — دقیقاً شرایطی که بیش‌برازش در آن رشد می‌کند.

منابع

اگر سیستم شما بیش از چند ده پیکربندی را آزمایش می‌کند و هنوز دروازهٔ آماری بین تحقیق و اجرا ندارد، از طراحی سیستم کوانت شروع کنید: اول تشخیص، بعد ابزار.

آماده‌ای این ایده را روی محصول خودت اجرا کنی؟ جلسه راهبردی رزرو کن و نقشه مسیر اسپرینت بعدی را دقیق کن.

نظرات (0)

اولین نفری باشید که نظر می‌دهد.
ورود / ثبت‌نام