بیشتر شکستهای بکتست از مدل شروع نمیشوند. از داده شروع میشوند.
اگر داده OHLCV شما ناقص، ناهماهنگ یا بازنویسیشده باشد، استراتژی سودده فقط یک داستان خوشساخت است.
کیفیت داده OHLCV چیست؟
داده OHLCV شامل قیمت باز شدن (Open)، بالاترین قیمت (High)، پایینترین قیمت (Low)، قیمت بسته شدن (Close) و حجم (Volume) در یک بازه زمانی مشخص است.
کیفیت داده OHLCV یعنی این رکوردها از نظر زمان، قیمت، حجم، پوشش نماد و تاریخچه بازار قابلاعتماد باشند. این موضوع فقط یک مسئله فنی نیست. مستقیماً روی تصمیم سرمایه، ریسک و قابلیت اجرای سیستم اثر میگذارد.
برای یک سیستم معاملاتی، داده همان چیزی است که حسگر برای یک سیستم کنترل صنعتی محسوب میشود. اگر حسگر خطا داشته باشد، منطق کنترل هرچقدر هم خوب باشد، خروجی قابل اتکا نخواهد بود.
آنچه بیشتر افراد اشتباه میگیرند
بسیاری از پژوهشگران ابتدا اندیکاتور میسازند و بعد داده را «تمیز» میکنند. این ترتیب اشتباه است.
تمیز کردن داده بعد از دیدن نتایج بکتست، بهسادگی میتواند سوگیری ایجاد کند. شما ممکن است ناخواسته فقط دادههایی را حفظ کنید که استراتژی را بهتر نشان میدهند.
کیفیت داده یک مرحله پیشپردازش نیست. بخشی از معماری استراتژی است.
یک دیتاست ظاهراً کامل میتواند مشکلات جدی داشته باشد: کندلهای گمشده، timestamp تکراری، حجم غیرواقعی، قیمتهای تعدیلنشده، اختلاف منطقه زمانی و نمادهایی که امروز وجود دارند اما در گذشته قابل معامله نبودند.
چارچوب ششلایه بررسی OHLCV
برای ارزیابی داده بازار، من از یک چارچوب ششلایه استفاده میکنم. هر لایه یک نوع خطا را حذف میکند.
۱. یکپارچگی ساختاری
هر ردیف باید دقیقاً شامل timestamp، open، high، low، close و volume باشد. نوع داده نیز مهم است؛ timestamp باید قابل تبدیل به زمان استاندارد باشد و قیمت و حجم باید عددی باشند.
- مقادیر خالی، NaN و Infinity را شناسایی کنید.
- رکوردهای تکراری را بر اساس نماد، timeframe و timestamp بررسی کنید.
- ترتیب زمانی داده را کنترل کنید؛ داده باید صعودی و بدون پرش غیرقابل توضیح باشد.
- مشخص کنید timestamp ابتدای کندل است یا انتهای آن.
یک timestamp تکراری میتواند باعث شود یک سیگنال دوبار تولید شود. در سیستم زنده، این خطا میتواند به سفارش تکراری تبدیل شود.
۲. اعتبار قیمت در هر کندل
هر کندل باید از قوانین پایه قیمت تبعیت کند. این کنترل ساده است، اما حذف آن هزینهساز میشود.
| قانون اعتبارسنجی | شرط | معنای نقض قانون |
|---|---|---|
| قیمتهای مثبت | Open, High, Low, Close > 0 | خطای منبع، پارس داده یا داده خراب |
| دامنه بالا | High ≥ Open و High ≥ Close | ساخت کندل نادرست یا ستونهای جابهجا |
| دامنه پایین | Low ≤ Open و Low ≤ Close | ساخت کندل نادرست یا خطای داده |
| سازگاری دامنه | High ≥ Low | رکورد نامعتبر |
این قوانین تضمین نمیکنند داده درست است. فقط دادهای را که آشکارا غلط است جدا میکنند.
۳. پیوستگی زمانی
داده ۱ دقیقهای باید در هر دقیقه مورد انتظار یک کندل داشته باشد؛ مگر آنکه بازار بسته بوده یا قرارداد مشخصاً معامله نشده باشد.
شکاف زمانی همیشه خطا نیست. در بازار سهام، تعطیلات و ساعت معامله مهماند. در کریپتو، بازار ۲۴ ساعته است و یک شکاف چندساعته معمولاً باید بررسی شود.
- تقویم معاملاتی بازار را به داده متصل کنید.
- شکافها را به کوتاه، متوسط و بحرانی دستهبندی کنید.
- برای هر شکاف، علت و سیاست برخورد را ثبت کنید.
- کندل گمشده را بدون ثبت منبع و دلیل، صرفاً forward-fill نکنید.
پر کردن کورکورانه شکاف، نوسان و نقدشوندگی را مصنوعی میکند. این کار ممکن است یک استراتژی mean reversion را بهتر از واقعیت نشان دهد.
۴. سازگاری حجم و نقدشوندگی
حجم صفر لزوماً بد نیست. در برخی بازارها یا نمادهای کممعامله، حجم صفر یک واقعیت عملیاتی است.
اما حجم صفر همراه با حرکت قیمت، یا حجمهای جهشی بدون حرکت قیمت متناظر، باید بررسی شود. این الگوها ممکن است از روش تجمیع منبع داده، اختلاف واحد حجم یا خطای feed ناشی شوند.
برای کریپتو، ابتدا مشخص کنید volume بر حسب دارایی پایه است یا ارز مظنه. حجم 100 BTC با حجم 100 USDT یک معیار مشابه نیست.
۵. تطبیق با واقعیت بازار
داده باید با ساختار بازار سازگار باشد. یک سهم ممکن است split، dividend، delisting، تغییر ticker یا توقف معامله داشته باشد.
برای سهام، استفاده از قیمت تعدیلنشده در یک استراتژی بلندمدت میتواند بازده را بهطور جدی تحریف کند. برای معاملات کوتاهمدت نیز باید روشن باشد که سفارشها در دنیای واقعی با قیمت تعدیلشده اجرا نمیشوند.
برای کریپتو، symbol mapping مهم است. BTC/USDT در دو صرافی لزوماً کیفیت اجرا، حجم واقعی، ساعت نگهداری و ریسک بازار یکسانی ندارد.
۶. تبارشناسی داده و قابلیت بازتولید
هر دیتاست باید شناسنامه داشته باشد: منبع، زمان دریافت، timezone، نوع تعدیل، نسخه pipeline و قوانین پاکسازی.
بدون این اطلاعات، اختلاف بین نتایج امروز و ماه بعد قابل توضیح نیست. سیستم پژوهش بدون lineage، قابل حسابرسی نیست.
دادهای که نمیتوانید منشأ و تبدیلهایش را توضیح دهید، برای تصمیم سرمایه آماده نیست.
چکلیست عملی قبل از بکتست
قبل از اجرای هر بکتست، این کنترلها را بهصورت خودکار اجرا کنید.
- Timezone همه منابع را به UTC تبدیل کنید و timezone اصلی را ذخیره کنید.
- تکراری بودن ترکیب symbol، timeframe و timestamp را بررسی کنید.
- فاصله زمانی بین کندلها را با تقویم واقعی بازار مقایسه کنید.
- قوانین High، Low، Open و Close را برای تمام ردیفها اجرا کنید.
- قیمت منفی، صفر، NaN، Infinity و حجم منفی را رد کنید.
- روزهای با حجم غیرعادی، بازده غیرعادی و گپهای قیمتی شدید را پرچمگذاری کنید.
- برای سهام، وضعیت adjustment، split و dividend را مشخص کنید.
- برای universe تاریخی، survivorship bias را بررسی کنید.
- هزینه معامله، spread، slippage و تأخیر داده را جدا از کیفیت قیمت مدل کنید.
- گزارش کیفیت داده را همراه هر اجرای بکتست ذخیره کنید.
مثال: یک کندل اشتباه چگونه استراتژی را خراب میکند؟
فرض کنید یک استراتژی breakout روی داده ۵ دقیقهای BTC/USDT اجرا میشود. یک منبع داده به دلیل اختلال، یک کندل با High غیرواقعی ثبت میکند.
استراتژی این High را شکست مقاومت تفسیر میکند. بکتست وارد معامله میشود، بازده ثبت میکند و شاید همان نقطه را بهعنوان مزیت استراتژی معرفی کند.
اما در بازار واقعی، آن معامله هرگز وجود نداشته است. مدل بهجای کشف alpha، یک خطای feed را معامله کرده است.
هر سیگنال باید بتواند به کندلهای منبع و قوانین اعتبارسنجی خود برگردد.
چه زمانی داده را اصلاح کنیم؟
همه خطاها نباید به یک شکل اصلاح شوند. سیاست اصلاح به نوع بازار، timeframe و کاربرد داده بستگی دارد.
| نوع مسئله | اقدام مناسب | ریسک اصلی |
|---|---|---|
| timestamp تکراری | منبع معتبرتر را انتخاب و رکورد حذفشده را ثبت کنید | حذف یک معامله واقعی یا حفظ رکورد نادرست |
| شکاف کوتاه | ابتدا علت را بررسی کنید؛ در صورت لزوم کندل synthetic را جداگانه برچسب بزنید | ایجاد نوسان یا حجم مصنوعی |
| قیمت پرت آشکار | با trade-level data یا منبع دوم تطبیق دهید | حذف یک حرکت واقعی بازار |
| split یا dividend | سری adjusted و raw را جدا نگه دارید | اختلاط بازده پژوهشی با قیمت اجرایی |
| نماد حذفشده | universe تاریخی را حفظ کنید | survivorship bias |
چیزهایی که نباید خودکار کنید
برخی تصمیمها با یک rule ساده قابل حل نیستند. اینجا همان جایی است که طراحی سیستم از اسکریپتنویسی جدا میشود.
پر کردن تمام کندلهای گمشده
فقط چون یک سیستم میتواند کندل بسازد، به این معنا نیست که باید بسازد. در داده intraday، کندل مصنوعی ممکن است ساختار microstructure بازار را خراب کند.
حذف تمام outlierها
حرکت شدید ممکن است خطا باشد. ممکن است liquidation cascade، خبر بزرگ یا توقف نقدشوندگی باشد.
outlier را ابتدا پرچمگذاری کنید. سپس با منبع دوم، trades یا داده order book بررسی کنید.
انتخاب یک منبع بهعنوان حقیقت مطلق
داده بازار همیشه به روش تجمیع، latency، نمادگذاری و سیاست اصلاح منبع وابسته است. حتی دو منبع معتبر میتوانند در کندلهای intraday اختلاف داشته باشند.
واقعیت عملیاتی در سیستمهای معاملاتی
کیفیت داده فقط برای پژوهش نیست. باید در production نیز پایش شود.
یک pipeline حرفهای، کیفیت داده را مانند سلامت سرویس اندازه میگیرد: نرخ داده گمشده، تأخیر دریافت، تعداد کندل تکراری، درصد داده ردشده و اختلاف با منبع مرجع.
- در ingest، داده خام را بدون تغییر ذخیره کنید.
- در validation، خطاها را برچسب بزنید؛ تاریخچه را پاک نکنید.
- در transformation، نسخهدار و قابل بازتولید عمل کنید.
- در research، فقط dataset تأییدشده را مصرف کنید.
- در live trading، data-quality gate را قبل از تولید سفارش قرار دهید.
این طراحی، هزینه دارد. ذخیره داده خام، منبع دوم و مانیتورینگ پیچیدگی ایجاد میکنند. اما جایگزین آن، تصمیمگیری با دادهای است که هنگام خرابی تازه متوجه آن میشوید.
درخت تصمیم کوتاه
اگر داده شما یک خطا نشان داد، با این ترتیب تصمیم بگیرید:
- آیا نقض قانون ساختاری است؟ اگر بله، رکورد را رد و ثبت کنید.
- آیا با تقویم بازار توضیح داده میشود؟ اگر بله، آن را بهعنوان وضعیت طبیعی بازار ثبت کنید.
- آیا منبع دوم آن را تأیید میکند؟ اگر بله، احتمالاً حرکت واقعی است.
- آیا روی سیگنال یا اجرای معامله اثر دارد؟ اگر بله، dataset یا بازه زمانی را quarantine کنید.
- آیا سیاست اصلاح مشخص و نسخهدار دارید؟ اگر نه، داده را برای پژوهش حساس استفاده نکنید.
نکات کلیدی
- OHLCV داده سادهای بهنظر میرسد، اما لایهای از تصمیمهای منبع و تجمیع است.
- قوانین High، Low، Open و Close فقط حداقل کنترل هستند.
- زمان، timezone و تقویم بازار بهاندازه قیمت اهمیت دارند.
- volume بدون واحد، بازار و منبع، معنای قابل اتکا ندارد.
- داده raw و adjusted باید جدا نگهداری شوند.
- اصلاح داده باید traceable، نسخهدار و قابل بازتولید باشد.
- بکتست بدون گزارش کیفیت داده، یک گزارش ناقص است.
پرسشهای متداول
OHLCV مخفف چیست؟
OHLCV مخفف Open، High، Low، Close و Volume است. این پنج مقدار رفتار قیمت و حجم یک دارایی را در یک بازه زمانی مشخص توصیف میکنند.
آیا میتوان از داده رایگان OHLCV برای بکتست استفاده کرد؟
بله، اما فقط پس از اعتبارسنجی. رایگان بودن مشکل اصلی نیست؛ مسئله پوشش تاریخی، روش تجمیع، تأخیر، اصلاحات و قابلیت بازتولید است.
آیا کندل گمشده را باید پر کرد؟
نه همیشه. ابتدا باید مشخص شود بازار باز بوده، دارایی قابل معامله بوده و علت شکاف چیست. کندل مصنوعی باید برچسبدار باشد و هرگز جای داده واقعی جا زده نشود.
فرق داده adjusted و raw چیست؟
داده raw قیمت ثبتشده بازار را نگه میدارد. داده adjusted برای رویدادهایی مانند split و dividend تغییر میکند تا تحلیل بازده بلندمدت سازگارتر شود.
چرا timestamp در داده OHLCV مهم است؟
چون هر سیگنال به زمان وابسته است. اختلاف timezone، اشتباه در زمان باز یا بسته شدن کندل، یا تکرار timestamp میتواند ورود و خروج بکتست را تغییر دهد.
آیا حجم صفر همیشه نشانه داده خراب است؟
خیر. حجم صفر در نمادهای کممعامله یا بازههای خاص ممکن است واقعی باشد. اما باید با وضعیت قیمت، بازار و روش گزارشدهی منبع بررسی شود.
مدل خوب با داده بد نجات پیدا نمیکند. فقط خرابی را با اعتماد بیشتری اجرا میکند.
نظرات (0)
برای ثبت نظر باید وارد حساب کاربری خود شوید.
ورود / ثبتنام