Strasmore Research
למידה Matt Connorמאת Matt Connor

ללמוד מסחר כמותי מספר קוד פתוח

ספר קוד פתוח למסחר כמותי מציג את כל תוכנית הלימודים: מנתונים גולמיים ועד פקודה חיה. גלו מה מלמד כל שלב, היכן מתחילים נעצרים ומה מתאים למניות בארה״ב.

ספר מסחר כמותי בקוד פתוח הוא תוכנית לימודים ציבורית וחינמית. הוא מתאר את כל הדרך, מנתונים גולמיים ועד פקודה חיה, לפי הסדר שבו מתחיל פוגש אותה. כתב היד של XQuant: Everyone Can Be a Quantitative Trader, שפורסם ב-GitHub על ידי xingwudao, הוא דוגמה ברורה לכך, עם 686 כוכבים נכון לאוגוסט 2026. תשעת הפרקים שלו מתקדמים במסלול שכמעט כל תוכנית לימודים בתחום המסחר הכמותי עוברת בו. עמוד זה עוקב אחר המסלול שלב אחר שלב, מציין את הכשל הספציפי האופייני לכל שלב, ומבהיר אילו חלקים נשארים רלוונטיים במעבר ממניות A בסין למניות בארה״ב.

מה מכיל ספר קוד פתוח למסחר כמותי?

הסירו את המיתוג מכל תכנית לימודים למתחילים, ויישארו חמישה שלבים, בסדר הזה: רכישת הנתונים וניקוים, בניית אות מסחר על בסיסם, בדיקת האות מול נתוני עבר, קביעה כמה הון להקצות, ולאחר מכן שליחת הפקודה ותשלום העלויות. תוכן העניינים של XQuant, כפי שנקרא בגרסה 016b66e מ־14 ביולי 2026, מכסה את אותו תחום בתשעה פרקים.

  • הכנה, ולאחריה פרק אחד: הפעלת אסטרטגיה מלאה מתחילתה ועד סופה.
  • פרק שני, מה לקנות: התחלה עם שלושה ETF.
  • פרק שלישי, כמה לקנות: שלוש שיטות להקצאת הון, בהשוואה זו לזו.
  • פרק רביעי, מתי לסחור: איזון מחדש, פקודת stop loss ופקודת take profit.
  • פרק חמישי, כיצד להעריך אם אסטרטגיה טובה: ארבע נקודות מבט.
  • פרק שישי, אין לחגוג מוקדם מדי: מניעת התאמת יתר.
  • פרק שביעי, מהאידאל למציאות: ביצוע עסקאות.
  • פרק שמיני, החיים לאחר ההשקה: ניטור, אבחון ואיטרציה.
  • פרק תשיעי, איתור הזדמנויות חדשות: מבוא למחקר גורמים.

לסדר הפרקים יש חשיבות. הקצאת ההון מופיעה כבר בפרק השלישי, לפני שני פרקי הבדיקה ההיסטורית, ומחקר הגורמים מופיע בסוף. מסלולי לימוד עצמי נוטים לפעול בדרך ההפוכה: תחילה רעיון לגורם, אחר כך בדיקה היסטורית, ולעולם ללא כלל להקצאת הון. מאגר התרגילים הנלווה (333 כוכבים, באותו תאריך) מאורגן סביב מפרטים כתובים של משימות, ולא סביב קוד מוגמר; הקורא מנחה עוזר AI לממש אותם. היכולת לקרוא קוד שלא כתבתם בעצמכם היא עדיין המיומנות שקובעת את הכול בהמשך, משום שכל כשל שמופיע לאחר מכן מסתתר בתוך פרט יישומי אחד.

שלב ראשון: השגת הנתונים, ולאחר מכן הגדרת היקום

ניקוי נתונים הוא החלק הגלוי של עבודת הנתונים: עסקאות שגויות, מפגשי מסחר חסרים והתאמות לפיצולים ולדיבידנדים. בחירת המניות שאותן יש לבחון היא החלק הסמוי, ושם נכנסת הטיית השרידות — עוד לפני שנכתבה שורת קוד אחת של אסטרטגיה. יש לקחת כל טיקר אמריקאי שבוצעה בו עסקה במהלך שבוע אחד ביוני, שנה אחר שנה, ולבדוק כמה מהם עדיין נסחרו באותו שבוע בשנת 2026.

שאילתהמניות עם טיקרים בארה״ב שנסחרו בשבוע ביוני, וכמה מהן עדיין נסחרו ביוני 2026
ה-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 year
Run this yourself

מתוך 8224 הטיקרים שנסחרו באותו שבוע של 2016, 50% עדיין נסחרו באותו שבוע של 2026. האחרים נרכשו, התמזגו, שינו את שמם או נמחקו מהמסחר. בדיקת ביצועים היסטורית המבוססת על רשימת המניות של ימינו בוחנת רק את המניות ששרדו, ומייחסת לאסטרטגיה החזקה בחברות שנבחרו בדיעבד. מקור נתונים למתחילים ימסור לכם את רשימת השורדות הזו ללא אזהרה: המדריך לAPI חינמי לנתוני שוק המניות מסביר אילו נתונים מקורות כאלה כוללים ואילו אינם כוללים.

שלב שני: הפיכת נתונים לאות

אות הוא כלל שמעניק למניה ציון בנקודת זמן מסוימת, וגורם הוא אות שלדעתכם מתקיים במניות רבות בעת ובעונה אחת. מומנטום, ערך ותנודתיות נמוכה הם הדוגמאות הקלאסיות. הכשל בשלב הזה הוא בדיקת כללים עד שאחד מהם מצליח. עשרים וריאציות של חציית ממוצעים נעים על פני עשור אחד של מדד אחד תמיד יניבו גרסה מנצחת, והיא תהיה זו שהתאימה בצורה הטובה ביותר לרעש. אמצעי ההגנה אינם מרשימים: קבעו את הכלל לפני שאתם מודדים אותו, שמרו חלק מההיסטוריה שאינכם בוחנים לעולם, ספרו כל וריאציה שניסיתם והעדיפו מספר קטן יותר של פרמטרים הניתנים לכוונון. XQuant מקדישה לכך פרק שלם לפני מחקר הגורמים, וזהו הסדר הנכון.

שלב שלישי: הבדיקה ההיסטורית, שבה רוב המתחילים נעצרים

זהו השלב שמסיים את רוב הפרויקטים של לימוד עצמי. הוא מסיים אותם בשקט, עם עקומת הון שנראית מצוין. הטיית ההישרדות, שנדונה לעיל, היא הראשונה מבין שתי הטעויות. הטיית הסתכלות קדימה היא השנייה: האסטרטגיה משתמשת בנתון שהשעון עדיין לא סיפק במועד שבו הייתה אמורה להיכנס הפקודה. הגרסה הנפוצה ביותר היא כלל שמחושב לפי מחיר הסגירה של היום ומבוצע באותו מחיר סגירה. יש למדוד את המרחק שעליו מדלגת ההנחה הזאת.

שאילתההמרחק הממוצע מסגירת סשן אחד לפתיחת הסשן הבא, לפי חודש
ה-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 month
Run this yourself

ב-July 2026, המרחק הממוצע בין מחיר סגירה אחד למחיר הפתיחה הבא עמד על 40.8 נקודות בסיס עבור SPY ועל 107.4 עבור NVDA. נקודת בסיס היא מאית האחוז. כל 24 החודשים שבפאנל, החל מ-August 2024, נמצאים מעל לאפס. בדיקה היסטורית שמקבלת החלטה במחיר הסגירה ומבצעת באותו מחיר סגירה גובה את המרחק הזה ללא עלות בכל עסקה, ואילו פקודה חיה לעולם אינה עושה זאת. הטיית הסתכלות קדימה בבדיקות היסטוריות מפרקת את המנגנון, ו-מדוע מניות יוצרות פערים במהלך הלילה מסביר את הפער עצמו.

שלב רביעי: להחליט כמה לקנות

הכשל כאן הוא היעדר כלל. רוב הסוחרים שלמדו בעצמם אינם כותבים כלל לקביעת גודל הפוזיציה. לכן יש להם כלל מקרי, בדרך כלל הקצאת סכום שווה לכל נייר או שימוש בכל המזומן הזמין. סכומים שווים אינם שווים לסיכון שווה.

שאילתה12 חודשים של תנועות יומיות: תנודתיות שנתית והסשן הגרוע ביותר, 8 מניות
ה-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 DESC
Run this yourself

ב-12 החודשים שהסתיימו ב-31 ביולי 2026, COIN נע בתנודתיות שנתית של 68%, לעומת 12.7% עבור SPY, שהיה בקצה השקט של המדגם. ביום המסחר הגרוע ביותר שלו הוא נסגר 13.34% מתחת לשער הסגירה הקודם, ואילו היום הגרוע ביותר של SPY הסתיים בירידה של 2.69%. השקעת אותו סכום בכל נייר מובילה לתנודות יומיות שונות מאוד. התנודה, ולא האיתות, היא מה שמתחיל חווה בפועל. קביעת גודל פוזיציה לפי קריטריון Kelly מציגה תשובה פורמלית אחת, ואילו סיכון ריכוזיות ממחיש את צורתה של התשובה הלא-פורמלית.

שלב חמישי: ביצוע העסקאות והעלויות שבדיקת עבר מתעלמת מהן

שתי עלויות, אך רק אחת גלויה. עמלות ואגרות רגולטוריות מופיעות בדוח החשבון. החלקה אינה מופיעה בו: היא ההפרש בין המחיר שעל המסך לבין המחיר שבו העסקה מתבצעת. הרצפה שלה היא מרווח ה-bid-ask — המרחק בין הצעת הקנייה הטובה ביותר לבין הצעת המכירה הטובה ביותר באותו רגע. קונים משלמים את ה-ask, ומוכרים פוגעים ב-bid, ולכן עסקת הלוך ושוב חוצה את המרווח פעמיים. המרווח אינו קבוע.

שאילתהמרווח ציטוט ממוצע לפי חצי שעה ב-ET: AAPL ו-KO, יום שישי, 17 ביולי 2026
ה-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
Run this yourself

התרשים כולל 16 מקטעים של חצי שעה ביום שישי אחד, מהמקטע 09:00 שלפני פתיחת המסחר ועד המקטע 16:30 שלאחר הנעילה. מרווח ה-bid-ask של AAPL היה 10.53 נקודות בסיס במקטע הראשון ו-3.27 במקטע האחרון, ואילו אצל KO הוא עמד על 28.87 ו-8.04. הציטוטים הצרים ביותר של היום נמצאים במרכז התרשים, בין שני הקצוות האלה. אסטרטגיה שסוחרת בפתיחה בשתיים מהמניות הסחירות ביותר בשוק משלמת עלות שונה מזו של אותה אסטרטגיה בצהריים, ובדיקת עבר המניחה עלות אפס אינה מתמחרת אף אחת מהן. מרווח ה-bid-ask מגדיר את המספר, מדוע המרווחים מתרחבים בפתיחה מסביר את העקומה, וכמה עולה לסחור במניה מסכם עסקת הלוך ושוב מלאה. בין בדיקת עבר נקייה לבין כסף אמיתי יש שלב נוסף: מסחר נייר לפני השקעת כסף אמיתי.

אילו חלקים מתוכנית לימודים על מניות A עוברים למניות בארה״ב?

XQuant ועמיתותיה נכתבו עבור מניות A ו-ETF סיניים. השיטה עוברת ללא שינוי: סדר השלבים, ההגדרות, המשמעת נגד התאמת־יתר, ההרגל לרשום עלויות כסעיף נפרד ולא כמחשבה מאוחרת, וכל רכיב בחישובי גודל הפוזיציה. גרפי מחירים הם גרפי מחירים. מה שאינו עובר הוא מערכת הכללים שסביבם.

  • על מניות A חלה מגבלת T+1 אמיתית: מניה שנרכשה היום אינה ניתנת למכירה עד יום המסחר הבא. בארה״ב T+1 הוא כלל סליקה, והוא אינו מונע מסחר תוך־יומי, אף שכלל סוחר היום בתדירות גבוהה מגביל חשבונות מרג׳ין שבהם פחות מ־$25,000 לשלוש עסקאות יומיות במהלך חמישה ימי עסקים.
  • במניות A בלוח הראשי קיימת מגבלה של 10% על השינוי היומי, ובבורסות הצמיחה המגבלה היא 20%. במניות בארה״ב אין מגבלה יומית, ובמקומה קיימות עצירות מסחר הנובעות מרצועות תנודתיות ומאירועי חדשות.
  • פקודות במניות A נסחרות במנות של 100 מניות. ברוקרים רבים בארה״ב מבצעים עסקאות גם בשברי מניות, ולכן משתנה אפילו מה שכלל לקביעת גודל פוזיציה יכול לבטא.
  • בסין נגבית stamp duty בצד המכירה. מוכרים בארה״ב משלמים עמלות רגולטוריות קטנות, בעלות גודל ומבנה שונים.
  • מבנה שעות המסחר שונה, ובכלל זה הפסקת צהריים בשנגחאי ובשנזן. שעות המסחר בשוק המניות האמריקאי נמשכות ברציפות ומסתיימות במכרז נעילה.

כל עלות או קבוע תזמון שמועתקים מקורס לקוד שלכם הם באג שממתין לפקודה החיה הראשונה.

הצמד את ההפניה, לא את קובץ ה-README

במאגר אין גרסאות מתויגות נכון לאוגוסט 2026, ולכן ההפניה העמידה היא ל-commit: 016b66e, מתאריך 14 ביולי 2026. הדבר חשוב במיוחד עבור ספר שעדיין נכתב. מספרי הפרקים משתנים, קובצי README נכתבים מחדש, כותרות זזות, וקישור שהוביל לפרק שבע עשוי להוביל בשקט למשהו אחר. יש להפנות ל-commit ולתאריך, ולתעד את כותרת הפרק שקראתם במקום את מספרו. כך ההערות שלכם יישארו ניתנות לבדיקה גם שנה לאחר מכן. כתב היד פורסם ברישיון CC BY-NC-SA 4.0, וסקריפטי הבנייה כפופים לרישיון MIT. אותה משמעת היא גם הלקח האחרון של הסילבוס עצמו: אסטרטגיה שאי אפשר להריץ מחדש מתוך תמונת מצב מקובעת של הנתונים היא סיפור, לא תוצאה.

שאלות נפוצות

האם אפשר ללמוד מסחר כמותי מספר חינמי בקוד פתוח?

למפת הלימוד — כן. כתב־יד פתוח מאפשר לבדוק כל טענה מול המקור שלה. ספר אינו יכול לספק את נתוני השוק, העלויות והכללים של השוק שלכם. בדיוק בנקודה הזאת תוכנית לימודים שנכתבה עבור בורסה אחת מפסיקה להתאים לברוקר שלכם.

באיזה שלב בתוכנית לימודים למסחר כמותי רוב המתחילים נעצרים?

בבדיקת העבר. שתי טעויות מופיעות שם, ושתיהן מייפות את התוצאה: הטיית שורדים, הנובעת מיקום שנבנה בדיעבד, והטיית הצצה לעתיד, הנובעת ממילוי במחיר שעדיין לא הופיע בשוק. רק 50% מהטיקרים שנסחרו באותו שבוע של יוני בשנת 2016 עדיין נסחרו עשור לאחר מכן.

מה ההבדל בין הטיית שורדים להטיית הצצה לעתיד?

הטיית שורדים היא בעיה של יקום ניירות הערך: השמות שנבדקו נבחרו משום ששרדו לאורך זמן. הטיית הצצה לעתיד היא בעיית תזמון: האסטרטגיה משתמשת במספר שלא היה קיים במועד שבו היה אמור להתבצע המסחר. הראשונה מנפחת את רשימת הניירות, והשנייה מנפחת את מחיר הביצוע.

האם קורס למסחר כמותי במניות A סיניות מתאים למניות אמריקאיות?

השיטה מתאימה. כללי השוק אינם מתאימים. שמרו על סדר השלבים, על המשמעת למניעת התאמת־יתר ועל חישוב העלויות. לאחר מכן החליפו את תשתית הנתונים, את מגבלת המכירה T+1, את מגבלות המחיר היומיות ואת גדלי המנות במקבילות האמריקאיות, לפני שתעבירו כסף.


כל חלונית שלמעלה היא שאילתה שמורה, ולצדה מופיע קוד ה-SQL שלה. פתחו אחת מהן, החליפו את הטיקרים או את התאריכים, והריצו אותה בעצמכם במסוף Strasmore.

#quant#learning path#backtesting#open source#beginners