تاثیر اسپرد و اسلیپیج در بکتست
اگر بخواهیم خیلی صریح و حرفهای صحبت کنیم، بکتست (Backtest) بدون در نظر گرفتن اسپرد (Spread) و اسلیپیج (Slippage) اغلب تصویری بیش از حد خوشبینانه از عملکرد یک استراتژی معاملاتی ارائه میدهد. بسیاری از استراتژیها روی کاغذ سودده به نظر میرسند، اما وقتی هزینههای واقعی اجرا وارد معادله میشوند، بخشی از مزیت آماری آنها از بین میرود یا حتی کاملاً معکوس میشود. برای تریدرهای الگوریتمی، برنامهنویسهای بازار، و حتی معاملهگران دستی که میخواهند یک سیستم را بهصورت علمی ارزیابی کنند، درک این دو مفهوم فقط یک موضوع جانبی نیست؛ بلکه بخش اصلی ارزیابی واقعگرایانه است.
در یک محیط ایدهآل، شما در بهترین قیمت ممکن وارد و خارج میشوید، سفارشها دقیقاً در سطح موردنظر پر میشوند، و هیچ فاصلهای بین قیمت تئوریک و قیمت اجرایی وجود ندارد. اما بازار واقعی چنین نیست. در بازار واقعی، همیشه بین قیمت خرید و فروش فاصله وجود دارد، همیشه ممکن است سفارش شما با تاخیر، لغزش یا پر شدن جزئی مواجه شود، و در زمانهای پرنوسان، این اختلافها میتوانند بهمراتب بزرگتر شوند. به همین دلیل است که مدلسازی اسپرد و اسلیپیج در بکتست، یک کار تزئینی نیست؛ بلکه شرط لازم برای اعتبار نتایج است.
در این مقاله، بهصورت مفصل بررسی میکنیم که اسپرد (Spread) و اسلیپیج (Slippage) دقیقاً چیستند، چرا در بکتست اهمیت دارند، چه خطاهایی را وارد نتایج میکنند، چگونه باید آنها را مدلسازی کرد، چه اثری بر معیارهایی مانند Sharpe Ratio، Profit Factor، Drawdown و Win Rate دارند، و در نهایت چگونه میتوان یک بکتست حرفهای و نزدیک به واقعیت ساخت. همچنین مثالهای عملی برای پلتفرمهای رایج مانند MT4/MT5، TradingView و محیطهای برنامهنویسی مثل Python، backtrader و zipline ارائه میشود.
اسپرد (Spread) چیست و چرا در بکتست مهم است؟
اسپرد (Spread) فاصله بین قیمت خرید و قیمت فروش در یک لحظه مشخص است؛ یعنی تفاوت بین Ask و Bid. اگر بخواهید بخرید، معمولاً با قیمت Ask معامله میکنید، و اگر بخواهید بفروشید، با قیمت Bid. همین فاصله کوچک، در نگاه اول شاید ناچیز به نظر برسد، اما در عمل میتواند اثر قابل توجهی بر عملکرد استراتژی داشته باشد، بهویژه برای سیستمهایی که تعداد معاملات بالایی دارند یا اهداف قیمتی کوچک دارند.
برای مثال، اگر یک جفتارز با Bid برابر (1.1000) و Ask برابر (1.1002) معامله شود، اسپرد برابر با 2 پیپ است. حالا فرض کنید استراتژی شما بهطور میانگین فقط 5 پیپ سود در هر معامله میگیرد. در چنین حالتی، تنها اسپرد میتواند 40 درصد از سود خام شما را قبل از در نظر گرفتن هر هزینه دیگری از بین ببرد. اگر به این هزینه کارمزد (Commission) و اسلیپیج (Slippage) هم اضافه شود، ممکن است مزیت استراتژی کاملاً فرسوده شود.
در بکتستهای ساده، معمولاً دادههای تاریخی تنها شامل قیمت OHLC هستند و اسپرد واقعی بازار در آنها لحاظ نشده است. این موضوع بهخصوص در استراتژیهای اسکالپینگ (Scalping)، معاملات کوتاهمدت، و سیستمهایی که در تایمفریمهای پایین کار میکنند، بسیار خطرناک است. زیرا هر بار ورود و خروج، اسپرد بهصورت مستقیم هزینه ایجاد میکند و اگر بکتست آن را نادیده بگیرد، نتیجه بهشدت خوشبینانه خواهد بود.
از طرف دیگر، اسپرد ثابت نیست. در بازارهای مختلف و ساعات متفاوت، اسپرد میتواند تغییر کند. مثلاً در زمان انتشار اخبار مهم، در باز شدن بازار، در ساعات کمنقدشونده، یا هنگام بروز نوسانات شدید، اسپرد معمولاً افزایش مییابد. بنابراین اگر بکتست شما فقط با یک عدد ثابت برای اسپرد انجام شود، ممکن است بخشی از واقعیت را ببیند ولی تمام آن را نه.
اسلیپیج (Slippage) چیست و چگونه ایجاد میشود؟
اسلیپیج (Slippage) به اختلاف بین قیمت مورد انتظار شما و قیمت واقعی اجرای سفارش گفته میشود. این اختلاف میتواند به ضرر یا به نفع شما باشد، اما در عمل، در اغلب مدلهای محافظهکارانه، آن را بهعنوان یک هزینه یا ریسک اجرایی در نظر میگیرند. اسلیپیج معمولاً زمانی رخ میدهد که بازار سریع حرکت میکند، نقدشوندگی کافی نیست، حجم سفارش زیاد است، یا سفارش بهصورت Market Order ارسال میشود و در قیمت دقیق درخواستی پر نمیشود.
برای مثال، شما میخواهید در قیمت 1.2000 وارد خرید شوید، اما بهدلیل سرعت حرکت بازار، سفارش در 1.2003 پر میشود. این 3 پیپ اختلاف، اسلیپیج منفی است. در طرف مقابل، اگر سفارش شما در 1.1998 پر شود، اسلیپیج مثبت رخ داده است. با این حال، چون هدف بکتست ارزیابی واقعگرایانه است، تکیه بر اسلیپیج مثبت احتمالاً تصویر غیرواقعی ایجاد میکند؛ بنابراین بهتر است مدلسازی محافظهکارانه داشته باشیم و معمولاً اثر خالص منفی یا خنثی را فرض کنیم.
اسلیپیج فقط مخصوص بازارهای بسیار پرنوسان نیست. در Forex، Stocks، Crypto و Futures هم دیده میشود. در بازار ارزهای دیجیتال، بهخصوص در صرافیهایی با نقدشوندگی پایینتر یا در آلتکوینها، اسلیپیج میتواند محسوس باشد. در معاملات فیوچرز نیز در زمان انتشار دادههای اقتصادی، یا هنگام لیکوییدیشنهای زنجیرهای، سفارشها ممکن است بهصورت قابل توجهی از قیمت مورد انتظار فاصله بگیرند.
نکته مهم این است که اسلیپیج را نمیتوان صرفاً با یک عدد ثابت همیشهوهمهجا مدل کرد. رفتار اسلیپیج به نقدشوندگی (Liquidity)، نوسان (Volatility)، اندازه سفارش، نوع سفارش، زمان معامله و حتی زیرساخت اجرای شما وابسته است. هرچه استراتژی نزدیکتر به بازار واقعی و اجرای زنده باشد، مدل اسلیپیج باید دقیقتر و محافظهکارانهتر طراحی شود.
چرا بسیاری از بکتستها بیشازحد خوشبینانه میشوند؟
مشکل اصلی بکتستهای غیرحرفهای این است که در آنها قیمتهای تاریخی بهصورت ایدهآل و تمیز دیده میشوند، اما هزینههای واقعی اجرا وارد حساب نمیشوند. وقتی شما در دادههای OHLC بهصورت ساده بررسی میکنید که آیا قیمت به حد سود یا حد ضرر رسیده یا نه، عملاً فرض کردهاید که معامله دقیقاً در بهترین قیمت ممکن اجرا شده است. این فرض در بسیاری از موارد غلط است.
برای نمونه، اگر یک استراتژی میانگینگیری بازگشتی روی تایمفریم 5 دقیقه داشته باشید و ورودهای آن بهصورت متعدد و با تارگتهای کوچک انجام شوند، حتی اختلافی بسیار کوچک در اسپرد و اسلیپیج میتواند بهطور تجمعی اثر بزرگی بسازد. فرض کنید در هر معامله فقط 0.3 پیپ هزینه پنهان بیشتر از چیزی است که در بکتست دیدهاید. اگر این استراتژی در سال 500 معامله انجام دهد، این اختلاف کوچک در مجموع میتواند بخش قابل توجهی از سود را کاهش دهد.
از سوی دیگر، برخی بکتستها در دادههای Close price یا حتی Bar-based اجرا میشوند و فرض میکنند که ورود و خروج همیشه در همان قیمت بسته شدن کندل یا سطح سیگنال انجام میشود. این در حالی است که در عمل، قیمت اجرا ممکن است از آن سطح فاصله داشته باشد. در واقع، بخشی از خوشبینی بکتست ناشی از این است که فرآیند سفارشگذاری شبیهسازی نشده است.
یکی دیگر از منابع خوشبینی، انتخاب دورههایی است که در آنها اسپرد طبیعی کم بوده و شرایط بازار خوب بوده است. اگر استراتژی شما فقط روی دادههای دورهای با نقدشوندگی بالا و شرایط آرام آزمایش شود، احتمالاً در مواجهه با شرایط سختتر بازار عملکرد ضعیفتری خواهد داشت. بنابراین، برای ارزیابی صحیح، باید شرایط مختلف بازار، از جمله ساعات کمنقدشونده، خبرهای مهم، و دورههای پرنوسان نیز در نظر گرفته شوند.
منابع ایجاد خطا در بکتست
خطاهایی که در بکتست ناشی از اسپرد و اسلیپیج ایجاد میشوند، معمولاً از چند منبع اصلی میآیند. شناخت این منابع به شما کمک میکند مدل دقیقتری طراحی کنید و از نتیجهگیری اشتباه پرهیز نمایید.
دادههای ناقص یا سادهسازیشده
بسیاری از دیتاستها تنها شامل OHLC هستند و جزئیات تیکبهتیک، عمق بازار، Bid/Ask واقعی یا جریان سفارش را ندارند. در چنین شرایطی، بکتست مجبور است فرضهای سادهسازیشده بگذارد. اگر این فرضها محافظهکارانه نباشند، نتایج قابل اتکا نخواهند بود.
نادیده گرفتن کارمزد و هزینههای جانبی
هرچند موضوع مقاله اسپرد و اسلیپیج است، اما نباید فراموش کرد که Commission، هزینه تبدیل ارز، Funding در برخی بازارها، و هزینههای شبانه هم در مجموع بر نتیجه اثر دارند. در برخی بازارها اسپرد بهتنهایی کافی نیست و ترکیب آن با کارمزد میتواند ساختار سوددهی را تغییر دهد.
اجرای آرمانی سفارشها
در بکتستهای ساده، سفارش Market معمولاً دقیقاً در قیمت باز شدن کندل بعدی یا قیمت سیگنال پر میشود. این یک فرض آرمانی است. در واقع، سفارش ممکن است با تاخیر، در قیمت بدتر، یا حتی با partial fill اجرا شود.
همراستایی نادرست زمان دادهها
اگر دادهها از تایمزونهای مختلف، یا از منابعی با کیفیت متفاوت گردآوری شده باشند، ممکن است اسپرد و رفتار بازار بهدرستی بازسازی نشود. بهویژه در بازارهای 24 ساعته مانند فارکس و کریپتو، زمانبندی بسیار مهم است.
استفاده از یک مدل ثابت برای بازار متغیر
اسپرد و اسلیپیج در بازار واقعی تابعی از شرایطاند، نه یک عدد همیشگی. استفاده از fixed spread و fixed slippage میتواند برای تست اولیه مفید باشد، اما اگر بهعنوان مدل نهایی استفاده شود، ممکن است واقعیت را پنهان کند.
مدلسازی اسپرد در بکتست
برای لحاظ کردن اسپرد (Spread) در بکتست، چند رویکرد رایج وجود دارد که هرکدام سطح متفاوتی از دقت و پیچیدگی دارند. انتخاب روش مناسب به نوع استراتژی، کیفیت داده، و پلتفرم بکتست شما بستگی دارد.
اسپرد ثابت (Fixed Spread)
سادهترین روش، فرض یک اسپرد ثابت است. در این مدل، برای هر ورود و خروج، مقدار ثابتی از قیمت کم یا زیاد میشود. این روش برای آزمایشهای اولیه و تخمین سریع مفید است، بهخصوص زمانی که داده Bid/Ask ندارید. مزیت آن ساده بودن و قابل پیادهسازی بودن در اغلب پلتفرمهاست. اما ضعف آن این است که نمیتواند رفتار واقعی بازار را در ساعات مختلف، جفتارزهای مختلف، یا شرایط خبری بازتاب دهد.
برای مثال، اگر استراتژی شما روی EUR/USD اجرا میشود و میانگین اسپرد در شرایط عادی 1.2 پیپ است، میتوانید در بکتست یک اسپرد 1.5 پیپی در نظر بگیرید تا حاشیه امنیت داشته باشید. این رویکرد محافظهکارانهتر از استفاده از میانگین تاریخی دقیق است، زیرا هزینههای پنهان را دستکم نمیگیرد.
اسپرد متغیر (Variable Spread)
در این مدل، اسپرد بر اساس زمان، نوسان، یا شرایط بازار تغییر میکند. دادههای Bid/Ask تاریخی بهترین گزینه برای این نوع مدل هستند. اگر این دادهها را داشته باشید، میتوانید ورود و خروج را بر اساس قیمت Ask برای خرید و Bid برای فروش شبیهسازی کنید. این روش بسیار واقعگرایانهتر است و برای استراتژیهای حساس به هزینه، تقریباً ضروری محسوب میشود.
مثلاً در ساعات همپوشانی لندن و نیویورک، ممکن است اسپرد جفتارزهای اصلی کمتر باشد، اما در پایان جلسه نیویورک یا شروع سشن آسیایی، برخی جفتها اسپرد بیشتری داشته باشند. اگر استراتژی شما در زمانهای خاصی معامله میکند، استفاده از variable spread به شما کمک میکند اثر واقعی شرایط بازار را ببینید.
اسپرد تابع نقدشوندگی و نوسان
مدل پیشرفتهتر این است که اسپرد را بهصورت تابعی از Volatility و Liquidity مدل کنید. مثلاً هرچه ATR بالاتر باشد، اسپرد نیز بهطور تقریبی افزایش یابد. البته این یک تقریب است و باید با احتیاط استفاده شود، چون رابطه واقعی همیشه خطی نیست. با این حال، برای شبیهسازی محافظهکارانه، میتوان یک رابطه تجربی تعریف کرد که در شرایط پرنوسان، اسپرد بالاتری اعمال کند.
استفاده از Bid/Ask واقعی
بهترین حالت برای بسیاری از بازارها، استفاده از Bid/Ask ticks یا حداقل دادههای سطحی Bid/Ask است. در این حالت، وقتی استراتژی میخواهد خرید کند، از Ask و هنگام فروش از Bid استفاده میشود. این روش مخصوصاً برای بازار فارکس و بعضی بازارهای CFD و کریپتو بسیار مفید است. اگر داده واقعی Bid/Ask داشته باشید، دیگر نیازی نیست اسپرد را بهصورت دستی تخمین بزنید، زیرا خود داده آن را نمایش میدهد.
مدلسازی اسلیپیج در بکتست
اسلیپیج (Slippage) معمولاً از اسپرد پیچیدهتر است، چون نهفقط به قیمت، بلکه به نوع سفارش، سرعت بازار و نقدشوندگی بستگی دارد. برای شبیهسازی مناسب اسلیپیج، چند مدل رایج وجود دارد.
اسلیپیج ثابت
در این مدل، برای هر سفارش مقدار ثابتی اسلیپیج فرض میکنیم؛ مثلاً 0.5 پیپ یا 2 تیک. این مدل ساده است و برای تستهای مقدماتی کاربرد دارد. مزیت آن این است که اجرای آن آسان است و در محیطهایی که داده دقیق ندارید، به شما کمک میکند تصویر محافظهکارانهای داشته باشید. ضعف آن این است که با افزایش نوسان بازار یا بزرگ شدن حجم سفارش تغییر نمیکند.
اسلیپیج وابسته به نوسان
در این مدل، اسلیپیج با افزایش نوسان بازار بیشتر میشود. برای مثال، میتوان فرض کرد که اگر ATR یا انحراف معیار بازدهها از حدی بالاتر رفت، اسلیپیج نیز افزایش یابد. این مدل برای استراتژیهایی که در زمان خبر، شکست سطوح، یا حرکتهای تند قیمت معامله میکنند، واقعگرایانهتر است.
اسلیپیج وابسته به حجم سفارش
اگر حجم سفارش شما نسبت به عمق بازار بزرگ باشد، سفارش ممکن است در چند قیمت مختلف پر شود. این موضوع در بازارهای کمعمق یا آلتکوینها مهم است. در چنین حالتی میتوان اسلیپیج را تابعی از نسبت حجم سفارش به حجم متوسط بازار در نظر گرفت. هرچه سفارش بزرگتر باشد، لغزش بیشتری رخ میدهد.
مدل تصادفی
یک روش دیگر، استفاده از مدل تصادفی برای اسلیپیج است. برای مثال، اسلیپیج میتواند از یک توزیع نرمال، لاگنرمال یا حتی یک توزیع تجربی نمونهبرداری شود. این روش برای Monte Carlo simulation و تست robustness مفید است، زیرا به شما اجازه میدهد عدم قطعیت اجرا را بهتر شبیهسازی کنید.
ترکیب مدلها
در عمل، بهترین رویکرد اغلب ترکیب چند مدل است. مثلاً میتوانید اسپرد را variable و اسلیپیج را وابسته به نوسان و حجم در نظر بگیرید. یا برای معاملات کوچک از اسلیپیج ثابت و برای معاملات بزرگ از اسلیپیج تابعی استفاده کنید. هرچه مدل شما به واقعیت نزدیکتر باشد، تصمیمگیری درباره اعتبار استراتژی دقیقتر خواهد بود.
تاثیر اسپرد و اسلیپیج بر نتایج استراتژی
اسپرد و اسلیپیج فقط یک هزینه جانبی نیستند؛ آنها میتوانند ساختار آماری استراتژی را تغییر دهند. تأثیر آنها بر انواع مختلف سیستمها یکسان نیست. بعضی استراتژیها نسبت به این هزینهها مقاوماند، در حالی که برخی دیگر تقریباً با کوچکترین افزایش هزینه از سوددهی خارج میشوند.
اثر بر سود خالص
واضحترین اثر، کاهش Net Profit است. اگر استراتژی شما قبل از در نظر گرفتن هزینهها سودده باشد، اسپرد و اسلیپیج بخشی از آن سود را میبلعند. در استراتژیهایی با هدف کوچک، این اثر بسیار پررنگتر است. مثلاً اگر میانگین سود هر معامله 1.8 پیپ و مجموع هزینههای اجرا 1.5 پیپ باشد، حاشیه باقیمانده بسیار کم است و کوچکترین تغییر میتواند نتیجه را منفی کند.
اثر بر Win Rate
Win Rate همیشه بهطور مستقیم و خطی تغییر نمیکند، اما در بسیاری از استراتژیها ورود و خروج بدتر میتواند باعث شود برخی معاملات برنده به بازنده تبدیل شوند یا بالعکس. بهویژه اگر حد سود و حد ضرر نزدیک باشند، اسپرد و اسلیپیج میتواند نسبت برد را کاهش دهد. این موضوع در سیستمهای شکست مقاومتی، اسکالپینگ و mean reversion کوتاهمدت بسیار مهم است.
اثر بر Profit Factor
Profit Factor (PF) نسبت سود ناخالص به زیان ناخالص است. اگر هزینههای اجرا اضافه شوند، سود ناخالص کاهش مییابد و در برخی موارد، برخی بردها بهعلت هزینهها عملاً کوچکتر یا بیاثر میشوند. بنابراین PF اغلب یکی از اولین معیارهایی است که تحت تأثیر قرار میگیرد. استراتژیای که بدون هزینه PF جذابی دارد، ممکن است با درنظر گرفتن اسپرد و اسلیپیج به محدوده ضعیف یا غیرقابل قبول برسد.
اثر بر Drawdown
Drawdown (DD) نیز میتواند بدتر شود. هزینههای اجرا باعث میشوند معاملهها دیرتر به سود برسند یا سریعتر به ضرر تبدیل شوند. اگر استراتژی سلسلهای از معاملات زیانده را تجربه کند، عمق افت سرمایه بیشتر میشود. در برخی سیستمها، اسپرد و اسلیپیج باعث افزایش فاصله بین نقطه ورود و نقطه سر به سر میشوند و همین موضوع DD را سنگینتر میکند.
اثر بر Sharpe Ratio
Sharpe Ratio به میانگین بازده نسبت به نوسان آن بازدهها حساس است. وقتی اسپرد و اسلیپیج اضافه میشوند، میانگین بازده کاهش مییابد و گاهی واریانس بازدهها هم افزایش مییابد، چون اجراها نامنظمتر میشوند. نتیجه معمولاً کاهش شارپ است. این کاهش برای سیستمهایی که لبه آماری کمی دارند، میتواند تعیینکننده باشد.
اثر بر Expectancy
Expectancy یا امید ریاضی معامله یکی از مهمترین معیارهاست. اگر استراتژی شما قبل از هزینهها expectancy مثبت داشته باشد، اما پس از افزودن اسپرد و اسلیپیج منفی شود، آن استراتژی در عمل پایدار نیست. به همین دلیل، پیش از اتوماسیون یا استقرار واقعی، باید expectancy را با هزینههای اجرایی واقعبینانه محاسبه کرد.
مثالهای شبهواقعی از اثر اسپرد و اسلیپیج
برای درک بهتر، چند سناریوی عملی را بررسی کنیم.
سناریوی اول: اسکالپ روی EUR/USD
فرض کنید استراتژی شما روی EUR/USD در تایمفریم 1 دقیقه کار میکند و میانگین هدف هر معامله 3 پیپ است. در بکتست ساده، شما 62 درصد Win Rate و PF برابر 1.4 میبینید. اما وقتی اسپرد 1.2 پیپ و اسلیپیج متوسط 0.4 پیپ را لحاظ میکنید، بخش بزرگی از سود هر معامله از بین میرود. حالا ممکن است Win Rate تقریباً مشابه بماند، اما PF بهوضوح افت کند و expectancy ضعیف شود. اگر کمی اسپرد در ساعتهای خاص بالا برود، سوددهی ممکن است به مرز صفر برسد.
سناریوی دوم: استراتژی شکست در بازار کریپتو
فرض کنید روی BTC/USDT یک استراتژی breakout دارید که با Market Order وارد میشود. در لحظه شکست، بازار تند حرکت میکند، حجم بالا میرود و سفارش شما در قیمت بدتری پر میشود. حتی اگر سیگنال درست باشد، اسلیپیج باعث میشود نقطه ورود چند دلار یا حتی چند ده دلار بدتر شود. اگر هدف شما کوچک باشد، این لغزش کافی است تا بسیاری از معاملات برنده به معاملات کمسود یا حتی زیانده تبدیل شوند.
سناریوی سوم: میانگینگیری بازگشتی روی سهام کمحجم
در سهامی با نقدشوندگی پایین، ممکن است اسپرد زیاد باشد و عمق بازار کم. در چنین شرایطی، یک سفارش نسبتا کوچک هم میتواند قیمت اجرا را جابهجا کند. اگر بکتست روی دادههای closing prices انجام شود و هیچ خبری از spread و slippage نباشد، سیستم بیش از حد خوب به نظر میرسد. اما در عمل، با چند معامله متوالی، سود تئوریک بهسادگی از بین میرود.
روشهای عملی برای پیادهسازی در MT4 و MT5
پلتفرمهای MT4 و MT5 از رایجترین ابزارها برای بکتست در بازار فارکس و CFD هستند، اما نحوه مدلسازی هزینهها در آنها اهمیت زیادی دارد.
در MT4 معمولاً میتوان از تنظیمات اسپرد ثابت یا استفاده از دادههای واقعی بروکر کمک گرفت. اگر Strategy Tester دادههای tick دقیق نداشته باشد، بکتست ممکن است دقت کافی نداشته باشد. در این حالت، بهتر است اسپرد را در تنظیمات ورودی اکسپرت بهصورت محافظهکارانه بالا ببرید. همچنین اگر استراتژی شما بر اساس معامله در زمانهای خاص است، لازم است تفاوت اسپرد در ساعات مختلف را در نظر بگیرید.
در MT5 ابزارهای پیشرفتهتری برای تست وجود دارد و بسته به کیفیت داده، میتوانید به نتایج نزدیکتری برسید. اگر دادههای tick واقعی داشته باشید، شبیهسازی دقیقتری از Bid/Ask و اجرای سفارش ممکن است. با این حال، همچنان باید برای اسلیپیج و تاخیر، فرضهای واقعگرایانه تنظیم کنید. در برخی موارد، استفاده از سفارش Market در بکتست بدون لغزش، نتیجهای غیرواقعی تولید میکند.
نکته مهم این است که در MetaTrader، بهخصوص برای استراتژیهای سریع، باید execution model را جدی بگیرید. سفارش Limit و Market رفتار متفاوتی دارند، و اگر صرفاً پر شدن سفارش را در بهترین قیمت فرض کنید، بکتست شما محافظهکارانه نخواهد بود. بهتر است در طراحی اکسپرت، پارامترهایی برای Max Slippage و Spread Filter تعریف شود تا استراتژی در شرایط نامطلوب معامله نکند.
پیادهسازی در TradingView
در TradingView و زبان Pine Script، مدلسازی اسپرد و اسلیپیج محدودیتهایی دارد، اما همچنان میتوان رویکردهای مفیدی پیاده کرد. در بکتست استراتژیها، معمولاً کمیسیون و اسلیپیج را میتوان از تنظیمات استراتژی اعمال کرد. با این حال، اگر بخواهید اثر واقعی اسپرد را بهتر لحاظ کنید، باید از منطق ورود و خروج محافظهکارانهتر استفاده کنید.
برای مثال، اگر استراتژی شما از سیگنالهای close-based استفاده میکند، بهتر است فرض کنید خرید در سطحی کمی بالاتر از close و فروش کمی پایینتر از close انجام میشود. این کار یک تقریب از spread impact است. همچنین برای خروجها، باید هزینههای واقعی را روی قیمت اعمال کنید تا نتیجه بکتست بیش از حد خوشبینانه نشود.
در TradingView، برای استراتژیهای کوتاهمدت، ممکن است لازم باشد حد سود و حد ضرر را بهصورت تعدیلشده تعریف کنید تا از خطای قیمت اجرا جلوگیری شود. بهطور عملی، اگر یک استراتژی روی نمودارهای 1 تا 5 دقیقه اجرا میشود، استفاده از یک buffer کوچک برای ورود و خروج میتواند شبیهسازی واقعگرایانهتری بسازد.
پیادهسازی در Python، backtrader و zipline
در محیطهای Python-based مثل backtrader و zipline انعطاف بالاتر است و میتوانید مدلهای پیچیدهتری برای اسپرد و اسلیپیج بسازید. این مزیت به شما اجازه میدهد استراتژی را به شکل نزدیکتری به واقعیت آزمایش کنید.
backtrader
در backtrader میتوان از slippage و commission models استفاده کرد. شما میتوانید یک مدل slippage ثابت تعریف کنید یا با استفاده از subclassهای سفارشی، اسلیپیج را تابعی از نوسان یا حجم قرار دهید. همچنین اگر دادههای Bid/Ask داشته باشید، میتوانید feedهای جداگانه تعریف کنید و قیمت اجرا را بر اساس سمت سفارش تعیین نمایید.
برای مثال، اگر استراتژی شما در بازارهای پرنوسان کار میکند، میتوانید هنگام high volatility، درصد بیشتری slippage اعمال کنید. این کار باعث میشود نتایج از حالت ایدهآل دورتر و واقعگرایانهتر شوند. در backtrader، مهم است که منطق order execution را با نوع سفارشها هماهنگ کنید؛ یعنی Market، Limit، Stop و StopLimit هرکدام را با رفتار مناسب شبیهسازی کنید.
zipline
در zipline نیز میتوانید هزینهها را با مدلهای کمیسیون و اسلیپیج تعیین کنید. اگرچه zipline بیشتر برای پژوهشهای آکادمیک و equity-based workflows مشهور است، اما با تنظیم مناسب میتوان اثر execution را بهخوبی لحاظ کرد. در این محیط، بهتر است اسلیپیج را فقط یک عدد ثابت نبینید و در صورت امکان از مدلهای price impact یا volume impact بهره ببرید.
مدلسازی سفارشی در Python
اگر بخواهید دقیقتر کار کنید، میتوانید یک مدل سفارشی بنویسید که برای هر سفارش، ابتدا اسپرد را از دیتا یا تخمین دریافت کند، سپس اسلیپیج را با توجه به volatility، order size و liquidity اضافه کند. مثلاً:
- برای خرید: (fill_price = ask + slippage)
- برای فروش: (fill_price = bid – slippage)
این الگو ساده است، اما به شما اجازه میدهد در سطح کد، هزینههای اجرا را شفاف و قابل کنترل کنید. اگر در داده فقط mid price دارید، میتوانید با یک spread model دو طرف بازار را بازسازی کنید و بعد slippage را روی سمت مناسب اعمال نمایید.
چگونه اسپرد و اسلیپیج را از روی داده تخمین بزنیم؟
اگر داده Bid/Ask مستقیم ندارید، باید راهی برای تخمین هزینهها پیدا کنید. این تخمین هرگز به اندازه داده واقعی دقیق نیست، اما بهتر از نادیده گرفتن کامل آنهاست.
یکی از روشها این است که از اسپرد متوسط تاریخی برای نماد مربوطه استفاده کنید. اگر به داده تیک یا منبعی با عمق بازار دسترسی دارید، میتوانید توزیع اسپرد را در ساعات مختلف روز محاسبه کنید و یک مقدار محافظهکارانهتر برای بکتست انتخاب کنید. برای مثال، اگر میانگین اسپرد در ساعات عادی 0.8 پیپ و در ساعات کمنقدشونده 2.1 پیپ است، استفاده از عدد 1.5 یا 2 پیپ برای بکتست میتواند رویکرد محتاطانهتری باشد.
برای اسلیپیج نیز میتوان از دادههای گذشته، اختلاف بین قیمت سیگنال و قیمت پر شدن واقعی در معاملات قبلی استفاده کرد. اگر سابقه اجرای واقعی دارید، این بهترین منبع برای تخمین slippage است. اگر ندارید، میتوانید با شبیهسازیهای آزمایشی یا paper trading این مقدار را برآورد کنید. در نهایت، مهم این است که تخمین شما فقط خوشبینانه نباشد؛ باید به سمت سناریوهای بدتر نیز متمایل باشد.
تاثیر در استراتژیهای مختلف
همه استراتژیها به یک اندازه از اسپرد و اسلیپیج آسیب نمیبینند. شدت اثر وابسته به ساختار استراتژی است.
اسکالپینگ
در Scalping، چون هدفهای قیمتی کوچکاند، اسپرد و اسلیپیج دشمن اصلی سوددهی هستند. این استراتژیها معمولاً به اجرای بسیار دقیق و کمهزینه نیاز دارند. اگر بکتست اسکالپر بدون هزینه واقعی انجام شود، غالباً عملکردی غیرواقعی نمایش میدهد.
معامله روندی
در استراتژیهای Trend Following، تارگتهای بزرگتر معمولاً نسبت به هزینههای اجرا مقاومترند. با این حال، اگر ورودهای زیادی دارید یا از شکستهای کوتاهمدت استفاده میکنید، اثر اسپرد و اسلیپیج همچنان مهم است. در اینجا اگرچه استراتژی ممکن است تحمل بیشتری داشته باشد، اما باید باز هم هزینهها لحاظ شوند.
mean reversion
در Mean Reversion، بهخصوص اگر تایمفریم پایین باشد، ورود و خروج دقیق بسیار اهمیت دارد. اگر بازار کمنقدشونده باشد، اسپرد بالا و اسلیپیج منفی میتواند بخش زیادی از مزیت بازگشتی را از بین ببرد. بنابراین، این نوع استراتژیها نسبت به هزینههای اجرا بسیار حساساند.
استراتژیهای آربیتراژ
در استراتژیهای Arbitrage، کوچکترین اختلاف قیمت اهمیت دارد. در چنین سیستمهایی، چند تیک یا چند صدم درصد هزینه اجرا ممکن است کل edge را نابود کند. در نتیجه، مدلسازی دقیق اسپرد و اسلیپیج نهتنها مفید، بلکه ضروری است.
روشهای کنترل و اعتبارسنجی بکتست
برای اینکه بکتست شما قابل اعتماد باشد، باید فقط به یک بار اجرای تاریخی اکتفا نکنید. اعتبارسنجی (Validation) چندلایه، بخش ضروری فرایند است.
Walk-forward analysis
در Walk-forward، داده به بازههای متوالی تقسیم میشود و مدل در یک بخش آموزش داده شده و در بخش بعدی تست میشود. این کار کمک میکند ببینید استراتژی در شرایط جدید و خارج از داده آموزشی چگونه عمل میکند. همچنین برای بررسی اثر اسپرد و اسلیپیج در رژیمهای مختلف بازار بسیار مفید است.
Out-of-sample testing
آزمون Out-of-sample یکی از مهمترین ابزارها برای جلوگیری از overfitting است. اگر استراتژی فقط روی دادههای آموزشی خوب عمل میکند، اما روی دادههای خارج از نمونه ضعیف میشود، احتمالاً پارامترها بیش از حد به گذشته فیت شدهاند. افزودن هزینههای واقعی در out-of-sample میتواند تصویر دقیقتری از پایداری سیستم بدهد.
Monte Carlo simulation
با Monte Carlo میتوانید ترتیب معاملات، هزینهها، یا اسلیپیج را بهصورت تصادفی تغییر دهید و ببینید نتایج تا چه حد پایدارند. اگر با تغییرات کوچک در اجرای معاملات، سوددهی بهشدت نوسان کند، استراتژی شکننده است. این روش برای فهم حساسیت سیستم به هزینههای نامطمئن بسیار ارزشمند است.
Stress testing
در Stress Test، شرایط نامطلوب را شبیهسازی میکنید: اسپرد بالاتر، اسلیپیج بیشتر، تاخیر در اجرا، و حتی پر شدن ناقص سفارش. اگر استراتژی در این شرایط همچنان قابل قبول بماند، اعتماد به آن بیشتر میشود. این تست بهخصوص برای بازارهای پرنوسان و اخبار مهم ضروری است.
اشتباهات رایج در مدلسازی اسپرد و اسلیپیج
بسیاری از تریدرها و برنامهنویسها در این بخش دچار خطاهای مشابه میشوند. شناخت این اشتباهات از اتلاف زمان و سرمایه جلوگیری میکند.
فرض صفر بودن هزینهها
شاید رایجترین اشتباه این باشد که تصور کنیم هزینه اجرا ناچیز است و میتوان آن را نادیده گرفت. در برخی استراتژیها این فرض کاملاً نابودکننده است. حتی اگر بهظاهر اسپرد کوچک باشد، در معاملات پرتعداد اثر آن قابل توجه خواهد بود.
استفاده از یک عدد ثابت برای همه شرایط
اسپرد و اسلیپیج در همه ساعات و همه شرایط یکسان نیستند. استفاده از یک عدد ثابت بدون سناریوسازی، اغلب دقت بکتست را کاهش میدهد. بهتر است حداقل چند رژیم مختلف بازار را مدل کنید.
نادیده گرفتن نوع سفارش
Market Order، Limit Order و Stop Order رفتار متفاوتی دارند. اگر این تفاوتها در بکتست دیده نشود، نتایج غیرواقعی خواهند بود. بهویژه Market Order بیشترین حساسیت را به slippage دارد.
اعتماد بیش از حد به دادههای تمیز
دادههای historical OHLC همیشه نماینده دقیق واقعیت نیستند. اگر منطق اجرا فقط بر اساس high/low کندل باشد، ممکن است فرضهای غیرممکن ایجاد شود، مثل پر شدن در قیمتی که در عمل دسترسپذیر نبوده است.
عدم بررسی شرایط خبری
در زمان خبرهای اقتصادی مهم، اسپرد و اسلیپیج میتوانند جهش کنند. اگر استراتژی شما در چنین زمانهایی فعال است، نادیده گرفتن این مسئله یک خطای جدی است.
چکلیست بکتست حرفهای
اگر میخواهید بکتست شما به ارزیابی حرفهای نزدیک شود، این چکلیست میتواند راهنما باشد:
- داده با کیفیت: تا حد امکان از tick data یا bid/ask data استفاده کنید.
- مدل اسپرد: ثابت، متغیر یا مبتنی بر شرایط بازار را مشخص کنید.
- مدل اسلیپیج: ثابت، تصادفی، وابسته به نوسان یا وابسته به حجم را تعریف کنید.
- کارمزدها: commission و سایر هزینهها را وارد کنید.
- نوع سفارش: رفتار Market، Limit و Stop را جداگانه شبیهسازی کنید.
- زمان معاملات: اثر سشنهای معاملاتی و ساعات کمنقدشونده را لحاظ کنید.
- Out-of-sample: حتماً تست خارج از نمونه انجام دهید.
- Walk-forward: برای ارزیابی پایداری پارامترها استفاده کنید.
- Monte Carlo: حساسیت نتایج به تغییرات تصادفی را بررسی کنید.
- Stress test: شرایط بدتر از حالت عادی را امتحان کنید.
- ثبت مفروضات: تمام فرضها را مستند کنید تا بعداً قابل بازبینی باشند.
- تحلیل معاملهبهمعامله: ببینید هزینهها روی کدام دسته از معاملات بیشتر اثر دارند.
- بررسی market regime: رفتار سیستم را در روند، رنج و خبر جداگانه بسنجید.
- بازبینی robustness: از خود بپرسید آیا استراتژی با کمی بدتر شدن اجرا هنوز زنده میماند یا نه.
معیارهایی که باید بعد از افزودن هزینهها دوباره بررسی شوند
پس از مدلسازی اسپرد و اسلیپیج، نباید صرفاً به سود خالص نگاه کنید. چند معیار باید دوباره محاسبه و مقایسه شوند.
Sharpe Ratio
اگر شارپ پس از افزودن هزینهها بهوضوح افت کند، یعنی استراتژی نسبت به هزینههای اجرا شکننده است.
Profit Factor
PF پایینتر از حد انتظار میتواند نشان دهد که لبه آماری استراتژی با هزینهها تضعیف شده است.
Max Drawdown
افزایش DD نشانه آن است که اجرای واقعی استراتژی ریسک بیشتری نسبت به نسخه ایدهآل دارد.
Win Rate و Payoff Ratio
گاهی Win Rate تغییر زیادی نمیکند، اما Payoff Ratio یا نسبت میانگین سود به میانگین زیان بدتر میشود. این تغییر در بلندمدت بسیار مهم است.
Expectancy
اگر expectancy بعد از هزینهها ضعیف یا منفی شود، استراتژی برای اجرای واقعی نیاز به بازطراحی دارد.
چگونه استراتژی را در برابر اسپرد و اسلیپیج مقاوم کنیم؟
هدف نهایی فقط مدلسازی این هزینهها نیست؛ بلکه باید استراتژی را طوری طراحی کرد که نسبت به آنها مقاوم باشد.
افزایش حاشیه سود هر معامله
اگر تارگت شما آنقدر کوچک باشد که با یک نوسان جزئی از بین برود، استراتژی پایدار نیست. یکی از راهحلها، افزایش میانگین سود مورد انتظار در هر معامله است تا هزینهها درصد کمتری از edge را مصرف کنند.
کاهش تعداد معاملات غیرضروری
هر معامله هزینه دارد. اگر بتوانید فیلترهای بهتر برای کاهش سیگنالهای ضعیف اضافه کنید، تعداد ورودهای کمکیفیت کمتر میشود و اثر تجمعی هزینهها کاهش مییابد.
استفاده از Limit Order در شرایط مناسب
در برخی سیستمها، Limit Order میتواند هزینه اجرا را کاهش دهد، البته با ریسک نرسیدن سفارش. این انتخاب باید با توجه به ماهیت استراتژی انجام شود.
اجتناب از ساعات پرهزینه
اگر استراتژی شما در ساعات خاصی هزینه بیشتری دارد، میتوان آن ساعات را فیلتر کرد. برای مثال، برخی سیستمها بهتر است در زمان انتشار خبر یا باز شدن بازار معامله نکنند.
بهینهسازی بر پایه robustness نه صرفاً profit
اگر پارامترها را فقط برای بیشترین سود روی تاریخ گذشته انتخاب کنید، احتمال overfitting بالا میرود. بهتر است پارامترهایی را انتخاب کنید که در بازههای مختلف و با هزینههای متفاوت همچنان عملکرد قابل قبول داشته باشند.
یک چارچوب پیشنهادی برای ارزیابی حرفهای
اگر بخواهیم یک فرآیند عملی برای ارزیابی استراتژی ارائه دهیم، میتوان این مراحل را پیشنهاد کرد:
- ابتدا بکتست خام بدون هزینه اجرا نگیرید و آن را معیار نهایی فرض نکنید.
- حداقل یک مدل fixed spread و یک مدل variable spread را مقایسه کنید.
- برای Slippage سه حالت خوشبینانه، میانه و محافظهکارانه تعریف کنید.
- نتایج را روی in-sample و out-of-sample جداگانه بررسی کنید.
- با walk-forward پایداری پارامترها را بسنجید.
- با Monte Carlo حساسیت به عدم قطعیت اجرا را ارزیابی کنید.
- استراتژی را در چند رژیم بازار، از جمله رنج، روند، خبر و نوسان بالا بررسی کنید.
- اگر سوددهی فقط در سناریوی ایدهآل باقی میماند، از اجرای واقعی آن صرفنظر کنید یا آن را بازطراحی نمایید.
پرسشهای متداول
آیا همیشه باید اسپرد و اسلیپیج را در بکتست لحاظ کرد؟
بله، تقریباً همیشه. حتی اگر استراتژی شما روی تایمفریمهای بالاتر کار میکند، دستکم باید یک مدل محافظهکارانه از این هزینهها را وارد کنید. فقط شدت اثر در استراتژیهای مختلف فرق میکند.
اسپرد مهمتر است یا اسلیپیج؟
وابسته به نوع استراتژی است. در معاملات کوتاهمدت، اسپرد میتواند نقش بسیار پررنگی داشته باشد. در معاملات خبری یا بازارهای سریع، اسلیپیج ممکن است مهمتر شود. در بسیاری از موارد، ترکیب هر دو اثر تعیینکننده است.
آیا میتوان از اسپرد ثابت استفاده کرد؟
برای تست اولیه بله، اما بهعنوان مدل نهایی نه لزوماً. Fixed spread یک تقریب ساده است و باید با احتیاط استفاده شود. اگر امکانش را دارید، variable spread یا داده Bid/Ask واقعی بهتر است.
چگونه مقدار اسلیپیج مناسب را انتخاب کنیم؟
بهتر است از دادههای واقعی معاملات خودتان، paper trading، یا سناریوهای محافظهکارانه استفاده کنید. اگر داده ندارید، چند سناریو با سطوح مختلف اسلیپیج بسازید و ببینید آیا استراتژی در بدترین حالت هم قابل قبول میماند یا نه.
آیا در TradingView میتوان اسلیپیج واقعی را شبیهسازی کرد؟
تا حدی بله، اما محدودیتهایی وجود دارد. میتوان از تنظیمات commission و slippage استفاده کرد و منطق ورود/خروج را محافظهکارانهتر نوشت. برای دقت بیشتر، گاهی بهتر است استراتژی را در Python یا محیطی با کنترل بیشتر تست کنید.
چرا استراتژیای که در بکتست عالی است، در حساب واقعی ضعیف میشود؟
یکی از دلایل اصلی، نادیده گرفتن اسپرد، اسلیپیج و هزینههای اجرایی است. علاوه بر آن، overfitting، تفاوت کیفیت داده، تاخیر اجرا و تغییر رفتار بازار هم میتوانند نقش داشته باشند.
جمعبندی مفهومی
وقتی صحبت از ارزیابی یک استراتژی میشود، بکتست (Backtest) فقط زمانی ارزش واقعی دارد که به واقعیت اجرایی نزدیک باشد. اسپرد (Spread) و اسلیپیج (Slippage) دو عامل بنیادین در این نزدیکی هستند. نادیده گرفتن آنها میتواند یک سیستم ضعیف را سودده نشان دهد، و در مقابل، مدلسازی واقعگرایانه میتواند استراتژیای را که در ظاهر جذاب است اما در عمل شکننده است، از همان ابتدا غربال کند.
برای تریدرها و برنامهنویسهایی که میخواهند سیستم پایدار بسازند، نگاه درست این است که بکتست را نه بهعنوان اثبات قطعی سود، بلکه بهعنوان آزمایش مقاومت در برابر واقعیت بازار ببینند. هرچه مدل شما درباره هزینهها دقیقتر باشد، تصمیم نهاییتان قابل اعتمادتر خواهد بود. در نهایت، استراتژیای که فقط در دنیای بدون اسپرد و بدون اسلیپیج سود میدهد، در بازار واقعی احتمالاً استراتژیای آماده اجرا نیست؛ بلکه صرفاً یک فرضیه آزمایشنشده است.
دیدگاهها