Strasmore Research
Deep Dives · Matt ConnorBy Matt Connor ·

איך עובד לוח מחוונים GEX בקוד פתוח

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

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

כיצד מחושבת חשיפת גמא (Gamma exposure)?

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

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

  • gamma: גמא למניה עבור החוזה, כפי שהיא נקראת מתמונת מצב של שרשרת האופציות או מחושבת מקומית מתנודתיות גלומה.
  • open_interest: חוזים שנותרו פתוחים באותו מחיר מימוש ומועד פקיעה.
  • 100: מכפיל החוזה.
  • spot * spot: ממיר שינוי בדלתא לשינוי נומינלי דולרי במחיר הנוכחי של נכס הבסיס.
  • 0.01: מבצע התאמה מחדש של התוצאה מתנועה של דולר אחד לתנועה של אחוז אחד.

הנתון לכל מחיר מימוש הוא gex = gamma * open_interest * 100 * spot * spot * 0.01. סכמו זאת עבור כל מחיר מימוש בשרשרת, כאשר אופציות Call נרשמות כערך חיובי ואופציות Put כערך שלילי, והסכום הכולל הוא הנתון המרכזי. כל יתר הנתונים שמוצגים בלוח הבקרה – עמודות לפי מחיר מימוש, הפרופיל המצטבר, רמת ההיפוך (flip level) והפירוט לפי מועדי פקיעה – הם סידור מחדש של אותו סכום בודד.

כיצד נראה פרופיל GEX לפי מחיר מימוש?

הלוח שלהלן בונה את הפרופיל עבור SPY בכל מחירי המימוש בטווח של 1.5% משער הסגירה של נכס הבסיס, עבור חוזים הפוקעים בתוך 30 יום.

שאילתהחשיפת גמא של SPY לפי מחיר מימוש, מסחר אחרון, חוזים ל-30 יום
ה-SQL המדויק מאחורי כל מספר
SELECT
    concat('$', toString(round(k)))                                         AS strike,
    round(sumIf(gex, side = 'call') / 1e6, 1)                               AS call_gex_musd,
    round(-sumIf(gex, side = 'put') / 1e6, 1)                               AS put_gex_musd,
    round((sumIf(gex, side = 'call') - sumIf(gex, side = 'put')) / 1e6, 1)  AS net_gex_musd,
    any(snapshot_label)                                                     AS snapshot_label
FROM
(
    SELECT
        toFloat64(strike_price)                                AS k,
        if(lower(option_type) LIKE 'c%', 'call', 'put')        AS side,
        toFloat64(gamma) * toFloat64(volume) * 100
            * pow(toFloat64(underlying_close), 2) * 0.01       AS gex,
        formatDateTime(date, '%b %e, %Y')                      AS snapshot_label
    FROM global_markets.options_greeks
    WHERE underlying_symbol = 'SPY'
      AND date = (SELECT max(date) FROM global_markets.options_greeks WHERE underlying_symbol = 'SPY')
      AND iv_converged = 1
      AND volume > 0
      AND days_to_expiry BETWEEN 0 AND 30
      AND abs(toFloat64(strike_price) / toFloat64(underlying_close) - 1) < 0.015
)
GROUP BY k
ORDER BY k
Run this yourself

החלפה אחת משמעותית כאן, והיא אותה החלפה שרבים מלוחות המחוונים החינמיים מבצעים מבלי לציין זאת. הנתונים שמאחורי לוחות אלו נושאים את היווניות (Greeks) והיקפי המסחר לכל חוזה, ולא את ה-Open Interest; לכן, כל מחיר מימוש משוקלל לפי נפח המסחר בחוזים באותו יום. אלו מודדים דברים שונים: נפח מסחר סופר את העסקאות שבוצעו במהלך היום, בעוד ש-Open Interest סופר פוזיציות שנותרו פתוחות בסגירה. צורת העקומה היא העיקר, והרמה הייתה משתנה לו נעשה שימוש בעמודת Open Interest אמיתית. כדאי לקרוא את ההבחנה במלואה ב-נפח מסחר באופציות לעומת Open Interest.

הרצועה מכילה 23 מחירי מימוש, הנעים בין $758 ועד $780, כולם נמדדו ב-Aug 6, 2026. במחיר המימוש הנמוך ביותר בתצוגה, הנטו המשוקלל מגיע ל--653.1 מיליון דולר לכל תנועה של אחוז אחד. במחיר הגבוה ביותר הוא מגיע ל-849.4 מיליון. שימו לב עד כמה העמודות אינן אחידות ממחיר מימוש אחד למשנהו. מספרים עגולים ומועדי פקיעה בעלי נפח מסחר גבוה מצטברים, בעוד שמחירי המימוש שביניהם כמעט ואינם מורגשים.

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

שום נתון בשרשרת אופציות אינו מתעד מי נמצא בכל צד של חוזה. השרשרת מדווחת על מחירי מימוש (strikes), תאריכי פקיעה, יווניות (greeks) ומספר החוזים הפתוחים. היא אינה מציינת אם ה-market maker שציטט אותם סיים את היום בפוזיציית Long או Short, ושום הזנת נתונים ציבורית אינה מספקת מידע זה.

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

למוסכמה זו יש רציונל. זרם הפקודות של משקיעים קמעונאיים נוטה למכירת covered calls ו-cash secured puts, ולרכישת אופציות Put כהגנה, מה שמותיר את הדילר בצד השני בכיוון המשוער. זו נותרת הנחה לגבי הבעלות המיושמת באופן אחיד על מחירי מימוש שבהם היא לעיתים קרובות שגויה, כולל מחיר מימוש שקונה מוסדי גדול של אופציות Call זה עתה מילא. לוח מחוונים שמציג את המספר מבלי לציין את המוסכמה, הסתיר את הקלט החשוב ביותר שלו.

היכן ממוקם ה-Gamma לאורך טווחי הפקיעה?

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

שאילתהחשיפת גמא מצטברת של SPY לפי פקיעה, שלושת השבועות הקרובים
ה-SQL המדויק מאחורי כל מספר
SELECT
    formatDateTime(expiry_date, '%b %e')                                    AS expiry,
    round(sumIf(gex, side = 'call') / 1e9, 2)                               AS call_gex_bn,
    round(-sumIf(gex, side = 'put') / 1e9, 2)                               AS put_gex_bn,
    round((sumIf(gex, side = 'call') - sumIf(gex, side = 'put')) / 1e9, 2)  AS net_gex_bn
FROM
(
    SELECT
        expiration_date                                        AS expiry_date,
        if(lower(option_type) LIKE 'c%', 'call', 'put')        AS side,
        toFloat64(gamma) * toFloat64(volume) * 100
            * pow(toFloat64(underlying_close), 2) * 0.01       AS gex
    FROM global_markets.options_greeks
    WHERE underlying_symbol = 'SPY'
      AND date = (SELECT max(date) FROM global_markets.options_greeks WHERE underlying_symbol = 'SPY')
      AND iv_converged = 1
      AND volume > 0
      AND days_to_expiry BETWEEN 0 AND 21
)
GROUP BY expiry_date
ORDER BY expiry_date
Run this yourself

לאורך 11 תאריכי הפקיעה בתוך שלושה שבועות, הקרוב ביותר, Aug 7, נושא צד Call בהיקף של 20.57 מיליארד דולר לכל תנועה של אחוז אחד, ונטו חתום של -5.1 מיליארד דולר. הקצה המרוחק של הלוח מהווה שבריר מכך. תרשים לוח מחוונים ראוי לקריאה מציין את מסנן הפקיעה שלו על גבי התרשים עצמו.

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

באיזו מידה משתנה הפרופיל מיום ליום?

ה-Open interest אינו נתון סטטי. חוזים פוקעים, מחירי מימוש (strikes) חדשים מתווספים, ופוזיציות נפתחות ונסגרות במהלך כל יום מסחר.

שאילתהגמא ברוטו של אופציות Call ו-Put ב-SPY מול הנטו, 60 ימים אחרונים
ה-SQL המדויק מאחורי כל מספר
SELECT
    toString(d)                                                             AS session_date,
    formatDateTime(d, '%b %e')                                              AS session_label,
    round(sumIf(gex, side = 'call') / 1e9, 2)                               AS call_gex_bn,
    round(-sumIf(gex, side = 'put') / 1e9, 2)                               AS put_gex_bn,
    round((sumIf(gex, side = 'call') - sumIf(gex, side = 'put')) / 1e9, 2)  AS net_gex_bn
FROM
(
    SELECT
        date                                                   AS d,
        if(lower(option_type) LIKE 'c%', 'call', 'put')        AS side,
        toFloat64(gamma) * toFloat64(volume) * 100
            * pow(toFloat64(underlying_close), 2) * 0.01       AS gex
    FROM global_markets.options_greeks
    WHERE underlying_symbol = 'SPY'
      AND date >= today() - 60
      AND iv_converged = 1
      AND volume > 0
      AND days_to_expiry BETWEEN 0 AND 45
)
GROUP BY d
ORDER BY d
Run this yourself

שני דברים בולטים לאורך 41 ימי המסחר המוצגים. הצדדים ברוטו הם גדולים, והנטו הוא ההפרש ביניהם: ב-Aug 6, יום המסחר האחרון בגרף, צד ה-Call עמד על 29.2 מיליארד דולר לעומת צד ה-Put שעמד על -34.53 מיליארד דולר, מה שהוביל לנטו של -5.32 מיליארד דולר. שינוי קטן בכל אחד מהצדדים ברוטו מזיז את הנטו במידה משמעותית. הקו גם רחוק מלהיות חלק. הנטו עמד על -4.9 מיליארד דולר ב-Jun 9, והגרף ממחיש את טווח התנועה בין ימי המסחר. תרשים GEX ללא חותמת זמן הוא קישוטי בלבד.

במה שונה GEX מ-max pain?

שני המדדים סורקים את אותה שרשרת אופציות אך מציבים שאלות שונות. GEX משקלל כל מחיר מימוש לפי ה-gamma שלו ושואל איזה היקף ביקוש לגידור ייווצר בתנועה של אחוז אחד. Max pain מתעלם לחלוטין מ-gamma ושואל שאלת פקיעה: באיזה מחיר יהיה הערך המצטבר של אופציות בתוך הכסף (ITM) הנמוך ביותר במועד הפקיעה. הפאנל להלן בונה את העקומה הזו מאותו תצלום מצב, עבור חוזים הפוקעים בתוך שבוע.

שאילתהאותה שרשרת, שאלה אחרת: שווי בכסף (ITM) לפי מחיר פקיעה
ה-SQL המדויק מאחורי כל מספר
WITH chain AS
(
    SELECT
        toFloat64(strike_price)                                             AS k,
        if(lower(option_type) LIKE 'c%', 'call', 'put')                     AS side,
        sum(toFloat64(volume))                                              AS contracts,
        min(abs(toFloat64(strike_price) / toFloat64(underlying_close) - 1)) AS moneyness
    FROM global_markets.options_greeks
    WHERE underlying_symbol = 'SPY'
      AND date = (SELECT max(date) FROM global_markets.options_greeks WHERE underlying_symbol = 'SPY')
      AND volume > 0
      AND days_to_expiry BETWEEN 0 AND 7
    GROUP BY k, side
)
SELECT
    concat('$', toString(round(sk)))          AS settle_price,
    round(sum(multiIf(
        side = 'call' AND sk > k, (sk - k) * contracts * 100,
        side = 'put'  AND sk < k, (k - sk) * contracts * 100,
        0)) / 1e9, 2)                         AS itm_value_bn
FROM (SELECT DISTINCT k AS sk FROM chain WHERE moneyness <= 0.015) AS grid
CROSS JOIN chain
GROUP BY sk
ORDER BY sk
Run this yourself

העקומה מכסה 23 מחירי פקיעה אפשריים. ב-$758 הערך המצטבר בתוך הכסף מסתכם ב-0.86 מיליארד דולר, וב-$780 הוא מסתכם ב-0.7 מיליארד דולר. הנקודה הנמוכה ביותר בעקומה היא מחיר ה-max pain. הוא יכול להימצא במרחק של מספר דולרים ממחיר המימוש בעל חשיפת ה-gamma הגדולה ביותר באותו תצלום מצב, ואף אחת מהנקודות אינה מהווה תחזית למחיר שבו יפקע נכס הבסיס.

מה נדרש כדי להריץ לוח מחוונים (Dashboard) של GEX בקוד פתוח?

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

  • תמונת מצב (snapshot) של שרשרת האופציות הכוללת מחיר מימוש, תאריך פקיעה, סוג אופציה, Open Interest, ונתון Gamma של ספק או תנודתיות גלומה (implied volatility) לצורך חישובו.
  • מחיר ה-Spot של נכס הבסיס, כפי שנמדד באותו רגע של השרשרת.
  • חותמת זמן, שנשמרת לצד הפלט ולא מבוססת על הנחה.
  • מסנן פקיעות שתבחר באופן מושכל.
  • מפתח גישה לנתוני שוק.

התקן מגרסה מתויגת (tagged release) ולא מה-branch המוגדר כברירת מחדל. git clone --branch <tag> --depth 1 <repo-url> מספק לך גרסת build שמישהו אישר, בעוד ש-main מספק לך את כל מה שנדחף למערכת הבוקר. עבוד בתוך סביבה וירטואלית: python3 -m venv .venv, הפעל אותה, ולאחר מכן pip install -r requirements.txt. קרא תחילה את שורת ה-requires-python בתוך קובץ ה-pyproject.toml של הפרויקט. חבילה המקובעת למפרש (interpreter) ישן עלולה להיכשל בדרכים לא ברורות על גבי גרסה חדשה יותר.

נתוני שוק הם החלק שלעיתים רחוקות ניתן להשיג בחינם. תמונת מצב המכילה גם Open Interest וגם יווניות (Greeks) עבור כל חוזה בשרשרת היא שירות בתשלום אצל רוב הספקים נכון לאוגוסט 2026. נקודות קצה (endpoints) חינמיות נוטות להחזיר ציטוטים ללא Open Interest, או נתוני Open Interest שמתפרסמים רק בבוקר שלמחרת. פרופיל שנבנה על בסיס ה-Open Interest של אתמול הוא מיושן בדיוק בנקודה שבה החישוב הוא הרגיש ביותר.

מה לוח מחוונים של GEX אינו יכול לדעת

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

ארבעה גורמים נותרים מחוץ לטווח הראייה של כל כלי המבוסס על שרשרת אופציות:

  • מי מחזיק בפועל בכל צד של כל מחיר מימוש
  • פוזיציות שנפתחו מחוץ לבורסה (OTC)
  • מדיניות הגידור של כל דסק מסחר, כולל דסקים המגדרים לפי לוח זמנים ולא באופן רציף
  • האם פרינט של עניין פתוח (open interest) הגיע מביצוע פתיחת פוזיציה או סגירת פוזיציה

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

כיצד חושבו פאנלים אלו

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

שאלות נפוצות

מהו GEX במסחר באופציות?

GEX, או Gamma Exposure, הוא אומדן לשינוי בביקוש לגידור אופציות בתגובה לתנועה של אחוז אחד בנכס הבסיס. החישוב מכפיל את ה-Gamma של כל חוזה ב-Open Interest, במכפיל של מאה מניות ובריבוע מחיר הנכס, ומסכם את התוצאות עבור כל מחירי המימוש, תוך החלת סימן מוסכם עבור אופציות Call ו-Put.

האם נדרש Open Interest כדי לחשב GEX?

המודל הסטנדרטי משתמש ב-Open Interest, המונה את הפוזיציות שנותרו פתוחות. ישנם לוחות בקרה המשתמשים בנפח מסחר (Volume) כאשר ה-Open Interest אינו זמין או מתקבל בעיכוב; החלפה ביניהם משנה את רמת הפרופיל.

מהי רמת ה-Zero Gamma או ה-Gamma Flip?

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

האם קריאת GEX חיובית מעידה על שוק שורי?

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

האם ניתן לבנות לוח בקרה ל-GEX ללא הזנת נתונים בתשלום?

ניתן לבנות ולבחון את החישוב על כל תמונת מצב (Snapshot) של שרשרת אופציות, כולל נתונים מושהים או חלקיים. הפקת פרופיל עדכני דורשת בדרך כלל הזנת נתונים הכוללת Open Interest ו-Greeks עבור כל השרשרת, שירות שרוב הספקים גובים עבורו תשלום נכון לאוגוסט 2026.


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

#gamma exposure#options#open source#dealer positioning#tools