Open Source Quant Trading पुस्तकातून शिका
Open source quant trading पुस्तकातील संपूर्ण अभ्यासक्रम समजून घ्या: प्रत्येक टप्प्यात काय शिकवले जाते, नवशिके कुठे थांबतात आणि US stocks साठी काय लागू पडते.
ओपन-सोर्स quant trading पुस्तक म्हणजे मोफत सार्वजनिक अभ्यासक्रम आहे. कच्च्या डेटापासून live order पर्यंतचा संपूर्ण मार्ग त्यात नवशिक्याला ज्या क्रमाने समोर येतो, त्याच क्रमाने लिहिलेला असतो. xingwudao यांनी GitHub वर प्रकाशित केलेले XQuant: Everyone Can Be a Quantitative Trader चे हस्तलिखित ऑगस्ट 2026 पर्यंत 686 stars असलेले एक स्पष्ट उदाहरण आहे. त्याची नऊ प्रकरणे जवळजवळ प्रत्येक quant अभ्यासक्रमातील प्रवासक्रम मांडतात. हे पृष्ठ त्या क्रमाचा टप्प्याटप्प्याने मागोवा घेते, प्रत्येक टप्प्यावर उद्भवणारी विशिष्ट चूक स्पष्ट करते आणि Chinese A shares पासून US equities पर्यंतच्या प्रवासात कोणते भाग लागू राहतात, हे दर्शवते.
मुक्त-स्रोत quant trading पुस्तकात काय असते?
कोणत्याही नवशिक्या अभ्यासक्रमावरील ब्रँडिंग काढून टाकल्यास, या पाच पायऱ्या याच क्रमाने उरतात: डेटा मिळवणे आणि स्वच्छ करणे, त्यातून signal तयार करणे, त्या signal ची ऐतिहासिक डेटाविरुद्ध चाचणी घेणे, किती मोठी गुंतवणूक करायची हे ठरवणे, आणि मग order पाठवून खर्च भरणे. 14 जुलै 2026 रोजीच्या 016b66e commit पर्यंतची XQuant विषयसूची याच बाबी नऊ अध्यायांत मांडते.
- तयारीनंतर पहिला अध्याय: एक संपूर्ण strategy सुरुवातीपासून शेवटपर्यंत चालवा.
- दुसरा अध्याय, काय खरेदी करायचे: तीन ETF पासून सुरुवात करा.
- तिसरा अध्याय, किती खरेदी करायचे: तीन allocation पद्धतींची एकमेकांशी तुलना करा.
- चौथा अध्याय, कधी trade करायचे: rebalancing, stop loss, take profit.
- पाचवा अध्याय, strategy चांगली आहे की नाही हे कसे ठरवायचे: चार दृष्टिकोन.
- सहावा अध्याय, लवकर आनंद साजरा करू नका: overfitting टाळणे.
- सातवा अध्याय, आदर्शापासून वास्तवापर्यंत: trades ची अंमलबजावणी.
- आठवा अध्याय, launch नंतरचे जीवन: monitoring, diagnosis, iteration.
- नववा अध्याय, नव्या संधी शोधणे: factor research ची ओळख.
या क्रमाकडे लक्ष देणे आवश्यक आहे. Sizing तिसऱ्या अध्यायात येते, म्हणजे दोन्ही backtest अध्यायांपूर्वी; factor research शेवटी येते. स्वतः शिकणारे मार्ग साधारणपणे याच्या उलट असतात: आधी factor ची कल्पना, नंतर backtest आणि sizing rule कधीच नाही. सोबतच्या exercise repository मध्ये (त्याच तारखेला 333 stars) पूर्ण code ऐवजी लिखित task specifications यांना केंद्रस्थानी ठेवले आहे आणि वाचकाने AI assistant ला त्यांची अंमलबजावणी करण्यास सांगायचे आहे. तुम्ही स्वतः लिहिलेले नसलेले code वाचता येणे हेच खालील प्रत्येक बाब ठरवणारे कौशल्य आहे, कारण पुढील प्रत्येक अपयशामागे अंमलबजावणीतील एक तपशील लपलेला असतो.
टप्पा एक: प्रथम डेटा मिळवा, नंतर विश्व निश्चित करा
डेटा कार्यातील दिसणारा भाग म्हणजे स्वच्छता: चुकीचे prints, गहाळ सत्रे, split आणि dividend adjustments. कोणत्या names चा अभ्यास करायचा हे ठरवणे हा अदृश्य भाग आहे. रणनीतीचा एकही कोड लिहिण्यापूर्वीच इथे survivorship bias येतो. जूनमधील एका आठवड्यात trade झालेला प्रत्येक US ticker, वर्षागणिक घ्या आणि 2026 मधील त्याच आठवड्यात त्यापैकी किती अजूनही trade होत होते, हे विचारा.
प्रत्येक आकड्यामागील अचूक SQL
WITH june_week AS (
SELECT toYear(toTimeZone(window_start, 'America/New_York')) AS year,
ticker
FROM global_markets.delayed_stocks_minute_aggs
WHERE toMonth(toTimeZone(window_start, 'America/New_York')) = 6
AND toDayOfMonth(toTimeZone(window_start, 'America/New_York')) BETWEEN 10 AND 16
AND toYear(toTimeZone(window_start, 'America/New_York')) BETWEEN 2016 AND 2026
AND volume > 0
GROUP BY year, ticker
),
survivors AS (
SELECT ticker FROM june_week WHERE year = 2026
)
SELECT year,
uniqExact(ticker) AS tickers_traded,
uniqExactIf(ticker, ticker IN (SELECT ticker FROM survivors)) AS still_trading_2026,
round(100 * uniqExactIf(ticker, ticker IN (SELECT ticker FROM survivors))
/ uniqExact(ticker), 1) AS still_trading_pct
FROM june_week
GROUP BY year
ORDER BY year2016 मधील त्या आठवड्यात trade झालेल्या 8224 tickers पैकी 50% हे 2026 मधील त्याच आठवड्यात अजूनही trade होत होते. उर्वरित tickers विकत घेतले गेले, merger झाले, त्यांची नावे बदलली किंवा ते delist झाले. आजच्या roster वर आधारित backtest मध्ये टिकून राहिलेली नावेच तपासली जातात. तसेच, नंतरच्या माहितीनुसार निवडलेल्या कंपन्या धारण करण्यासाठी रणनीतीला मोबदला मिळतो. Beginner feed तुम्हाला ही survivor list कोणतीही चेतावणी न देता देईल: free stock market data API मार्गदर्शिकेत या feeds मध्ये काय उपलब्ध असते आणि काय उपलब्ध नसते, हे स्पष्ट केले आहे.
दुसरा टप्पा: डेटाचे सिग्नलमध्ये रूपांतर
सिग्नल हा असा नियम असतो, जो एखाद्या विशिष्ट वेळी एखाद्या स्टॉकला गुण देतो. फॅक्टर हा असा सिग्नल असतो, जो एकाच वेळी अनेक स्टॉक्समध्ये लागू होतो, असे तुम्हाला वाटते. मोमेंटम, व्हॅल्यू आणि कमी अस्थिरता ही त्याची पाठ्यपुस्तकातील उदाहरणे आहेत. या टप्प्यातील अपयश म्हणजे एखादा नियम कार्य करेपर्यंत त्याची चाचणी करत राहणे. एका निर्देशांकाच्या एका दशकातील चलत-मध्यम क्रॉसओव्हरच्या वीस प्रकारांची चाचणी घेतल्यास नेहमीच एक विजेता मिळेल. तो विजेता प्रत्यक्ष संकेतांपेक्षा अनियमित चढ-उतारांशी सर्वाधिक जुळलेला असेल. यापासून बचावाचे उपाय आकर्षक नाहीत: मोजमाप करण्यापूर्वी नियम निश्चित करा, इतिहासातील असा काही भाग बाजूला ठेवा ज्याकडे तुम्ही कधीही पाहणार नाही, तपासलेल्या प्रत्येक प्रकाराची नोंद ठेवा आणि समायोजित करता येणाऱ्या संख्यांची संख्या कमी ठेवा. XQuant मध्ये फॅक्टर संशोधनापूर्वी याच विषयावर संपूर्ण प्रकरण दिले आहे. हा योग्य क्रम आहे.
तिसरा टप्पा: बॅकटेस्ट, जिथे बहुतेक नवशिके थांबतात
हा तो टप्पा आहे जिथे स्वयं-अध्ययनातून केलेले बहुतेक प्रकल्प संपतात. ते शांतपणे संपतात आणि इक्विटी वक्र मात्र अतिशय आकर्षक दिसतो. वर नमूद केलेला survivorship हा दोन त्रुटींपैकी पहिला आहे. Look-ahead bias ही दुसरी त्रुटी आहे: ऑर्डर देण्याची वेळ येईपर्यंत उपलब्ध नसलेला आकडा रणनीती वापरते. आजच्या closing price वरून नियम ठरवून त्याच closing price वर ऑर्डर भरली जाणे, हा याचा सर्वात सामान्य प्रकार आहे. या गृहितकामुळे टाळले जाणारे अंतर मोजा.
प्रत्येक आकड्यामागील अचूक SQL
WITH sessions AS (
SELECT ticker,
toDate(toTimeZone(window_start, 'America/New_York')) AS session,
argMin(open, window_start) AS session_open,
argMax(close, window_start) AS session_close
FROM global_markets.delayed_stocks_minute_aggs
WHERE ticker IN ('SPY', 'NVDA')
AND toDate(toTimeZone(window_start, 'America/New_York')) >= toDate('2024-08-01')
AND toDate(toTimeZone(window_start, 'America/New_York')) <= toDate('2026-07-31')
AND (toHour(toTimeZone(window_start, 'America/New_York')) * 60
+ toMinute(toTimeZone(window_start, 'America/New_York'))) BETWEEN 570 AND 959
GROUP BY ticker, session
),
gaps AS (
SELECT ticker,
session,
toFloat64(session_open) AS open_px,
toFloat64(lagInFrame(session_close) OVER (PARTITION BY ticker ORDER BY session)) AS prev_close
FROM sessions
)
SELECT formatDateTime(toStartOfMonth(session), '%Y-%m') AS month,
formatDateTimeInJodaSyntax(toStartOfMonth(session), 'MMMM yyyy') AS month_label,
round(avgIf(abs(open_px / prev_close - 1) * 10000, ticker = 'SPY'), 1) AS spy_gap_bps,
round(avgIf(abs(open_px / prev_close - 1) * 10000, ticker = 'NVDA'), 1) AS nvda_gap_bps
FROM gaps
WHERE prev_close > 0
GROUP BY month, month_label
HAVING countIf(ticker = 'SPY') > 0 AND countIf(ticker = 'NVDA') > 0
ORDER BY monthJuly 2026 मध्ये, एका closing price आणि पुढील opening print यांमधील सरासरी अंतर SPY साठी 40.8 basis points आणि NVDA साठी 107.4 basis points होते. एक basis point म्हणजे percentage point च्या एकशेवा भाग. August 2024 पासून सुरू होणाऱ्या पॅनेलमधील सर्व 24 महिने शून्याच्या वर आहेत. Close वर निर्णय घेऊन त्याच close वर ऑर्डर भरली जाणारा बॅकटेस्ट प्रत्येक व्यवहारात हे अंतर विनामूल्य मिळवतो; प्रत्यक्ष व्यवहारातील कोणतीही ऑर्डर असे करत नाही. बॅकटेस्टमधील Look-ahead bias ही यंत्रणा सविस्तर स्पष्ट करते, तर समभागांच्या किमती रात्रीच्या वेळी का gap होतात हा gap स्वतः का निर्माण होतो ते स्पष्ट करते.
चौथा टप्पा: किती खरेदी करायची ते ठरवा
इथली उणीव म्हणजे नियमांचा अभाव. स्वतः शिकलेले बहुतेक ट्रेडर्स पोझिशन-सायझिंगचा नियम कधीच लिहून ठेवत नाहीत. त्यामुळे त्यांच्याकडे तो नियम अनवधानाने तयार होतो. सहसा प्रत्येक नावात समान रक्कम गुंतवली जाते किंवा उपलब्ध असलेली रोकड वापरली जाते. समान रक्कम म्हणजे समान जोखीम नव्हे.
प्रत्येक आकड्यामागील अचूक SQL
WITH daily AS (
SELECT ticker,
toDate(toTimeZone(window_start, 'America/New_York')) AS session,
argMax(close, window_start) AS session_close
FROM global_markets.delayed_stocks_minute_aggs
WHERE ticker IN ('SPY', 'KO', 'JNJ', 'MSFT', 'AAPL', 'NVDA', 'TSLA', 'COIN')
AND toDate(toTimeZone(window_start, 'America/New_York')) >= toDate('2025-08-01')
AND toDate(toTimeZone(window_start, 'America/New_York')) <= toDate('2026-07-31')
AND (toHour(toTimeZone(window_start, 'America/New_York')) * 60
+ toMinute(toTimeZone(window_start, 'America/New_York'))) BETWEEN 570 AND 959
GROUP BY ticker, session
),
rets AS (
SELECT ticker,
toFloat64(session_close) AS close_px,
toFloat64(lagInFrame(session_close) OVER (PARTITION BY ticker ORDER BY session)) AS prev_close
FROM daily
)
SELECT ticker,
round(stddevSamp(close_px / prev_close - 1) * sqrt(252) * 100, 1) AS annualized_vol_pct,
round(abs(min(close_px / prev_close - 1)) * 100, 2) AS worst_day_pct
FROM rets
WHERE prev_close > 0
GROUP BY ticker
ORDER BY annualized_vol_pct DESCJuly 31, 2026 रोजी संपलेल्या बारा महिन्यांत, COIN ची वार्षिकीकृत अस्थिरता 68% होती. पॅनेलच्या स्थिर टोकावरील SPY साठी ती 12.7% होती. COIN मधील सर्वात खराब एकदिवसीय सत्र मागील बंद भावापेक्षा 13.34% खाली बंद झाले. त्याच कालावधीत SPY मधील सर्वात खराब दिवस 2.69% होता. प्रत्येक नावात समान रक्कम गुंतवल्यास दैनंदिन चढ-उतारांचे प्रमाण खूप वेगळे असते. नवशिक्या प्रत्यक्षात अनुभवतो तो हा चढ-उतार असतो, सिग्नल नव्हे. केली निकषानुसार पोझिशन सायझिंग एक औपचारिक उत्तर मांडते, तर एकाग्रता जोखीम अनौपचारिक उत्तराचे स्वरूप दाखवते.
पाचवा टप्पा: अंमलबजावणी आणि बॅकटेस्ट विसरतो ते खर्च
दोन खर्च असतात; त्यापैकी एकच स्पष्टपणे दिसतो. कमिशन आणि नियामक शुल्क स्टेटमेंटमध्ये दिसतात. स्लिपेज दिसत नाही. तो स्क्रीनवरील किंमत आणि प्रत्यक्ष मिळालेली किंमत यांमधील फरक असतो. त्याची किमान मर्यादा bid-ask spread असते. त्या क्षणी उपलब्ध असलेल्या सर्वोत्तम खरेदी आणि सर्वोत्तम विक्री कोटमधील अंतर म्हणजे spread. खरेदीदार ask वर खरेदी करतात आणि विक्रेते bid वर विक्री करतात. त्यामुळे round trip मध्ये spread दोनदा पार करावा लागतो. Spread स्थिर नसतो.
प्रत्येक आकड्यामागील अचूक SQL
WITH quotes AS (
SELECT ticker,
toStartOfInterval(toTimeZone(sip_timestamp, 'America/New_York'), INTERVAL 30 MINUTE) AS bucket,
toFloat64(ask_price - bid_price) / toFloat64((ask_price + bid_price) / 2) * 10000 AS spread_bps
FROM global_markets.cache_stocks_quotes
WHERE ticker IN ('AAPL', 'KO')
AND sip_timestamp >= toDateTime('2026-07-17 13:00:00')
AND sip_timestamp < toDateTime('2026-07-17 21:00:00')
AND bid_price > 0
AND ask_price > bid_price
)
SELECT formatDateTime(bucket, '%H:%i') AS et_time,
round(avgIf(spread_bps, ticker = 'AAPL'), 2) AS aapl_spread_bps,
round(avgIf(spread_bps, ticker = 'KO'), 2) AS ko_spread_bps
FROM quotes
WHERE spread_bps > 0 AND spread_bps < 500
GROUP BY et_time
HAVING countIf(ticker = 'AAPL') > 0 AND countIf(ticker = 'KO') > 0
ORDER BY et_timeया पॅनेलमध्ये एका शुक्रवारचे 16 अर्ध्या तासांचे bucket दाखवले आहेत. त्यात बाजार उघडण्याच्या घंटीपूर्वीचा 09:00 bucket ते बाजार बंद झाल्यानंतरचा 16:30 bucket समाविष्ट आहे. पहिल्या bucket मध्ये AAPL चा quoted spread 10.53 basis points इतका रुंद होता, तर शेवटच्या bucket मध्ये तो 3.27 होता. KO साठी हे अनुक्रमे 28.87 आणि 8.04 होते. दिवसातील सर्वात कमी quotes चार्टच्या मध्यभागी, या दोन टोकांच्या दरम्यान दिसतात. बाजारातील दोन सर्वाधिक liquid नावांमध्ये open वेळी व्यवहार करणाऱ्या strategy चा खर्च, तिच्याच midday आवृत्तीपेक्षा वेगळा असतो. शून्य-खर्च गृहितक असलेला backtest यापैकी कोणत्याही खर्चाचे योग्य मूल्यांकन करत नाही. bid-ask spread ही संख्या निश्चित करतो, open वेळी spreads का रुंदावतात या वक्राचे स्पष्टीकरण देते, आणि एखाद्या stock मध्ये व्यवहार करण्याचा खर्च पूर्ण round trip चा हिशेब मांडते. स्वच्छ backtest आणि प्रत्यक्ष पैसा यांच्यामध्ये आणखी एक टप्पा असतो: प्रत्यक्ष पैसा वापरण्यापूर्वी paper trading.
A शेअर अभ्यासक्रमातील कोणते भाग US stocks ला लागू होतात?
XQuant आणि त्यासारख्या पद्धती Chinese A shares आणि ETFs साठी तयार करण्यात आल्या आहेत. तरीही ही पद्धत मोठ्या प्रमाणात तशीच लागू होते: टप्प्यांचा क्रम, व्याख्या, overfitting वरील शिस्त, खर्चाला नंतरचा विचार न करता स्वतंत्र line item म्हणून नोंदवण्याची सवय, तसेच position sizing मधील सर्व गणित. Price bars म्हणजे price bars. मात्र, त्याभोवतीचे नियम लागू होत नाहीत.
- A shares मध्ये वास्तविक T+1 निर्बंध आहे: आज खरेदी केलेले stock पुढील session येईपर्यंत विकता येत नाही. US मधील T+1 हा settlement convention आहे आणि intraday व्यवहारांवर कोणताही प्रतिबंध घालत नाही. मात्र, pattern day trader rule मुळे $25,000 पेक्षा कमी रकमेच्या margin accounts मध्ये पाच business days मध्ये तीन day trades ची मर्यादा लागू होते.
- Main-board A shares मध्ये दररोजची हालचाल 10% पर्यंत मर्यादित असते; growth boards वर ही मर्यादा 20% आहे. US stocks वर अशी daily cap नसते. त्याऐवजी volatility bands आणि news halts मुळे trading pauses लागू होतात.
- A share orders चे व्यवहार 100 shares च्या lots मध्ये होतात. अनेक US brokers fractional shares भरतात. त्यामुळे sizing rule ने व्यक्त करता येणाऱ्या व्यवहारांच्या आकारावरही परिणाम होतो.
- China मध्ये sell side वर stamp duty आकारला जातो. US मध्ये sellers कडून वेगळ्या स्वरूपाचे आणि तुलनेने कमी regulatory fees आकारले जातात.
- Session structure देखील वेगळी आहे. Shanghai आणि Shenzhen मध्ये midday break असतो. US stock market hours सलग सुरू राहतात आणि closing auction ने समाप्त होतात.
अभ्यासक्रमातून कोणताही cost किंवा timing constant आपल्या code मध्ये तसाच कॉपी करणे म्हणजे पहिल्या live order ची वाट पाहणारा bug तयार करणे होय.
README नव्हे, संदर्भ निश्चित करा
ऑगस्ट 2026 पर्यंत या repository मध्ये कोणतेही tagged releases नाहीत. त्यामुळे दीर्घकाळ टिकणारा संदर्भ म्हणजे commit: 016b66e, दिनांक 14 जुलै 2026. अजूनही लिहिले जात असलेल्या पुस्तकासाठी हे महत्त्वाचे आहे. प्रकरणांचे क्रमांक बदलतात, README फाइल्स पुन्हा लिहिल्या जातात, headings हलतात, आणि chapter seven कडे निर्देश करणारी लिंक नकळत दुसऱ्याच मजकुराकडे निर्देश करू लागते. commit आणि दिनांक नमूद करा. वाचलेल्या प्रकरणाचा क्रमांक नव्हे, तर त्याचे title नोंदवा. त्यामुळे एक वर्षानंतरही तुमच्या नोंदी तपासता येतील. Manuscript CC BY-NC-SA 4.0 अंतर्गत प्रकाशित आहे, तर build scripts MIT अंतर्गत आहेत. अभ्यासक्रमाचा शेवटचा धडा हीच शिस्त अधोरेखित करतो: pinned data snapshot वरून पुन्हा चालवता न येणारी strategy म्हणजे result नव्हे, तर केवळ कथा.
वारंवार विचारले जाणारे प्रश्न
विनामूल्य मुक्त-स्रोत पुस्तकातून क्वांट ट्रेडिंग शिकता येते का?
दिशादर्शक म्हणून होय. मुक्त हस्तलिखितामुळे प्रत्येक दाव्याची त्याच्या स्रोताशी पडताळणी करता येते. मात्र पुस्तक तुमच्या स्वतःच्या बाजारातील डेटा, खर्च आणि नियम देऊ शकत नाही. त्यामुळे एखाद्या एक्स्चेंजसाठी तयार केलेला अभ्यासक्रम तुमच्या ब्रोकरशी जुळेनासा होतो.
क्वांट अभ्यासक्रमातील कोणता टप्पा बहुतेक नवशिके पार करू शकत नाहीत?
बॅकटेस्ट. त्यात दोन चुका होतात आणि दोन्ही निकाल चांगला असल्याचा भास निर्माण करतात. पहिली म्हणजे survivorship bias. यात universe नंतरच्या माहितीवरून तयार केला जातो. दुसरी म्हणजे look-ahead bias. यात घड्याळाने किंमत दाखवण्यापूर्वीच त्या किंमतीवर व्यवहार भरला जातो. त्या जून आठवड्यात ट्रेडिंग होत असलेल्या tickers पैकी केवळ 50% टक्के tickers 2016 च्या दशकानंतरही ट्रेडिंगमध्ये होते.
survivorship bias आणि look-ahead bias यांच्यात काय फरक आहे?
survivorship bias ही universe शी संबंधित समस्या आहे. तपासल्या जाणाऱ्या names ची निवड ती टिकून राहिली आहेत या आधारावर केली जाते. look-ahead bias ही वेळेशी संबंधित समस्या आहे. ऑर्डर देण्याची वेळ आली तेव्हा उपलब्ध नसलेला आकडा strategy मध्ये वापरला जातो. पहिल्यामुळे roster मोठा दिसतो. दुसऱ्यामुळे fill चांगला दिसतो.
चिनी A-share क्वांट कोर्स US stocks साठी उपयोगी ठरतो का?
पद्धत उपयोगी ठरते. बाजाराचे नियम मात्र लागू होत नाहीत. टप्प्यांचा क्रम, overfitting वरील शिस्त आणि खर्चाचे लेखांकन कायम ठेवा. त्यानंतर कोणताही पैसा गुंतवण्यापूर्वी data plumbing, T+1 विक्रीवरील निर्बंध, daily price limits आणि lot sizes यांची US मधील समतुल्य घटकांनी जागा घ्या.
वरील प्रत्येक panel ही त्याखालील SQL असलेली stored query आहे. एखादी query उघडा, tickers किंवा तारखा बदला आणि Strasmore terminal वर ती स्वतः चालवा.