Strasmore Research
آموزش Matt Connorتوسط Matt Connor

راهنمای میزکار کمی خودمیزبان سهام A

میزکار کمی خودمیزبان سهام A غربالگری و بک‌تست را روی رایانه شما اجرا می‌کند؛ معماری آن و چهار بررسی ضروری پیش از راه‌اندازی را بشناسید.

یک میزکار کمیِ خودمیزبان برای بازار سهام A-share، یک صفحه وب است که بازار را غربال می‌کند، فهرستی از نمادها را زیر نظر می‌گیرد، بک‌تست اجرا می‌کند و پس از پایان معاملات، گزارش بررسی بازار می‌نویسد. این سامانه روی دستگاهی اجرا می‌شود که کنترل آن در اختیار شماست، نه روی پایانه کارگزاری. یکی از پروژه‌های دارای مجوز MIT، با نام tickflow-stock-panel، همه این قابلیت‌ها را پشت یک پورت واحد ارائه می‌کند و تا اوت 2026 حدود 2٬800 ستاره در GitHub به دست آورده بود. خواندن فهرست قابلیت‌ها بخش ساده ماجراست. این لایه زیرین است که تعیین می‌کند آیا همه این امکانات در فصل آینده نیز کار خواهند کرد یا نه.

اجزای یک میزکار کوانت خودمیزبان برای سهام A

معماری آن به‌اندازه‌ای ساده است که می‌توان ساختارش را به‌خاطر سپرد. بر اساس کد و مستندات موجود در commit اوت 2026، این معماری شامل موارد زیر است:

  • یک صفحه وب ساخته‌شده با React و TypeScript.
  • یک سرویس Python مبتنی بر FastAPI، همراه با زمان‌بندی که داده‌ها را در فواصل مشخص به‌روزرسانی می‌کند.
  • یک مخزن محلی: فایل‌های Parquet روی دیسک که با DuckDB پرس‌وجو و با Polars پردازش می‌شوند.
  • یک موتور backtesting به نام vectorbt که به این فایل‌ها متصل است.
  • یک SDK ارائه‌دهنده داده که همه قیمت‌های نمایش‌داده‌شده در پنل را دریافت می‌کند.

به نکته‌ای که در این ساختار وجود ندارد توجه کنید. هیچ‌یک از اجزای این پشته به بورس متصل نیست. پنل محاسبات را انجام می‌دهد و ارائه‌دهنده داده را تأمین می‌کند. «خودمیزبان» فقط محل اجرای کد را توصیف می‌کند و درباره منشأ اعداد چیزی نمی‌گوید. مالکیت داده‌های خام، وظیفه لایه زیرین یعنی دریاچه محلی داده‌های بازار سهام A است؛ همین ویژگی است که امکان جایگزینی تمام اجزای بالادستی را فراهم می‌کند.

پوشش سطح رایگان منبع داده

یک متغیر محیطی تعیین می‌کند پنل چه داده‌هایی را ببیند. اگر کلید فروشنده خالی بماند، پروژه در حالتی اجرا می‌شود که مستندات آن را None mode می‌نامند: میله‌های روزانه تاریخی از یک endpoint رایگان، در حالی که داده‌های جلسه جاری یک تا دو ساعت پس از پایان معاملات در دسترس قرار می‌گیرند. با وارد کردن کلید، دسترسی بر اساس tier پولی باز می‌شود. این سطح رایگان برای کارهای مبتنی بر داده‌های پایان روز قابل استفاده است، اما برای هر کاری درون‌روزی محدودیت قطعی دارد؛ آن هم بر مبنای شرایطی که فروشنده می‌تواند هنگام تمدید قرارداد دوباره اعلام کند.

نگهدارنده پروژه درباره این توافق صریح است:

این پروژه صرفاً برای یادگیری و پژوهش کمی است و هیچ توصیه سرمایه‌گذاری محسوب نمی‌شود. نتایج backtest نشان‌دهنده بازدهی آتی نیست.
این پروژه یک پروژه شخصی و متن‌باز است که بر پایه منبع داده TickFlow ساخته شده و پروژه رسمی TickFlow نیست.
README، shy3130/tickflow-stock-panel، مطالعه‌شده در 13 اوت 2026

به بیان انگلیسی، این پروژه برای مطالعه و پژوهش کمی است و «توصیه سرمایه‌گذاری محسوب نمی‌شود». همچنین نتایج backtest نشان‌دهنده بازدهی آتی نیست و پروژه «یک پروژه شخصی متن‌باز است، نه محصول رسمی TickFlow». این، نتیجه پایدار کل این حوزه است. Zero-ops کارهای عملیاتی را از دوش شما برمی‌دارد. اما وابستگی همچنان سر جای خود باقی می‌ماند: شما داده‌ها را از شرکتی اجاره می‌کنید که هرگز متعهد به پشتیبانی از این پنل نشده است. README همچنین استفاده از پروژه را به مطالعه و پژوهش محدود می‌کند، در حالی که فایل مجوز آن MIT است.

چرا باید SHA یک commit را به‌جای شماره نسخه ثبت کرد

SHA یک commit، اثرانگشت 40کاراکتری است که git به هر تغییر ذخیره‌شده اختصاص می‌دهد. این شناسه، یک وضعیت دقیق و معین از کد را به‌طور دائمی مشخص می‌کند.

در 13 اوت 2026، صفحه GitHub Releases این مخزن خالی بود. با این حال، مخزن 31 tag نسخه داشت؛ از v0.1.31 تا v0.1.88، با فاصله‌هایی در شماره‌گذاری و بدون هیچ یادداشت انتشار. جدیدترین tag به commitی با تاریخ 31 ژوئیه 2026 اشاره می‌کرد، در حالی که branch پیش‌فرض به کدی با تاریخ 6 اوت 2026 منتقل شده بود. tagی که از branch عقب مانده و هیچ یادداشتی ندارد، نمی‌تواند مشخص کند دقیقاً چه چیزی دریافت می‌کنید.

بنابراین SHA را ثبت کنید. سرشاخه branch پیش‌فرض در 6 اوت 2026 برابر با ecfddb451e97f6fc9a7e43ac33e4ef0e69933b33 بود. آن commit را checkout کنید و در کنار هر نتیجه‌ای که از backtestها می‌گیرید، ثبتش کنید. شش هفته بعد، عبارت «آخرین نسخه را اجرا کردم» هیچ اطلاعات مشخصی ارائه نمی‌دهد.

مراحل شروع مستندشده فقط دو خط است: فایل محیط نمونه را در .env کپی کنید، سپس docker compose up --build را اجرا کنید تا پنل روی پورت 3018 اجرا شود. این‌ها دستورالعمل‌های maintainer در همان commit هستند، نه مسیری که آزمایش شده باشد؛ فرایند build، imageها را دریافت می‌کند و به دسترسی شبکه نیاز دارد؛ دسترسی‌ای که این صفحه آن را آزمایش نکرده است. مسیر توسعه، یعنی ./dev.sh یا در Windows، .\dev.ps1، به Python 3.11 یا جدیدتر، Node 20 یا جدیدتر و package managerهای uv و pnpm نیاز دارد.

آنچه قابلیت راهبرد LLM ارسال می‌کند و مقصد آن

تولید راهبرد، تحلیل تک‌سهم و متن بررسی اختیاری هستند. AI_API_KEY را خالی بگذارید تا کل این بخش غیرفعال بماند. با تکمیل آن، AI_PROVIDER نیز تعیین می‌شود؛ این گزینه می‌تواند یک endpoint سازگار با OpenAI یا Ollama باشد. همچنین AI_BASE_URL، AI_MODEL و AI_DAILY_TOKEN_BUDGET تنظیم می‌شوند. پس از مصرف سهمیه توکن روزانه، ارسال درخواست‌ها متوقف خواهد شد.

جهت حرکت داده اهمیت دارد. prompt شما و هر زمینه‌ای که پنل به آن ضمیمه می‌کند، دستگاه شما را به مقصد endpoint تنظیم‌شده ترک می‌کند. اگر URL پایه را به یک API میزبانی‌شده هدایت کنید، درخواست به شرکت ارائه‌دهنده آن ارسال می‌شود. اگر آن را به runtime موجود در شبکه خودتان هدایت کنید، داده در همان شبکه باقی می‌ماند. میزبانی پنل روی زیرساخت شخصی، به‌معنای میزبانی مدل نیست. کلیدها در فایل متنی ساده .env در ریشه پروژه قرار دارند و از صفحه تنظیمات نیز قابل ویرایش‌اند؛ این صفحه با گذرواژه داشبوردی محافظت می‌شود که حداقل شش نویسه دارد. یادداشت ما درباره عوامل آلفای تولیدشده با LLM توضیح می‌دهد راهبردهای نوشته‌شده توسط ماشین معمولاً در کجا دچار ضعف می‌شوند.

آیا بک‌تستر هزینه‌های معامله را مدل‌سازی می‌کند؟

بک‌تستر، سازوکار T+1، کارمزدها، لغزش قیمت و حد ضرر را تبلیغ می‌کند. وجود این گزینه‌ها به معنای تنظیم‌شدن آن‌ها نیست. بک‌تستی که در قیمت پایانی ثبت‌شده معامله را انجام دهد و هزینه‌ها را صفر در نظر بگیرد، عملاً مدعی رایگان‌بودن معامله است. چنین ادعایی درست نیست. یک واحد پایه برابر با یک‌صدم درصد است. نمودار زیر میانگین فاصله میان بهترین قیمت خرید و بهترین قیمت فروش را، برحسب واحد پایه، در شش نماد پذیرفته‌شده در بازارهای آمریکا طی یک ساعت میانی معاملات در 17 ژوئن 2026 اندازه‌گیری می‌کند.

پرس‌وجوهزینه عبور از اسپرد: میانگین اسپرد اعلام‌شده، شش نماد بورسی آمریکا، ظهر ۱۷ ژوئن ۲۰۲۶
کد دقیق SQL پشت هر عدد
SELECT
    ticker                                                                       AS symbol,
    round(avg(toFloat64(ask_price) - toFloat64(bid_price))
          / avg((toFloat64(ask_price) + toFloat64(bid_price)) / 2) * 10000, 2)   AS spread_bps
FROM global_markets.cache_stocks_quotes
WHERE ticker IN ('SPY', 'AAPL', 'MSFT', 'NVDA', 'KO', 'F')
  AND sip_timestamp >= toDateTime('2026-06-17 15:00:00', 'UTC')
  AND sip_timestamp <  toDateTime('2026-06-17 16:00:00', 'UTC')
  AND bid_price > 0
  AND ask_price > bid_price
GROUP BY ticker
ORDER BY spread_bps
Run this yourself

کمترین فاصله در این نمودار مربوط به SPY بود که طی آن یک ساعت، به‌طور میانگین با فاصله 0.29 واحد پایه مظنه شد. بیشترین فاصله به F تعلق داشت و به 6.98 واحد پایه رسید. سرمایه‌گذار برای ورود یک‌بار و برای خروج یک‌بار از این فاصله عبور می‌کند. بنابراین هزینه رفت‌وبرگشت، پیش از محاسبه کارمزدها، تقریباً دو برابر رقم نمایش‌داده‌شده است.

زمان‌بندی به‌اندازه انتخاب نماد اهمیت دارد. نمودار بعدی یکی از همین نمادها را بررسی می‌کند و نشان می‌دهد قیمت آن در یک دقیقه چقدر جابه‌جا شده است. داده‌ها برای همان روز در بازه‌های نیم‌ساعته میانگین‌گیری شده‌اند.

پرس‌وجودامنه حرکت قیمت در یک دقیقه: KO، بر اساس ساعت نیویورک، ۱۷ ژوئن ۲۰۲۶
کد دقیق SQL پشت هر عدد
SELECT
    formatDateTime(
        toStartOfInterval(toTimeZone(window_start, 'America/New_York'), INTERVAL 30 MINUTE),
        '%H:%i')                                                                 AS et_time,
    round(avg((toFloat64(high) - toFloat64(low)) / toFloat64(close)) * 10000, 1)  AS range_bps
FROM global_markets.delayed_stocks_minute_aggs
WHERE ticker = 'KO'
  AND window_start >= toDateTime('2026-06-17 12:00:00', 'UTC')
  AND window_start <  toDateTime('2026-06-17 21:00:00', 'UTC')
  AND volume > 0
  AND close > 0
GROUP BY et_time
ORDER BY et_time
Run this yourself

نمودار از 08:00 آغاز می‌شود؛ یعنی پیش از شروع معاملات عادی. در این زمان، میانگین دامنه حرکت هر کندل یک‌دقیقه‌ای 0 واحد پایه بود. دقایقی که در آن‌ها معامله‌ای انجام شد، همگی در یک قیمت قرار داشتند. آخرین بازه، 16:30، پس از پایان معاملات قرار دارد و میانگین آن 4.2 واحد پایه بود. بک‌تست از هر یک از این دامنه‌ها یک نقطه را انتخاب می‌کند و آن را قیمت اجرای معامله در نظر می‌گیرد. به‌جای تمرکز بر نقاط ابتدا و انتها، منحنی را بررسی کنید. یک فرض واحد ممکن است در برخی ساعات به نفع استراتژی و در ساعات دیگر به زیان آن باشد. مقررات سهام A نیز محدودیت‌های خود را ایجاد می‌کند؛ زیرا T+1 مانع فروش سهامی می‌شود که امروز خریداری شده‌اند تا زمانی که جلسه معاملاتی بعدی آغاز شود. همچنین محدودیت‌های روزانه قیمت می‌تواند خروج مدل‌شده را به‌طور کامل ناممکن کند. راهنمای ما برای یک بک‌تست بازتولیدپذیر نشان می‌دهد یک تنظیم قابل‌دفاع چه داده‌هایی را ثبت می‌کند. در مطلب سوگیری نگاه به آینده نیز به روش دیگری می‌پردازیم که می‌تواند یک منحنی ظاهراً منظم را به نتیجه‌ای نادرست تبدیل کند.

تعدیل‌شده یا تعدیل‌نشده: مسئله منشأ داده

اقدامات شرکتی همان جایی هستند که یک screener بی‌سروصدا گمراه می‌کند. سهمی که با نسبت ده به یک split می‌شود، در روز اجرای split افت 90درصدی را نشان می‌دهد، بی‌آنکه کسی حتی یک سنت زیان کرده باشد. جدول زیر دوازده split فوروارد بزرگ در نمادهای پذیرفته‌شده در بازارهای آمریکا را بین 1 ژانویه تا 13 اوت 2026 فهرست می‌کند.

پرس‌وجودوازده مورد از بزرگ‌ترین تقسیم عادی سهام در نمادهای بورسی آمریکا، ۱ ژانویه تا ۱۳ اوت ۲۰۲۶
کد دقیق SQL پشت هر عدد
SELECT
    ticker                                                            AS symbol,
    formatDateTime(execution_date, '%b %e, %Y')                       AS effective_on,
    round(any(toFloat64(split_to)) / any(toFloat64(split_from)), 2)   AS shares_after_per_share
FROM global_markets.stocks_splits
WHERE execution_date >= toDate('2026-01-01')
  AND execution_date <= toDate('2026-08-13')
  AND split_from > 0
  AND split_to > split_from
  AND ticker NOT IN ('SPCX')
GROUP BY ticker, execution_date
ORDER BY shares_after_per_share DESC, execution_date DESC
LIMIT 12
Run this yourself

بزرگ‌ترین مورد، یک سهم را به 10000 سهم تبدیل می‌کند و از Feb 10, 2026 اجرایی می‌شود. چنین نسبت‌هایی همان نسبت رایج چهار به یک نیستند؛ فید اقدامات شرکتی، کل دامنه نسبت‌ها را در یک ستون منتقل می‌کند. کوچک‌ترین مورد از این دوازده مورد نیز یک سهم را به 20 سهم تبدیل می‌کند؛ آن‌قدر بزرگ که نمودار تعدیل‌نشده را شبیه سقوط نشان دهد. یک momentum screen که قیمت‌های خام را می‌خواند، همه این موارد را به‌عنوان crash علامت‌گذاری می‌کند. فیدهای چینی نیز همین مشکل را با واژگان خود دارند و هر سری را در سه گونه ارسال می‌کنند: تعدیل‌نشده، تعدیل‌شده رو به جلو و تعدیل‌شده معکوس. بررسی کنید پنل شما کدام‌یک را بارگذاری کرده است. تاریخچه قیمت تعدیل‌شده بر اساس split محاسبات را گام‌به‌گام توضیح می‌دهد.

پیش از میزبانی شخصی سامانه‌ای مانند این، چه مواردی را باید بررسی کنید

  • منشأ داده. مشخص کنید داده‌ها از کدام فروشنده دریافت می‌شوند، تحت چه مجوزی ارائه شده‌اند و آیا سطح رایگان خدمات، استفاده موردنظر شما را پوشش می‌دهد یا خیر.
  • مدیریت کلیدها. بررسی کنید کلیدهای API روی دیسک کجا ذخیره می‌شوند، چه کسانی می‌توانند به صفحه تنظیمات دسترسی داشته باشند و آیا دستگاه از خارج شبکه شخصی شما در معرض دسترسی قرار دارد یا نه.
  • مدل‌سازی هزینه. اطمینان حاصل کنید که backtester کارمزدها، لغزش قیمت و قواعد خود بازار را لحاظ می‌کند. همچنین بررسی کنید اگر این فیلدها را بدون تغییر رها کنید، چه مقادیری در آن‌ها ثبت می‌شود.
  • مسیر به‌روزرسانی. commit دقیق نسخه‌ای را که مستقر کرده‌اید، در کنار نتایج بنویسید تا چند ماه بعد نیز امکان بازتولید آن وجود داشته باشد.

پرسش‌های متداول

آیا اجرای یک کارگاه کمی A-share روی سرور شخصی رایگان است؟

کد پروژه با مجوز MIT منتشر شده و رایگان است. داده‌ها موضوع جداگانه‌ای هستند. اگر کلید فروشنده خالی بماند، پروژه به‌طور پیش‌فرض از میله‌های روزانه تاریخی رایگان استفاده می‌کند و داده‌های جلسه جاری را یک تا دو ساعت پس از پایان معاملات دریافت می‌کند. دسترسی سریع‌تر یا عمیق‌تر از طریق سطوح پولی فروشنده ارائه می‌شود.

منظور از میزبانی شخصی در اینجا دقیقاً چیست؟

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

آیا قابلیت LLM داده‌های من را برای شخص ثالث ارسال می‌کند؟

اگر این قابلیت فعال باشد، بله؛ داده‌ها به هر endpoint سازگار با OpenAI که پیکربندی کرده‌اید ارسال می‌شوند. این قابلیت به‌صورت پیش‌فرض غیرفعال است. اگر کلید AI خالی باشد، هیچ داده‌ای از دستگاه خارج نمی‌شود.

چرا باید به‌جای برچسب نسخه، یک commit SHA را تثبیت کرد؟

تا 13 اوت 2026، این مخزن هیچ نسخه منتشرشده یا یادداشت انتشار نداشت و جدیدترین tag آن به کدی قدیمی‌تر از شاخه پیش‌فرض اشاره می‌کرد. در چنین شرایطی، «Latest» به محتوای شاخه در روزی اشاره دارد که آن را clone کرده‌اید؛ اما commit SHA دقیق و مشخص است. همین رویکرد در مطالب معاملات کمی متن‌باز نیز دنبال می‌شود: چیزی را که اجرا کرده‌اید، تثبیت کنید.

یادداشت‌های راستی‌آزمایی

تمام جزئیات معماری و پیکربندی بالا در 13 اوت 2026 از مخزن عمومی و در commit ecfddb451e97f6fc9a7e43ac33e4ef0e69933b33، یعنی سرشاخه شاخه پیش‌فرض، استخراج شده‌اند؛ این commit در 6 اوت 2026 ثبت شده بود. صفحه Releases خالی بود. فهرست tagها شامل 31 tag نسخه، از v0.1.31 تا v0.1.88، بود و جدیدترین tag به commitی با تاریخ 31 ژوئیه 2026 اشاره می‌کرد. نقل‌قول‌های ارائه‌شده عیناً از نوشته‌های نگهدارنده پروژه و از README کپی شده‌اند، نه اینکه بازنویسی شده باشند. دستور راه‌اندازی کانتینر نیز از همان README نقل شده و در اینجا اجرا نشده است.

پنل‌های بازار مربوط به نمادهای پذیرفته‌شده در آمریکا هستند و به تاریخ‌های مشخصی در گذشته تثبیت شده‌اند تا ارقام ثابت بمانند. هدف از ارائه آن‌ها نمایش دو بررسی قابل‌تعمیم به هر بازار است: هزینه اجرا و تعدیل ناشی از اقدامات شرکتی؛ این پنل‌ها برای توصیف بازار چین ارائه نشده‌اند.


هر پنل در اینجا همراه با SQL تولیدکننده آن ارائه می‌شود و این کد در بخش زیر پنل قابل باز کردن است. پیش از آنکه یکی از نمادها را به screener متصل کنید، برای اجرای همین بررسی spread روی فهرست نمادهای خود، درخواستتان را به زبان ساده در پایانه Strasmore مطرح کنید.

#open-source#backtesting#screening#a-shares#self-hosted