Strasmore Research
تعلیمی مواد Matt Connorاز Matt Connor · اپ ڈیٹ شدہ 2026-08-14

Self-Hosted A-Share Quant Workbench کی وضاحت

اپنی machine پر چلنے والا A-share quant workbench screening، watchlists اور backtesting کرتا ہے۔ اس کے اصل تقاضے اور پہلے جانچنے والی چار چیزیں جانیں۔

Self-hosted A-share quant workbench ایک ایسا web page ہے جو market کو screen کرتا ہے، منتخب securities کی فہرست پر نظر رکھتا ہے، backtests چلاتا ہے اور market close کے بعد review تیار کرتا ہے۔ یہ سب کسی broker کے terminal کے بجائے آپ کے زیرِ کنٹرول machine پر ہوتا ہے۔ MIT-licensed project tickflow-stock-panel نے یہ تمام سہولیات ایک ہی port کے پیچھے یکجا کر دی ہیں، اور اگست 2026 تک GitHub پر اسے تقریباً 2,800 stars مل چکے تھے۔ Feature list پڑھنا آسان حصہ ہے۔ اصل فیصلہ کن layer وہ ہے جو اس کے نیچے کام کرتی ہے اور طے کرتی ہے کہ اگلی سہ ماہی میں ان میں سے کچھ بھی بدستور کام کرے گا یا نہیں۔

ایک self-hosted A-share quant workbench کن اجزا سے بنتا ہے

اس architecture کو ذہن میں رکھنا آسان ہے۔ اگست 2026 کے commit میں موجود code اور docs کا جائزہ لینے پر اس کے اجزا یہ ہیں:

  • React اور TypeScript سے بنا ہوا web page۔
  • Python service، یعنی FastAPI، جس میں مقررہ وقفے سے data refresh کرنے والا scheduler شامل ہے۔
  • ایک local store: disk پر Parquet files، جنہیں DuckDB سے query کیا جاتا ہے اور Polars سے compute کیا جاتا ہے۔
  • ایک backtesting engine، vectorbt، جو انہی files سے منسلک ہے۔
  • ایک vendor SDK، جو panel میں دکھائی جانے والی ہر قیمت fetch کرتا ہے۔

غور کریں کہ اس میں کیا شامل نہیں ہے۔ اس stack کی کوئی چیز exchange سے connect نہیں ہوتی۔ panel computation کرتا ہے؛ vendor data فراہم کرتا ہے۔ "Self-hosted" صرف یہ بتاتا ہے کہ code کہاں run ہوتا ہے۔ اس سے یہ معلوم نہیں ہوتا کہ numbers کہاں سے آتے ہیں۔ Raw bars کی ملکیت نیچے موجود layer کی ذمہ داری ہے، یعنی ایک local A-share market data lake۔ یہی layer اوپر موجود پورے system کو replaceable بناتی ہے۔

Data source کا free tier کیا فراہم کرتا ہے

ایک environment variable طے کرتا ہے کہ panel کو کیا نظر آ سکتا ہے۔ Vendor key خالی چھوڑنے پر project اس mode میں چلتا ہے جسے اس کی دستاویزات None mode کہتی ہیں: ایک free endpoint سے historical daily bars ملتے ہیں، جبکہ موجودہ session کا data market close کے ایک سے دو گھنٹے بعد دستیاب ہوتا ہے۔ Key درج کرنے پر paid tier کے مطابق access کھل جاتا ہے۔ End-of-day کام کے لیے یہ قابلِ استعمال free tier ہے، لیکن intraday استعمال کے لیے واضح حد قائم کرتا ہے۔ Vendor ہر renewal پر ان شرائط کو دوبارہ بیان کر سکتا ہے۔

Maintainer اس arrangement کے بارے میں براہِ راست لکھتا ہے:

یہ project صرف تعلیم اور quantitative research کے لیے ہے، اور کسی قسم کا investment advice نہیں ہے۔ Backtest کے نتائج مستقبل کے returns کی نمائندگی نہیں کرتے۔
یہ project ذاتی open-source project ہے، جو TickFlow data source پر مبنی ہے؛ یہ TickFlow کا official project نہیں ہے۔
README، shy3130/tickflow-stock-panel، 13 اگست 2026 کو پڑھا گیا

انگریزی میں مفہوم یہ ہے کہ project مطالعے اور quantitative research کے لیے ہے، یہ “investment advice نہیں ہے”، backtest کے نتائج مستقبل کے returns کی نمائندگی نہیں کرتے، اور یہ “ذاتی open-source project ہے، نہ کہ TickFlow کی official product”۔ اس پوری صنف کا مستقل سبق یہی ہے۔ Zero-ops آپ کے ذمے سے operations کا کام ہٹا دیتا ہے۔ لیکن dependency وہیں رہتی ہے: آپ ایک ایسی کمپنی سے data کرائے پر لے رہے ہیں جس نے اس panel کو support فراہم کرنے پر کبھی اتفاق نہیں کیا۔ README استعمال کو مطالعے اور research تک محدود کرتا ہے، جبکہ licence file MIT ہے۔

version number کے بجائے commit SHA کیوں pin کرنا چاہیے

Commit SHA وہ 40-character fingerprint ہے جو git ہر محفوظ کی گئی تبدیلی کو تفویض کرتا ہے۔ یہ code کی ایک مخصوص حالت کی مستقل شناخت کرتا ہے۔

13 August 2026 کو repository کے GitHub Releases page پر کچھ موجود نہیں تھا۔ البتہ اس میں version tags موجود تھے: v0.1.31 سے v0.1.88 تک، درمیان میں numbering کے gaps کے ساتھ، اور کسی tag کے ساتھ notes منسلک نہیں تھے۔ تازہ ترین tag ایسے commit کی طرف اشارہ کر رہا تھا جس کی تاریخ 31 July 2026 تھی، جبکہ default branch 6 August 2026 کی code changes تک آگے بڑھ چکی تھی۔ ایسا tag جو branch سے پیچھے ہو اور جس کے ساتھ notes بھی نہ ہوں، یہ نہیں بتا سکتا کہ آپ کو کیا مل رہا ہے۔

اس لیے SHA لکھ کر محفوظ کر لیں۔ 6 August 2026 کو default branch کا head ecfddb451e97f6fc9a7e43ac33e4ef0e69933b33 تھا۔ اس commit کو check out کریں اور backtests سے اخذ کیے گئے ہر نتیجے کے ساتھ اسے درج کریں۔ چھ ہفتے بعد، "میں نے latest چلایا تھا" کا کوئی واضح مطلب نہیں رہتا۔

دستاویزی آغاز دو سطروں پر مشتمل ہے: مثال والی environment file کو .env میں copy کریں، پھر docker compose up --build چلائیں، جو panel کو port 3018 پر serve کرتا ہے۔ یہ اس commit پر maintainer کی ہدایات ہیں، tested path نہیں؛ build images pull کرتا ہے اور اسے network access درکار ہے، جسے اس page نے استعمال نہیں کیا۔ Development route (./dev.sh، یا Windows پر .\dev.ps1) کے لیے Python 3.11 یا اس کے بعد کا ورژن، Node 20 یا اس کے بعد کا ورژن، اور uv اور pnpm package managers درکار ہیں۔

LLM strategy feature کیا بھیجتا ہے، اور کہاں

Strategy generation، single-stock commentary اور review write-up اختیاری ہیں۔ AI_API_KEY کو خالی چھوڑنے سے پورا surface غیر فعال رہتا ہے۔ اسے پُر کرنے سے AI_PROVIDER بھی set ہو جاتا ہے، جو OpenAI-compatible endpoint یا Ollama ہو سکتا ہے۔ اس کے ساتھ AI_BASE_URL، AI_MODEL اور AI_DAILY_TOKEN_BUDGET بھی set ہوتے ہیں۔ یہ settings دن بھر کے token allowance کے استعمال کے بعد مزید calls روک دیتی ہیں۔

درخواست کا رخ اہم ہے۔ آپ کا prompt اور panel کے ساتھ منسلک کیا گیا context آپ کی machine سے configured endpoint کو بھیجا جاتا ہے۔ Base URL کو hosted API پر set کریں تو request اسی کمپنی کے پاس جاتی ہے۔ اسے اپنے network پر موجود runtime کی طرف point کریں تو data آپ کے ماحول سے باہر نہیں جاتا۔ Panel کو self-host کرنے کا مطلب model کو self-host کرنا نہیں ہے۔ Keys project root میں موجود plaintext .env میں محفوظ ہوتی ہیں۔ انہیں settings page سے بھی edit کیا جا سکتا ہے، جو کم از کم چھ حروف کے dashboard password سے محفوظ ہے۔ ہماری LLM سے تیار کردہ alpha factors پر تحریر میں بتایا گیا ہے کہ machine-written strategies عموماً کہاں ناکام ہوتی ہیں۔

کیا backtester میں trading costs شامل ہیں؟

backtester میں T+1 handling، commissions، slippage اور stop-losses کی سہولت کا دعویٰ کیا گیا ہے۔ لیکن ان switches کا موجود ہونا اور ان کا واقعی set ہونا ایک بات نہیں۔ اگر backtest printed close پر fill ہو اور costs صفر رکھی جائیں، تو اس کا مطلب ہے کہ trading مفت ہے۔ ایسا نہیں ہے۔ basis point، ایک فیصد کا سوواں حصہ ہوتا ہے۔ ذیل کا panel 17 جون 2026 کو دوپہر کے ایک گھنٹے کے دوران چھ US listings میں best bid اور best offer کے درمیان اوسط فرق basis points میں دکھاتا ہے۔

استفسار کریںSpread cross کرنے کی لاگت: اوسط quoted spread، چھ امریکی listings، 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

panel میں سب سے کم spread رکھنے والی listing SPY تھی، جس کا اس ایک گھنٹے کے دوران اوسط quote 0.29 bps رہا۔ سب سے زیادہ spread والی listing F تھی، جس کا quote 6.98 bps رہا۔ اس فرق کو دو مرتبہ عبور کرنا پڑتا ہے: ایک بار پوزیشن لینے کے لیے اور ایک بار پوزیشن ختم کرنے کے لیے۔ اس طرح commissions سے پہلے round trip کی لاگت دکھائے گئے عدد سے تقریباً دو گنا ہو جاتی ہے۔

Timing بھی naming جتنی اہم ہے۔ اگلا panel انہی listings میں سے ایک کو لے کر پیمائش کرتا ہے کہ ایک ہی منٹ کے اندر اس کی قیمت نے کتنا فاصلہ طے کیا۔ یہ پیمائش اسی دن کے دوران half-hour buckets میں اوسط کی گئی ہے۔

استفسار کریںایک منٹ میں قیمت کا سفر: KO، New York کے وقت کے مطابق، 17 جون 2026
ہر عدد کے پیچھے موجود درست 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

panel 08:00 پر کھلتا ہے، یعنی regular session سے پہلے، جہاں average minute bar میں قیمت کی movement 0 bps رہی۔ جن منٹوں میں trading ہوئی، ان میں قیمت ایک ہی سطح پر رہی۔ آخری bucket 16:30 ہے، جو close کے بعد واقع ہوتا ہے، اور اس میں اوسط movement 4.2 bps رہی۔ backtest ان ranges میں سے ہر ایک سے ایک نقطہ منتخب کرتا ہے اور اسے fill قرار دیتا ہے۔ endpoints کے بجائے پوری curve کو دیکھیں: یہی assumption بعض اوقات کچھ hours میں generous اور دوسرے hours میں punitive ثابت ہوتی ہے۔ A-share rules اپنی اضافی پابندیاں عائد کرتے ہیں، کیونکہ T+1 کے تحت آج خریدے گئے shares اگلے session تک فروخت نہیں کیے جا سکتے، جبکہ daily price limits modeled exit کو مکمل طور پر ناممکن بنا سکتی ہیں۔ ہمارا قابلِ تکرار backtest walkthrough دکھاتا ہے کہ ایک قابلِ دفاع setup میں کیا ریکارڈ ہونا چاہیے، جبکہ look-ahead bias اس دوسری وجہ کی وضاحت کرتا ہے جس سے بظاہر صاف curve غلط بن سکتی ہے۔

Adjusted یا unadjusted: ڈیٹا کے ماخذ کا سوال

Corporate actions وہ مرحلہ ہیں جہاں screener خاموشی سے گمراہ کر سکتا ہے۔ جو stock دس-for-one split کرتا ہے، اس دن 90% کمی ظاہر کر سکتا ہے، حالانکہ کسی سرمایہ کار کا ایک cent بھی ضائع نہیں ہوا ہوتا۔ ذیل کا panel، 1 January سے 13 August 2026 کے درمیان US listings میں ہونے والے بارہ سب سے بڑے forward splits دکھاتا ہے۔

استفسار کریںUS listings پر بارہ بڑی forward stock splits، 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

سب سے بڑا split ایک share کو 10000 shares میں تبدیل کرتا ہے، جس کا اطلاق Feb 10, 2026 سے ہوتا ہے۔ اس حجم کے ratios عام four-for-one split نہیں ہوتے؛ corporate-action feed ایک ہی column میں پوری range فراہم کرتا ہے۔ ان بارہ میں سب سے چھوٹا split بھی ایک share کو 20 shares میں تبدیل کرتا ہے، جو unadjusted chart کو collapse جیسا دکھانے کے لیے کافی ہے۔ Raw prices پڑھنے والا momentum screen ان سب کو crash کے طور پر flag کرتا ہے۔ Chinese feeds میں بھی یہی مسئلہ اپنی اصطلاحات کے ساتھ موجود ہے، جہاں ہر series کی تین variants فراہم کی جاتی ہیں: unadjusted، forward-adjusted اور back-adjusted۔ معلوم کریں کہ آپ کے panel نے کون سی variant load کی ہے۔ Split-adjusted price history میں اس حساب کی وضاحت کی گئی ہے۔

اس نوع کی کوئی چیز خود host کرنے سے پہلے کن باتوں کی جانچ کریں

  • Data provenance۔ ڈیٹا کس vendor سے آ رہا ہے، اس کا licence کیا ہے، اور کیا free tier آپ کے مطلوبہ استعمال کا احاطہ کرتا ہے۔
  • Key handling۔ API keys ڈسک پر کہاں محفوظ ہوتی ہیں، settings page تک کس کو رسائی حاصل ہے، اور کیا مشین آپ کے اپنے network سے باہر بھی exposed ہے۔
  • Cost modelling۔ کیا backtester commissions، slippage اور market کے اپنے rules کو شامل کرتا ہے، اور جب آپ ان settings کو تبدیل نہیں کرتے تو ان fields میں کیا values درج ہوتی ہیں۔
  • Update path۔ آپ نے عین کون سا commit deploy کیا تھا، اسے results کے ساتھ درج کیا گیا ہو تاکہ کئی ماہ بعد بھی اسے دوبارہ reproduce کیا جا سکے۔

عمومی سوالات

کیا self-hosted A-share quant workbench چلانا مفت ہے؟

Code MIT-licensed اور مفت ہے۔ Data الگ معاملہ ہے: اگر vendor key خالی چھوڑی جائے تو یہ project مفت historical daily bars استعمال کرتا ہے، جبکہ موجودہ session کا data market close کے ایک سے دو گھنٹے بعد دستیاب ہوتا ہے۔ اس سے زیادہ تیز یا گہرا data vendor کے paid tiers کے ذریعے ملتا ہے۔

یہاں self-hosted سے مراد کیا ہے؟

Web page، scheduler، stored files اور backtester سب آپ کی اپنی machine یا server پر چلتے ہیں، اور کسی دوسرے platform پر account درکار نہیں ہوتا۔ اس کا مطلب یہ نہیں کہ data آپ کی ملکیت ہے۔ Optional AI features remote ہی رہتی ہیں، جب تک آپ انہیں اپنے network پر موجود model سے connect نہ کریں۔

کیا LLM feature میرا data کسی third party کو بھیجتا ہے؟

جب یہ feature آن ہو تو ہاں، اس OpenAI-compatible endpoint کو جسے آپ configure کرتے ہیں۔ یہ feature default طور پر disabled ہوتا ہے۔ AI key خالی ہو تو machine سے کچھ بھی باہر نہیں جاتا۔

Version tag کے بجائے commit SHA کو pin کیوں کیا جائے؟

13 August 2026 تک اس repository میں کوئی published release یا release notes موجود نہیں تھے، اور اس کا newest tag default branch کے مقابلے میں پرانے code کی طرف اشارہ کر رہا تھا۔ ایسی صورت میں "Latest" سے مراد وہ code ہوتا ہے جو آپ کے clone کرنے کے دن branch میں موجود تھا، جبکہ commit SHA عین اسی code کی نشان دہی کرتا ہے۔ یہی اصول عمومی طور پر open-source quant trading مواد پر بھی لاگو ہوتا ہے: جو code چلایا ہو، اسے pin کریں۔

تصدیقی نوٹس

اوپر بیان کردہ ہر architecture اور configuration detail، 13 August 2026 کو public repository سے، commit ecfddb451e97f6fc9a7e43ac33e4ef0e69933b33 پر، پڑھی گئی تھی۔ یہ commit default branch کی head تھی اور 6 August 2026 کی تاریخ رکھتی تھی۔ Releases page پر کچھ درج نہیں تھا؛ tag list میں v0.1.31 سے v0.1.88 تک 31 version tags موجود تھے، جبکہ newest tag 31 July 2026 کے commit کی طرف اشارہ کر رہا تھا۔ اقتباس میں شامل lines maintainer کی اپنی تحریر ہیں۔ انہیں paraphrase کرنے کے بجائے README سے نقل کیا گیا ہے۔ Container start command بھی اسی README سے نقل کیا گیا تھا اور یہاں execute نہیں کیا گیا۔

Market panels US listings پر مبنی ہیں اور انہیں مخصوص گزرے ہوئے dates پر pin کیا گیا ہے تاکہ figures تبدیل نہ ہوں۔ ان کا مقصد کسی بھی market پر لاگو ہونے والے دو checks، execution cost اور corporate-action adjustment، کو دکھانا ہے؛ یہ Chinese market کی وضاحت کے لیے نہیں ہیں۔


یہاں موجود ہر panel اس کے تیار کرنے والے SQL کے ساتھ آتا ہے، جسے نیچے expand کیا جا سکتا ہے۔ اپنے screener میں کسی نام کو شامل کرنے سے پہلے اپنی فہرست پر یہی spread check چلانے کے لیے Strasmore terminal پر سادہ English میں درخواست کریں۔

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