נרמול נתוני בורסות קריפטו: היכן הזרימה נשברת
אותה עסקה בדיוק בשתי פלטפורמות מגיעה בשדות שונים. במקום אחד צמד המסחר הוא שדה אחד, במקום אחר שני טיקרים נפרדים; הנפח — פעם במטבע הבסיס ופעם במטבע המצוטט, וצד העסקה לפעמים כבר מומר ל«קנייה/מכירה», ולפעמים נמסר כדגל יוזם.
פורמטים שונים של ציטוטים נבדלים ביותר בחתימות הזמן: חלק מהפלטפורמות מוסרות מילישניות, אחרות — שניות, חלקן — באזור זמן מקומי במקום UTC, ופרסום העסקה והגעתה לזרימה מופרדים בזמן. אם לצבור הכול כפי שהוא, נרות לאותו אינטרוול לא יתאימו בין הפלטפורמות, והאירוע יימצא בחלון הלא נכון.
מכאן מתחילה התאמה ידנית של עסקאות: האנליסט מאחד ייצואים בטבלה, משווה מזהים, מחשב מחדש נפחים ומנתח ידנית אי-התאמות בייצואים של הפלטפורמות. על יום אחד של היסטוריה ממספר פלטפורמות הולכות שעות, והתוצאה עדיין תלויה בשאלה אם האדם הבחין בהחמצה.
היקר מכל הוא אובדן היסטוריה בעת תקלה. אם האוסף אינו מתעד רשומה לפני שהוא מעביר את הנתונים הלאה, קריסת התהליך מותירה חור, והפלטפורמה אינה מוסרת עסקאות בדיעבד — הפער בשורה נשאר לנצח ומקלקל כל חישוב על גבולו. לכן נרמול נתוני בורסות קריפטו נבנה בכניסה, ולא בשלב הדיווח — אנו מפרקים כיצד זה נסגר.
מה נותנת שכבת נרמול אחידה
שכבת נרמול אחידה מכניסה את כל הפלטפורמות לסכימה אחת: מכשיר, צד העסקה, מחיר ונפח ביחידת בסיס, חתימת זמן באזור זמן משותף, סימן סוג הביצוע ופירוט סגירות חלקיות. ההמרה מתבצעת בכניסה, ולכן האנליטיקה, מודולי המסחר והדיווח קוראים את אותו פורמט ציטוטים — בלי מתאמים נפרדים לכל בורסה.
כטרנספורט משמשת Kafka: חלוקה למחיצות לפי מכשיר שומרת על סדר האירועים, וניתוח חוזר אינו הורס את ההיסטוריה שכבר נרשמה.
חיבור פלטפורמה חדשה מסתכם במחבר ובמפת שדות, ולא בבנייה מחדש של מאגר הנתונים ובתיקונים בקוד הצרכנים. בפועל מדובר בימי עבודה במקום בשבועות: מקור חדש מוקם בסביבת בדיקות, מושווה לאמת מידה על קטע היסטורי ומופעל בזרימה הכללית.
איחוד אוטומטי של מקורות מכסה את רוב הרשומות — בין 97% ל-99% בהתאם לפלטפורמה. ספוט ונגזרים של אותו צמד מותאמים לפי מכשיר וזמן, ואי-התאמות נתפסות לפי סכומי ביקורת של נפחים לדקה.
השאר עובר לתור לניתוח: זו בדיקה סלקטיבית של אנומליות, ולא זרם של התאמות ידניות שאכל בעבר את זמנה של משמרת תורנית.
שלמות היסטוריית העסקאות נשענת על כתיבה אידמפוטנטית לפי מפתח «פלטפורמה + מזהה עסקה» ועל לוג בלתי משתנה של תגובות גולמיות. אפשר לשחזר את הנרמול מחדש ולקבל את אותה תוצאה — זה מציל בעת הבהרת כללים או ניתוח משלים של קטע שהוחמץ.
בדרך נעלם גם סוג שלם של שגיאות: אי-סנכרון אזורי זמן, סימונים שונים לאותו צמד, ביצועים חלקיים שאבדו ועסקאות כפולות בעת הפעלה מחדש של האיסוף.
דרכים לאיסוף ציטוטים: השוואת גישות
בורסה אינה מוסרת ציטוטים בדרך אחת: רעננות ועומק ההיסטוריה מגיעים מערוצים שונים. מנוי זרימה על ציטוטים מחזיק חיבור קבוע ומוסר שינויים עם היווצרם — השהיית הגעת הציטוטים נמדדת בשברירי שנייה, אך מאגר הערוץ מוגבל, ובעת ניתוק הקשר יש להשלים את האינטרוול שהוחמץ בנפרד.
ייצואים באצוות של היסטוריה נותנים עומק היסטוריית עסקאות וחתך מלא של ספר הפקודות לתקופות קודמות, אבל נוצרים במנות ומפגרים במידה ניכרת אחרי הרגע הנוכחי.
סקר לפי לוח זמנים תופס את האמצע: הוא צפוי ואינו דורש חיבור קבוע, אך בשוק תנודתי מספיקה תנועה להתרחש בין שתי בקשות — תנועה שהיינו רואים בזרימה מיד.
| גישה | מתי מתאימה | מגבלות |
|---|---|---|
| מנוי זרימה על ציטוטים | מסחר מקוון, בקרת סיכונים, תצוגות בזמן אמת | נדרש פיקוח על ניתוקים והשלמת החמצות, מספר המנויים במקביל מוגבל |
| סקר לפי לוח זמנים | אנליטיקת תיקים, דוחות, התראות, אותות נדירים | השהיית הגעת הציטוטים גדלה יחד עם האינטרוול, ובקשות תכופות נתקלות במגבלות הבורסה |
| ייצואים באצוות של היסטוריה | בדיקת אסטרטגיות על נתוני עבר, ביקורת, ניתוח תקלות | עומק היסטוריית העסקאות מוגבל לחלון הייצוא, הנתונים מגיעים בפיגור |
מה נלקח בצירוף
התאמה מושגת לא בבחירה בגישה אחת, אלא בצירופן: הזרימה מחזיקה את השכבה החמה ואת התצוגות המבצעיות, הייצואים משלימים את ההיסטוריה, והסקר משמש כרשת ביטחון במקרה של ניתוק. התנאי המרכזי — מודל אחיד של מכשיר וזמן, אחרת אותה עסקה מגיעה מערוצים שונים עם מזהים שונים ואינה מתאחדת.
שלבי היישום: מביקורת המקורות ועד המסירה
סדר העבודה נבנה כך שכל החלטה תאומת על ידי התנהגות המקור, ולא על ידי הנחה. תחילה מתעדים מה הפלטפורמות באמת מוסרות, אחר כך בונים את סכימת היעד, ורק לאחר מכן כותבים קוד — אחרת העבודה מחדש תעלה יותר מהניתוח עצמו.
- ביקורת מקורות הבורסה. מפרקים זרמי עסקאות, ספר פקודות וייצואי היסטוריה: פורמטי תגובות, תדירות עדכון, עימוד, מגבלות בקשות, התנהגות בעת ניתוק חיבור. בנפרד מסמנים מקורות שמוסרים נתונים בפיגור או מחשבים מחדש בדיעבד.
- מפת אי-התאמות. מאחדים לטבלה אחת את ההבדלים בין הפלטפורמות: מזהי מכשירים, דיוק המחיר והנפח, אזורי זמן וחתימות זמן, סימון צד העסקה. היא גם הופכת למסמך עבודה בעת הוספת בורסה חדשה.
- כללי איחוד רשומות. מתארים סכימת אירוע אחידה: מפתח, המרת סימונים, עיגול, סימון כפילויות ופתיחות מחדש. הכללים מנוהלים בגרסאות — תיקון אינו שובר מערכי נתונים שכבר נאספו.
- בנייה. מיישמים קליטה, נרמול וכתיבה למאגר עם עיבוד אידמפוטנטי: הפעלה חוזרת אינה יוצרת כפילויות, והחמצה נסגרת בהשלמת היסטוריה.
- בדיקה על נתונים היסטוריים. מריצים את הכללים על הארכיון שנצבר: משווים מספר אירועים ונפחים, חיבורים בעת הפעלה מחדש, שחזור לאחר החמצות. כל אי-התאמה מנותחת עד לשורש, ולא מחליקה במסנן.
- מסירת המערכת ללקוח. מוסרים קונפיגורציות, סכימת אחסון, נהל בקרת איכות הנתונים וסדר הפעולות בעת תקלת מקור, ומכשירים את הצוות. לאחר המסירה המערכת פועלת ומתפתחת בכוחות הלקוח — התמיכה שלנו נשארת אופציה, ולא תנאי.
מה נמסר לידיים: קונפיגורציות ונהלים
אנחנו מוסרים לא רק סביבה פעילה, אלא גם ערכה שלפיה אפשר לפתח אותה בלעדינו. כל ארטיפקט מקושר לפעולה מוגדרת: לחבר בורסה חדשה, לנתח אי-התאמה בנר, להחליף אחראי או להבין מדוע המקור נפל בלילה.
- קונפיגורציות חיבורים — לכל בורסה: רשימת צמדי מסחר וזרמים, מגבלות פניות, סכימת התחברות מחדש, התנהגות בעת אי-סנכרון והחמצת הודעות.
- סכימת נרמול — מודל אחיד של מכשיר ואירוע עסקה, כללי המרת טיקרים וחתימות זמן לסקאלה אחת, טיפול בשינויי שמות ובפיצולים.
- מפתחי התאמות — טבלאות בין מזהי הבורסה למזהים הפנימיים והסדר להוספת מקור חדש בלי לתקן קוד.
- כללי גישה — תפקידים לקריאת נתונים, שינוי מיפוי וקונפיגורציות; יומן שינויים כדי שכל התערבות תהיה ניתנת להסבר.
- נהל תחזוקה — תגובה לליסטינג חדש, לשינוי פורמט ולניתוק מקור, תדירות ההתאמות, נקודות הסלמה.
- תיעוד המערכת — סכימה ארכיטקטונית, תיאור זרמי הנתונים, צ'ק-ליסט לחיבור בורסה ורשימת מגבלות ידועות.
- ערכת קבלה — אירועי בדיקה עם תוצאת נרמול צפויה, כדי שאי-התאמות ייתפסו בבדיקה ולא שבועות אחרי ההרצה.
בנפרד מתעדים מה נשאר בצד שלכם: מפתחות גישה, קשרים עם הבורסות, מדיניות שמירת ההיסטוריה.
מקרה בוחן: איחוד ציטוטים מארבע פלטפורמות
הלקוח — קרן למסחר אלגוריתמי בארבע פלטפורמות, כולל Bybit. כל אחת מהן מסרה עסקאות וספר פקודות בצורה משלה: זמן בשניות ובמילישניות, בחלק מהפלטפורמות — מקומי, בלי היסט, ואותו מכשיר נרשם כ-BTC/USDT, BTCUSDT ו-XBTUSD.
ההתאמה נעשתה ידנית: האנליסט אסף ייצואים לטבלאות ומצא אי-התאמות כבר בדוח המוכן — בנפחים, בזמן ובאינטרוולים שהוחמצו. יום מסחר אחד נמשך כשש שעות, ועל נפח כזה אבדו אנומליות נדירות אך משמעותיות.
| מדד | לפני | אחרי |
|---|---|---|
| חלק הרשומות שאוחדו אוטומטית | 63% | 99.4% |
| זמן הכנת הדוח היומי | 5-6 שעות של התאמה ידנית | 9 דקות |
| אי-התאמות ל-10,000 עסקאות | כ-430 | בודדות, כל אחת ניתנת להסבר |
הבסיס היה מודל נתונים אחיד: הזמן מומר ל-UTC, המכשירים — למפתח משותף עם המרת סימונים, העסקאות עוברות דה-דופליקציה לפי מזהה הפלטפורמה, וצילום ספר הפקודות מתאחד עם השינויים שאחריו. כל רשומה שומרת את המקור, ולכן אי-התאמה מנותחת עד להודעה המקורית.
בדיקות לפערים ולאי-סנכרון מבוצעות בכניסה, ולא בדוח: רשומה עם שרשרת אירועים חסרה מסומנת ועוברת לתור נפרד לניתוח. הדוח נוצר לפי לוח זמנים, וההתאמה הידנית הפכה משלב מחייב לחריג.
מה עושים אם לבורסה כבר יש ערוץ אספקה משלה?
אין צורך לשבור ערוץ פעיל. אם לבורסה כבר יש ערוץ אספקה משלה לציטוטים, הוא הופך לעוד קולט בסכימה הכללית: שכבת הנרמול מונחת מעליו ומביאה את הזרימה לצורה אחידה, במקום להחליף את המקור.
מבחינה טכנית זה נראה כך: הקולט קורא את מה שסביבה קיימת כבר מוסרת — חיבור זרימה, קבצי ייצוא או FIX — ומפרסם אירועים למודל הפנימי.
בו לכל אירוע קבועים מכשיר, סוג, חתימת זמן בדיוק לפי המקור וסימן מקור, ולכן המודול החישובי, הארכיון והתצוגה אינם יודעים ואינם צריכים לדעת מאיזה ערוץ הגיעו הנתונים.
מכאן מתחיל דו-קיום של שתי סביבות והגירה הדרגתית של מקורות. הסביבה החדשה והפתרון העצמי פועלים במקביל: אי-התאמות בנפח ובמחירים מחושבות אוטומטית, והמקור עובר לענף המנורמל רק לאחר התאמה מאומתת. הסדר — מקור אחד בכל פעם, עם אפשרות להחזיר את המסלול הקודם בלי לעצור את האיסוף.
הנטישה של הפתרון העצמי אינה קורית «בוקר אחד», אלא ככל שהמקורות מכוסים: תחילה מוסרת ממנו הכתיבה והוא נשאר במצב קריאה לצורכי התאמה, ואחר כך מכובה. כך ההשתלבות בסכימה הקיימת אינה הופכת למעבר חד וסיכוני — מחיר הטעות משלם מקור אחד, ולא כל איסוף הציטוטים.
ספקות טכניים: ניתוח שאלות נפוצות
פלטפורמות משנות סכימות תגובות בלי הודעה מוקדמת: שינו שם שדה, הזיזו קינון, הפכו מספר למחרוזת. מה שנשבר הוא לא הקליטה אלא הניתוח — ומשם הכול מתפצל: פקודות, עסקאות, נרות, אגרגטים של נרות.
לכן החוזה בכניסה מתואר באופן דקלרטיבי: סכימה, סוגי שדות, חובה, כללי המרה. אי-התאמות עוברות להסגר, ולא לתצוגה הראשית. להלן השאלות שנשאלות לרוב על ידי מהנדסי הלקוח.
הפלטפורמה שינתה את פורמט התגובה — האם התצוגה תתקלקל?
מיפוי השדות יושב בשכבת קונפיגורציה נפרדת, ולא בקוד העיבוד. סכימה חדשה מחוברת כגרסה חדשה, והישנה נשארת זמינה להשוואה. עד שהזרימה לא תעבור בדיקה על מדגם אמת של תגובות אמיתיות, היא נמצאת בהסגר — אי-התאמות נראות, אבל נתוני הצרכנים אינם נפגעים.
כיצד מיישרים חתימות זמן של פלטפורמות שונות?
שומרים שני ערכים: זמן האירוע לפי השעון של הפלטפורמה וזמן הקליטה אצלנו. את החתימות מביאים לאזור זמן אחיד, מפרקים שניות שלמות, מילי- ומיקרושניות, ובנפרד מחשבים ומפצים על השהיית הרשת. נרות שנאספו ממקורות שונים אינם מתפצלים ביניהם אחרי זה.
מה יקרה בעת תקלת מקור או ניתוק קשר?
התחברות מחדש בהשהיה גדלה, ובמקביל טרנספורט סקר גיבוי ומאגר בדיסק, כדי לא לאבד את האינטרוול שהוחמץ. חזרות מרוסנות לפי מפתח רשומה, ולכן כפילויות אינן מצטברות. ההחמצה מתועדת בדוח שלמות, ולא נשארת בלי שמבחינים בה.
מחברים מקור חדש ומעבדים מחדש את ההיסטוריה?
מתאם המקור נבנה לפי החוזה הכללי, ובנפרד מתוארים מפתח המכשירים וכללי ההתאמה של טיקרים. ההיסטוריה נטענת במנות עם בדיקת סכומי ביקורת, הכתיבה אידמפוטנטית — הרצה חוזרת לאותה תקופה אינה יוצרת כפילויות ומתלכדת עם נתוני המקור.
נדון במשימה שלכם ונחזור עם תוכנית
כדי לדון במשימת הנרמול באופן ענייני, בכניסה נדרשת רשימת מקורות ציטוטים וסכימת אספקת הנתונים הנוכחית. ככל שרשימת הפלטפורמות, המכשירים וסוגי ההודעות הנדרשים תהיה מדויקת יותר, כך תהיה האומדנה של היקף העבודה מדויקת יותר — בלי הנחות שהופכות אחר כך לעבודה מחדש. שלחו את מה שיש: טיוטה, טבלת התאמת שדות, קטע קונפיגורציה.
מכאן מפרקים לפי סעיפים:
- רשימת מקורות ציטוטים — פלטפורמות, מספר מכשירים, האם נדרשים עסקאות, ספרי פקודות, מדדים וחתימות זמן.
- סכימת הקבלה הנוכחית — חיבור ישיר, אגרגטור חיצוני, ייצואים, קיום ארכיונים היסטוריים.
- פורמט היעד והצרכנים — לאן מוסרים את הנתונים ואילו שדות הם חובה למערכת המסחר, לאנליטיקה או למאגר.
- דרישות להשהיה ולשלמות — פיגור מותר של ציטוטים, עומק ההיסטוריה, התנהגות בעת ניתוק חיבור.
- מאפייני המכשירים — טיקרים לא סטנדרטיים, צעדי מחיר וגדלי לוט שונים, כללי עיגול בכל פלטפורמה.
- מה כבר עובד — סכימות טבלאות, תורים, סקריפטים עצמיים לנרמול: נשמור את מה שלא מפריע, ולא נשבור זרימה פעילה.
- מגבלות ולוחות זמנים — הרשאות גישה, בדיקות בצד שלכם, מועד העלייה לאוויר, מי מקבל את התוצאה.
לאחר הניתוח נחזור עם אומדן של היקף העבודה, תוכנית יישום ולוחות זמנים לפי שלבים, עם נקודות קבלה בכל אחד.







