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

סביבת עבודה כמותית למניות A-share: מדריך להקמה עצמית

סביבת עבודה כמותית למניות A-share מאפשרת הרצת סריקות ובדיקות לאחור על המחשב האישי. הכירו את רכיבי המערכת וארבעת הפרמטרים הקריטיים לבדיקה לפני תחילת העבודה עם הפרויקט.

08:00
סביבת עבודה כמותית (quant workbench) למניות A-share המתארחת באופן עצמאי היא דף אינטרנט יחיד המבצע סריקת שוק, מעקב אחר רשימת שמות, הרצת בדיקות לאחור (backtests) וכתיבת סקירה לאחר המסחר, וכל זאת על מכונה שבשליטתך במקום במסוף של ברוקר. פרויקט אחד ברישיון MIT, tickflow-stock-panel, מאגד את כל אלו מאחורי פורט יחיד, והוא צבר כאלפיים ושמונה מאות כוכבים ב-GitHub נכון לאוגוסט 2026. רשימת התכונות היא החלק הקל לקריאה. השכבה שמתחתיה היא זו שקובעת האם משהו מכל זה עדיין יעבוד ברבעון הבא.

ממה מורכבת סביבת עבודה כמותית עצמאית למניות A-share

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

  • דף אינטרנט הבנוי ב-React וב-TypeScript.
  • שירות Python מבוסס FastAPI, עם מתזמן המרענן נתונים לפי טיימר.
  • מאגר מקומי: קבצי Parquet על הדיסק, הנשלפים באמצעות DuckDB ומעובדים ב-Polars.
  • מנוע Backtesting מסוג vectorbt, המופנה אל אותם קבצים.
  • ערכת פיתוח (SDK) של ספק, השואבת את כל מחירי הנכסים המוצגים בלוח.

שימו לב למה שחסר. שום דבר ב-stack הזה אינו מתחבר לבורסה. הלוח מבצע את החישובים; הספק מספק את הנתונים. המונח "Self-hosted" מתאר היכן הקוד רץ ואינו אומר דבר על מקור המספרים. החזקה בנתוני ה-raw bars היא תפקידה של השכבה שמתחת, אגם נתוני שוק A-share מקומי, וזה מה שהופך את כל מה שמעליה לניתן להחלפה.

מה כוללת גרסת החינם של מקור הנתונים

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

המתחזק מציג את ההסדר באופן ישיר:

הפרויקט מיועד ללימוד ולמחקר כמותי בלבד ואינו מהווה ייעוץ השקעות. תוצאות של בדיקות לאחור (backtest) אינן מעידות על תשואות עתידיות.
זהו פרויקט קוד פתוח אישי, המבוסס על מקור הנתונים TickFlow, ואינו פרויקט רשמי של TickFlow.
README, shy3130/tickflow-stock-panel, נקרא ב-13 באוגוסט 2026

בתרגום לעברית: הפרויקט מיועד ללימוד ולמחקר כמותי, הוא "אינו מהווה ייעוץ השקעות", תוצאות של בדיקות לאחור אינן מייצגות תשואות עתידיות, והוא "פרויקט קוד פתוח אישי, ולא מוצר רשמי של TickFlow". זהו הלקח המתמשך של הז'אנר כולו. מודל ה-Zero-ops מסיר את עבודת התפעול משולחן העבודה שלך. הוא מותיר את התלות בדיוק במקום שבו הייתה: אתה שוכר נתונים מחברה שמעולם לא הסכימה לתמוך בלוח זה. קובץ ה-README מגביל גם הוא את השימוש ללימוד ומחקר, בעוד שקובץ הרישיון הוא מסוג MIT.

מדוע להצמיד SHA של commit במקום מספר גרסה

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

במועד הקריאה ב-13 באוגוסט 2026, לא הופיע דבר בדף ה-GitHub Releases של המאגר. המאגר כולל שלושים ואחד תגי גרסה, מ-v0.1.31 ועד v0.1.88, עם פערים במיספור וללא הערות מצורפות. התג העדכני ביותר הצביע על commit מתאריך 31 ביולי 2026, בעוד ענף ברירת המחדל התקדם לעבודה מתאריך 6 באוגוסט 2026. תג המפגר אחרי הענף ואינו נושא הערות אינו יכול לומר לך מה אתה מקבל.

לכן, רשום את ה-SHA. ראש ענף ברירת המחדל ב-6 באוגוסט 2026 היה ecfddb451e97f6fc9a7e43ac33e4ef0e69933b33. בצע checkout לאותו commit ותעד אותו לצד כל מסקנה שתסיק מה-backtests. כעבור שישה שבועות, המשפט "הרצתי את הגרסה האחרונה" אינו מתאר דבר.

ההתחלה המתועדת מורכבת משתי שורות: העתק את קובץ הסביבה לדוגמה ל-.env, ולאחר מכן הרץ את docker compose up --build, שמפעיל את ה-panel בפורט 3018. אלו הן הוראות המתחזק ב-commit הספציפי הזה ולא נתיב שנבדק; תהליך ה-build מושך images וזקוק לגישה לרשת, דבר שדף זה לא ביצע. נתיב הפיתוח (./dev.sh, או .\dev.ps1 ב-Windows) דורש Python 3.11 או חדש יותר, Node 20 או חדש יותר, ואת מנהלי החבילות uv ו-pnpm.

מה שפיצ'ר אסטרטגיית ה-LLM שולח, ולאן

יצירת אסטרטגיה, פרשנות על מניות בודדות וכתיבת סקירות הן אופציונליות. השאירו את AI_API_KEY ריק והממשק כולו יישאר כבוי. מלאו אותו ותגדירו גם את AI_PROVIDER (נקודת קצה תואמת OpenAI, או Ollama), את AI_BASE_URL, את AI_MODEL ואת AI_DAILY_TOKEN_BUDGET, מה שיעצור קריאות ברגע שקצבת האסימונים (tokens) היומית תנוצל.

לכיוון התעבורה יש חשיבות. הפרומפט שלכם, וכל הקשר שהפאנל מצרף אליו, עוזבים את המכונה שלכם לעבר נקודת הקצה שהגדרתם. כוונו את כתובת ה-URL הבסיסית ל-API מאוחסן והבקשה תגיע לאותה חברה; כוונו אותה לסביבת הרצה ברשת הפרטית שלכם והיא תישאר בבית. אירוח עצמי של הפאנל אינו מהווה אירוח עצמי של המודל. מפתחות מאוחסנים בקובץ טקסט פשוט .env בשורש הפרויקט וניתן לערוך אותם גם מדף ההגדרות, מאחורי סיסמת לוח בקרה באורך של שישה תווים לפחות. ההערה שלנו בנושא גורמי אלפא שנוצרו על ידי LLM מכסה את המקומות שבהם אסטרטגיות שנכתבו על ידי מכונה נוטות להיכשל.

האם מודל ה-backtester משקלל עלויות מסחר?

ה-backtester מציג יכולות טיפול ב-T+1, עמלות, החלקות (slippage) ופקודות stop-loss. קיומם של מנגנונים אלו אינו מעיד על כך שהם מופעלים, ו-backtest שמבצע ביצועים (fills) במחיר הסגירה הרשמי ללא עלויות, מניח למעשה שמסחר הוא בחינם. הוא אינו כזה. נקודת בסיס (basis point) היא מאית האחוז. הלוח להלן מודד את הפער הממוצע בין ה-best bid ל-best offer, בנקודות בסיס, עבור שישה ניירות ערך הנסחרים בארה"ב במהלך שעה אחת באמצע היום ב-17 ביוני 2026.

שאילתהעלות חציית ה-spread: ממוצע ה-quoted spread, שש מניות בארה'ב, אמצע יום המסחר, 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

הנייר בעל המרווח הצר ביותר בלוח, SPY, הציג ממוצע של 0.29 נקודות בסיס במהלך אותה שעה. הנייר בעל המרווח הרחב ביותר, F, הציג 6.98 נקודות בסיס. הכפלת פער זה פעמיים, פעם אחת לכניסה ופעם אחת ליציאה, מביאה את עלות ה-round trip לכפול מהנתון המוצג, עוד לפני עמלות.

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

שאילתהטווח תנועת המחיר בדקה אחת: KO, לפי שעון ניו יורק, 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

הלוח נפתח ב-08:00, לפני תחילת המסחר הרציף, כאשר נר דקה ממוצע הציג תנועה של 0 נקודות בסיס: הדקות שבהן התבצע מסחר התרכזו במחיר בודד. הטווח האחרון, 16:30, ממוקם לאחר הנעילה ומציג ממוצע של 4.2 נקודות בסיס. ה-backtest בוחר נקודה אחת מתוך טווחים אלו ומגדיר אותה כמחיר הביצוע. יש לקרוא את העקומה ולא רק את נקודות הקצה: אותה הנחה עשויה להיות נדיבה בשעות מסוימות ומחמירה באחרות. כללי ה-A-share מוסיפים משקל משלהם, שכן הסדר ה-T+1 מונע ממניות שנרכשו היום להימכר עד יום המסחר הבא, ומגבלות מחיר יומיות עלולות למנוע יציאה מהפוזיציה כפי שתוכננה במודל. המדריך שלנו ל-backtest שניתן לשחזור מציג מה נחשב להגדרה מקובלת, ו-הטיית ה-look-ahead מפרטת דרך נוספת שבה עקומה שנראית נקייה עלולה להטעות.

מותאם או לא מותאם: שאלת המקור

פעולות תאגידיות הן המקום שבו כלי סינון עלולים להטעות בשקט. מניה שמבצעת ספליט של עשרה לאחד מציגה ירידה של תשעים אחוזים באותו יום, מבלי שאף אחד יפסיד סנט. הלוח להלן מפרט את שנים-עשר הספליטים הגדולים ביותר בבורסות ארה"ב בין ה-1 בינואר ל-13 באוגוסט 2026.

שאילתה12 פיצולי המניות (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

הגדול שבהם מכפיל מניה אחת ל-10000, בתוקף מ-Feb 10, 2026. יחסים בסדר גודל כזה אינם דומים לספליט המוכר של ארבע לאחד; הזנה של פעולות תאגידיות כוללת את כל הטווח בעמודה אחת. הקטן מבין השנים-עשר עדיין הופך מניה אחת ל-20, מספיק כדי לגרום לגרף לא מותאם להיראות כמו קריסה. כלי סינון מומנטום שקורא מחירים גולמיים יסמן כל אחד מהם כהתרסקות. הזנות נתונים מסין נושאות את אותה בעיה במינוח שלהן, ומספקות שלושה סוגים לכל סדרה: לא מותאם, מותאם קדימה ומותאם אחורה. עליך לדעת איזה מהם נטען בלוח שלך. היסטוריית מחירים מותאמת ספליט מפרטת את החישובים.

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

  • מקור הנתונים. איזה ספק, תחת איזה רישיון, והאם השירות החינמי מכסה את השימוש המתוכנן שלך.
  • ניהול מפתחות. היכן נשמרים מפתחות ה-API על הדיסק, למי יש גישה לדף ההגדרות, והאם המכונה חשופה מחוץ לרשת הפרטית שלך.
  • מודל עלויות. האם ה-backtester כולל עמלות, החלקות (slippage) וכללי שוק, ומה הערכים בשדות אלו כאשר מותירים אותם ללא שינוי.
  • נתיב העדכונים. ה-commit המדויק שהוטמע, מתועד לצד התוצאות שלך, באופן המאפשר שחזור חודשים לאחר מכן.

שאלות נפוצות

האם סביבת עבודה כמותית (quant) למניות A-share בהתקנה עצמית היא חינמית להפעלה?

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

מה המשמעות של "התקנה עצמית" בהקשר זה?

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

האם תכונת ה-LLM שולחת את הנתונים שלי לצד שלישי?

כאשר התכונה מופעלת, כן, לכל נקודת קצה (endpoint) תואמת OpenAI שתגדיר. התכונה מגיעה כשהיא כבויה: כל עוד מפתח ה-AI ריק, שום מידע אינו עוזב את המכונה.

מדוע לקבע (pin) מזהה commit SHA במקום תגית גרסה?

נכון ל-13 באוגוסט 2026, למאגר זה לא היו גרסאות מפורסמות או הערות שחרור, והתגית החדשה ביותר שלו הצביעה על קוד ישן יותר מאשר ענף ברירת המחדל. "האחרון" (Latest) במקרה זה משמעו מה שהיה בענף ביום שבו ביצעת את ה-clone, בעוד ש-commit SHA הוא מדויק. אותה משמעת נהוגה ב-חומרים כמותיים בקוד פתוח באופן כללי: קבע את הגרסה הספציפית שהרצת.

הערות אימות

כל פרטי הארכיטקטורה והקונפיגורציה לעיל נקראו מהמאגר הציבורי ב-13 באוגוסט 2026, ב-commit מספר ecfddb451e97f6fc9a7e43ac33e4ef0e69933b33, ראש ענף ברירת המחדל, מתאריך 6 באוגוסט 2026. דף ה-Releases לא הציג דבר; רשימת התגיות הכילה 31 תגיות גרסה מ-v0.1.31 ועד v0.1.88, כאשר החדשה ביותר הצביעה על commit מתאריך 31 ביולי 2026. השורות המצוטטות הן של המתחזק, והועתקו מתוך ה-README במקום לעבור ניסוח מחדש. פקודת הפעלת ה-container מצוטטת מתוך אותו README ולא בוצעה כאן.

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


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

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