بررسی ربات معاملات گرید Grid Trading Bot
ربات گرید در یک محدوده ثابت در هر پله پایین خرید و در هر پله بالا میفروشد. این مقاله شکل بازاری که برای این مکانیزم سودآور است و شکلی که آن را از کار میاندازد، بررسی میکند.
یک ربات معاملات گرید (Grid Trading Bot) مجموعهای از سفارشها را در فواصل قیمتی ثابت قرار میدهد: یک سفارش خرید در هر پله زیر قیمت فعلی و یک سفارش فروش در هر پله بالای آن. هر بار که بازار پایین میآید، ربات خرید میکند. هر بار که بازار بالا برمیگردد، ربات آنچه را که در قیمت پایینتر خریده میفروشد. این مکانیزم از نوسانات سود میبرد و هرگاه بازار در یک جهت از نردبان دور شده و به حرکت خود ادامه دهد، یک موقعیت باز (Open Position) انباشته میکند.
این صفحه مکانیزم را به اجزاء تقسیم میکند و سپس دو شکل از بازار را که نتیجه آن را تعیین میکنند، اندازهگیری میکند. هر پنل زیر یک پرسوجوی ذخیرهشده (Stored Query) روی قیمتهای واقعی سهام ایالات متحده است که به تاریخهای مشخصی متصل شده تا ارقام قابل تکرار باقی بمانند.
نحوه کار یک ربات معاملات گرید
سه تنظیمات یک گرید را تعریف میکنند: کرانهای بالا و پایین محدوده، تعداد خطوط درون آن و اندازه سفارش در هر خط. فاصله بین خطوط از دو مورد اول به دست میآید.
در اینجا محاسبات با استفاده از اعداد گرد که برای وضوح انتخاب شدهاند (نه از یک قیمت واقعی) آورده شده است. فرض کنید سهامی نزدیک 100 دلار معامله میشود و یک اپراتور گریدی را از 95 تا 105 دلار با یازده خط با فاصله یک دلار و 100 سهم در هر خط تنظیم میکند. قیمت به 99 دلار کاهش مییابد و سفارش خرید در انتظار (Resting Buy) اجرا میشود. قیمت به 100 دلار بازمیگردد و سفارش فروش منطبق اجرا میشود و این جفت را با سود ناخالص 100 دلار میبندد. هر دو سفارش دوباره فعال میشوند. در آن ساعت هیچ چیز در مورد شرکت تغییر نکرده است. موقعیت صرفاً یک سفر رفت و برگشت بین دو پله مجاور را تکمیل کرده است.
دو نوع از این روش در پروژههای متنبازی که به صورت عمومی منتشر میشوند دیده میشود. یک گرید حسابی (Arithmetic Grid) خطوط را با مقدار دلاری ثابت فاصله میدهد. یک گرید هندسی (Geometric Grid) آنها را با درصد ثابتی فاصله میدهد که درصد سود هر سفر رفت و برگشت را در یک محدوده وسیع ثابت نگه میدارد. مستندات همچنین یک گرید خنثی (Neutral Grid) را که بدون موقعیت شروع میشود و در هر دو جهت کار میکند، از یک گرید بلندمدت (Long Grid) که شروع به نگهداری موجودی میکند و در زمان قدرت میفروشد، جدا میکند.
شکل بازدهی (Payoff Shape) شایسته یک جمله ساده است. سود حاصل از یک سفر رفت و برگشت کامل به اندازه یک پله گرید منهای هزینهها محدود میشود. موقعیت باز (Open Position) که وقتی قیمت از محدوده خارج میشود انباشته میشود، هیچ محدودیت منطبقی ندارد.
شکل بازاری که یک گرید به آن نیاز دارد
یک گرید با حرکت (Travel) پرداخت میشود، نه با جهت. دو سهم میتوانند یک دوره را با قیمت یکسان پس از پیمودن مسافتهای بسیار متفاوت به پایان برسانند. جمع کردن قدر مطلق هر حرکت روزانه، کل مسافت طی شده (Total Distance Traveled) را به دست میدهد. تقسیم حرکت خالص (Net Move) بر آن مسافت، نسبت کارایی (Efficiency Ratio) را به دست میدهد، که یک معیار استاندارد برای میزان جهتدار بودن یک مسیر است. نسبت پایین مسیری را توصیف میکند که سرگردان بوده است. نسبت بالا یک حرکت مستقیم را توصیف میکند.
کد دقیق SQL پشت هر عدد
WITH daily AS (
SELECT ticker,
toDate(toTimeZone(window_start, 'America/New_York')) AS dt,
argMax(toFloat64(close), toTimeZone(window_start, 'America/New_York')) AS c
FROM global_markets.delayed_stocks_minute_aggs
WHERE ticker IN ('SPY','KO','PG','JNJ','VZ','MO','XOM','JPM','WMT','NVDA','TSLA','NFLX')
AND toDate(toTimeZone(window_start, 'America/New_York')) BETWEEN toDate('2024-01-02') AND toDate('2026-06-30')
AND (toHour(toTimeZone(window_start, 'America/New_York')) * 60
+ toMinute(toTimeZone(window_start, 'America/New_York'))) BETWEEN 570 AND 959
GROUP BY ticker, dt
),
steps AS (
SELECT ticker, dt, c,
c / lagInFrame(c) OVER (PARTITION BY ticker ORDER BY dt) - 1 AS ret
FROM daily
)
SELECT ticker,
round(sum(abs(ret)) * 100, 0) AS travel_pct,
round(abs(argMax(c, dt) / argMin(c, dt) - 1) * 100, 1) AS net_move_pct,
round(100 * abs(argMax(c, dt) / argMin(c, dt) - 1) / sum(abs(ret)), 1) AS efficiency_pct
FROM steps
WHERE ret > -0.5 AND ret < 0.5
GROUP BY ticker
ORDER BY efficiency_pctردیف اول و آخر را با هم بخوانید. PG پوشش دهنده 527% از حرکت روزانه تجمعی بود و 0.9% از جایی که شروع کرده بود فاصله داشت، با کارایی 0.2%. SPY در انتهای مخالف با 14.3% قرار دارد و 415% از سفر را به یک حرکت خالص 59.2% تبدیل میکند. یک نردبان گرید که روی مسیر اول قرار میگیرد بارها و بارها با پلههای خود برخورد میکند. همان نردبان که روی مسیر دوم قرار میگیرد، جا میماند.
آرام (Calm) و محدود-دامنه (Range-Bound) ویژگیهای مرتبط اما متمایزی هستند. یک سهم میتواند با افزایشهای روزانه بسیار کوچک به آرامی حرکت صعودی داشته باشد و همچنان یک گرید را سرگردان بگذارد، که یکی از دلایلی است که نامهای مورد مطالعه در ادبیات ناهنجاری نوسان کم (Low-Volatility Anomaly) به طور خودکار مواد مناسبی برای گرید نیستند.
شمارش سفرهای رفت و برگشت
کارایی یک لنز است. درآمد گرید به چیز ملموستری بستگی دارد: اینکه قیمت واقعاً چند بار به یک سطح بازمیگردد. با لنگر انداختن روی اولین بسته شدن هر سال تقویمی و شمارش جلساتی که بسته شدن آنها در طرف مقابل آن لنگر قرار میگیرد، تعداد عبورهایی که یک خط گرید واحد میتوانست ثبت کند به دست میآید. کوکاکولا (KO) موضوع اینجاست، یک نام مصرفی بزرگ و نقدشونده از نوعی که مستندات گرید تمایل به نمایش آن دارند.
کد دقیق SQL پشت هر عدد
WITH daily AS (
SELECT toDate(toTimeZone(window_start, 'America/New_York')) AS dt,
argMax(toFloat64(close), toTimeZone(window_start, 'America/New_York')) AS c
FROM global_markets.delayed_stocks_minute_aggs
WHERE ticker = 'KO'
AND toDate(toTimeZone(window_start, 'America/New_York')) BETWEEN toDate('2019-01-01') AND toDate('2025-12-31')
AND (toHour(toTimeZone(window_start, 'America/New_York')) * 60
+ toMinute(toTimeZone(window_start, 'America/New_York'))) BETWEEN 570 AND 959
GROUP BY dt
),
anchored AS (
SELECT toYear(dt) AS year, dt, c,
first_value(c) OVER (PARTITION BY toYear(dt) ORDER BY dt) AS anchor
FROM daily
),
sided AS (
SELECT year, dt, c, anchor,
if(c >= anchor, 1, 0) AS side,
row_number() OVER (PARTITION BY year ORDER BY dt) AS rn,
lagInFrame(if(c >= anchor, 1, 0)) OVER (PARTITION BY year ORDER BY dt) AS prev_side
FROM anchored
)
SELECT year,
countIf(rn > 1 AND side != prev_side) AS crossing_count,
count() AS sessions,
round((argMax(c, dt) / any(anchor) - 1) * 100, 1) AS net_change_pct
FROM sided
GROUP BY year
ORDER BY yearدر 2019 بسته شدن از سطح افتتاحیه خود در 8 نوبت در طول 252 جلسه عبور کرد و سال را با 17.9% فاصله از آن سطح به پایان رساند. در 2025 تعداد 6 در طول 250 جلسه بود، با تغییر خالص 13%. یک خط، یک سهم، و مواد خام برای یک گرید چندین برابر از سالی به سال دیگر بدون هیچ راهی برای دانستن تعداد سال آینده از قبل، متفاوت است.
این تغییرپذیری مشکل خاموش است. بازده تبلیغ شده یک گرید معمولاً به ازای هر سفر رفت و برگشت کامل نقل میشود، و تعداد سفرهای رفت و برگشت توسط بازار تعیین میشود، نه توسط تنظیمات.
جایی که یک گرید از کار میافتد
حالت شکست شکل خاصی دارد. یک گرید را در یک محدوده ثابت کنید، سپس اجازه دهید بازار آن را ترک کند. در زیر، سقف و کف بالاترین و پایینترین بسته شدنهای بیست جلسه اول سال 2024 هستند که در طول سی ماه بعدی ثابت نگه داشته شدهاند، با بسته شدن ماهانه ردیاب S&P 500 در برابر آنها ترسیم شده است.
کد دقیق SQL پشت هر عدد
WITH daily AS (
SELECT toDate(toTimeZone(window_start, 'America/New_York')) AS dt,
argMax(toFloat64(close), toTimeZone(window_start, 'America/New_York')) AS c
FROM global_markets.delayed_stocks_minute_aggs
WHERE ticker = 'SPY'
AND toDate(toTimeZone(window_start, 'America/New_York')) BETWEEN toDate('2024-01-02') AND toDate('2026-06-30')
AND (toHour(toTimeZone(window_start, 'America/New_York')) * 60
+ toMinute(toTimeZone(window_start, 'America/New_York'))) BETWEEN 570 AND 959
GROUP BY dt
),
opening_20 AS (
SELECT c FROM daily ORDER BY dt LIMIT 20
),
band AS (
SELECT min(c) AS grid_low, max(c) AS grid_high FROM opening_20
),
monthly AS (
SELECT toStartOfMonth(dt) AS month_start, argMax(c, dt) AS close_px
FROM daily
GROUP BY month_start
)
SELECT formatDateTime(monthly.month_start, '%Y-%m') AS month,
round(monthly.close_px, 2) AS spy_close,
round(band.grid_high, 2) AS grid_top,
round(band.grid_low, 2) AS grid_bottom
FROM monthly, band
ORDER BY monthly.month_startباند از $467.27 تا $491.26 اجرا میشود. اولین ماه در این سری در $482.92 بسته شد، داخل آن. آخرین ماه از 30 ماه در $746.32 بسته شد، بسیار بالاتر از سقف، و نمودار نشان میدهد که خط از باند خارج شده و هرگز بازنگشته است.
مرور کنید که نردبان در طول این مسیر چه میکند. با افزایش قیمت در محدوده، ربات موجودی را پله به پله میفروشد و هر بار یک پله سود را بانکی میکند. بالای سقف، ربات پول نقد نگه میدارد و تماشا میکند. هر نقطه بیشتر از پیشرفت، سودی است که اپراتور دیگر در آن مشارکت نمیکند، که نسخه ملایم شکست است.
نسخه شدید تصویر آینهای است. قیمت از کف پایین میآید و ربات در هر پله در مسیر پایین خرید کرده است، بنابراین اکنون کل نردبان موجودی را با هزینه متوسط بالاتر از بازار در اختیار دارد، و هر گام اضافی زیان تحققنیافته (Unrealized Loss) را گسترش میدهد. یک محدوده که زمانی معاملات کوچک، ثابت و ظاهراً موفقی تولید میکرد به یک موقعیت متمرکز واحد تبدیل میشود. بازاریابی گرید این را به عنوان «گیر کردن» ربات توصیف میکند؛ در صورت حساب کارگزاری، این یک برداشت (Drawdown) باز بدون خروج داخلی است.
هزینهها با تعداد معاملات مقیاس میشوند
یک گرید بسیاری از معاملات کوچک را تکمیل میکند و هر کدام هزینه کامل یک سفر رفت و برگشت را میپردازد: اسپرد (Spread)، به علاوه کارمزدها یا هزینههای مبادله در جایی که اعمال میشوند. اسپرد خرید-فروش (Bid-Ask Spread) قطعهای است که اغلب از محاسبات گرید حذف میشود، زیرا هرگز به عنوان یک آیتم خطی در صورت حساب ظاهر نمیشود.
محاسبات توضیحی سریع است. روی سهامی با قیمت 100 دلار با اسپرد یک سنت، یک سفر رفت و برگشت که اسپرد را در هر دو طرف طی میکند، تقریباً دو سنت یا 0.02٪ از ارزش اسمی (Notional) را از دست میدهد. در مقابل یک پله گرید یک دلاری، این حدود 2٪ از سود ناخالص هر سفر است. اسپرد را به پنج سنت افزایش دهید، که یک رقم معمول برای یک نام نازکتر (Thinner Name) است، و همان سفر ده سنت را در مقابل یک دلار سود ناخالص از دست میدهد، یا 10٪. تنگ کردن گرید به پلههای ده سنتی برای گرفتن نوسانات بیشتر، سود ناخالص هر سفر را به ده سنت کاهش میدهد در حالی که هزینه را بدون تغییر میگذارد، و اسپرد پنج سنتی اکنون کل معامله را مصرف میکند.
این رابطه یک کف برای فاصلهگذاری مفید گرید تعیین میکند: پلهها باید نسبت به هزینههای سفر رفت و برگشت بزرگ باقی بمانند، و هرچه گرید تنگتر باشد، سهم بیشتری از درآمد آن به محل معامله (Venue) تعلق میگیرد تا به اپراتور.
چرا بکتستها رباتهای گرید را بهتر از واقعیت نشان میدهند
استراتژیهای گرید بکتستهای غیرعادی جذابی تولید میکنند و چهار دلیل ساختاری بیشتر آن را توضیح میدهد.
- انتخاب محدوده با نگاه به گذشته (Hindsight). کرانهایی که پس از دیدن دادهها انتخاب میشوند، دادهها را در خود جای خواهند داد. یک گرید که برای دورهای محدود-دامنه تنظیم شده است، نرخ موفقیت بالایی را در آن دوره نشان میدهد.
- نردبان بسته نشده (Unclosed Ladder). آزمایشی که در یک تاریخ پایان انتخابی متوقف میشود، اغلب سفرهای رفت و برگشت تحققیافته را شمارش میکند در حالی که با موجودی باقیمانده سخاوتمندانه برخورد میکند. حسابداری صادقانه، موقعیت باز را در روز پایانی به قیمت بازار (Mark to Market) ارزشگذاری میکند و آن زیان را در نتیجه لحاظ میکند.
- فرضیات اجرا (Fill Assumptions). سفارشهای در انتظار شبیهسازیشده هر زمان که قیمت به آنها برخورد کند پر میشوند. صفهای واقعی همیشه در نقطه برخورد پر نمیشوند و سفرهایی که پر نمیشوند، به طور نامتناسبی سفرهای سودآور در بازارهای سریع هستند.
- چگالی پارامتر (Parameter Density). کرانها، تعداد خطوط، فاصله و اندازه سفارش چهار دستگیره روی یک سری قیمت واحد را فراهم میکنند که برای تطبیق با تقریباً هر پنجره تاریخی کافی است.
تعداد عبورهای بالا وزنه تعادلی در برابر هر چهار مورد است. آنها صرفاً از تاریخچه قیمت و بدون هیچ تنظیماتی میآیند و سال به سال به گونهای تغییر میکنند که هیچ انتخاب پارامتری آن را کنترل نمیکند. هر کسی که ادعای یک گرید را ارزیابی میکند میتواند یک سوال واحد از آن بپرسد: این به چند سفر رفت و برگشت کامل بستگی دارد و آن تعداد از کجا آمده است؟ یک دوره تمرین روی یک شبیهساز، با نردبان باز که در پایان به قیمت بازار ارزشگذاری شده است، صادقانهتر از یک نمودار از سفرهای تحققیافته به آن پاسخ میدهد.
پرسشهای متداول
آیا رباتهای معاملات گرید واقعاً پول در میآورند؟
یک گرید روی هر سفر رفت و برگشت کامل سود محدودی به دست میآورد و زمانی که قیمت از محدوده خود خارج میشود، یک موقعیت باز نامحدود (Uncapped) حمل میکند. این که آیا سفرهای تحققیافته در هر دوره بر موقعیت باز برتری دارند یا خیر، به میزان نوسان بازار در آن محدوده بستگی دارد، که این ویژگی بازار است نه نرمافزار.
چه شرایط بازاری برای یک ربات گرید مناسب است؟
این مکانیزم برای قیمتی ساخته شده است که مکرراً به سطوح یکسان بازمیگردد: کل مسافت طی شده بالا نسبت به حرکت خالص. در پنل دوازدهنامی بالا، نسبتهای کارایی از 0.2% در انتهای سرگردان تا 14.3% در انتهای جهتدار متغیر بود و مکانیزم نردبان فقط در انتهای اول با پلههای خود برخورد میکند.
وقتی قیمت از محدوده گرید خارج میشود چه اتفاقی میافتد؟
بالای محدوده، ربات موجودی خود را فروخته و در حالی که بازار بدون آن ادامه میدهد، پول نقد نگه میدارد. پایین محدوده، ربات هر پلهای را که در مسیر پایین خریده است، با هزینه متوسط بالاتر از قیمت فعلی نگه میدارد و هر کاهش بیشتر آن زیان تحققنیافته را گسترش میدهد.
تفاوت معاملات گرید با میانگینگیری هزینه دلاری (Dollar-Cost Averaging) چیست؟
هر دو با کاهش قیمت بیشتر خرید میکنند و شباهت در همین جا به پایان میرسد. میانگینگیری هزینه دلاری مقدار ثابتی را در یک برنامه زمانی ثابت بدون قانون خروج و بدون کران بالا اضافه میکند. یک گرید بر اساس محرکهای قیمتی در یک محدوده از پیش انتخابشده خرید و فروش میکند و رفتار آن پس از خروج قیمت از آن محدوده کاملاً تغییر میکند.
آیا فاصله تنگتر گرید درآمد بیشتری تولید میکند؟
فاصله تنگتر تعداد سفرهای رفت و برگشت را افزایش میدهد و سود ناخالص هر یک را کاهش میدهد، در حالی که هزینه سفر رفت و برگشت ثابت میماند. پس از نقطهای که توسط اسپرد تعیین میشود، سفرهای اضافی از کل کم میکنند نه اینکه به آن بیفزایند.
هر رقمی در بالا از یک پرسوجوی ذخیرهشده و نسخهبندیشده روی قیمتهای واقعی سهام میآید؛ SQL زیر هر پنل را برای بررسی آن باز کنید، یا سفر را در مقابل حرکت خالص در فهرست نامهای خود در ترمینال استراسمور (Strasmore) اندازهگیری کنید.