כל המאמרים
מסחר אלגוריתמיMean Reversionאסטרטגיותמדריך
·נכתב על ידי עדן מרגוליס

Mean Reversion — מתי האסטרטגיה עובדת ומתי לא

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

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


מתי Mean Reversion עובדת

Mean Reversion מתפקדת היטב בשוק צדדי (Range-bound) — כשהמחיר מתנדנד סביב טווח יציב בלי כיוון ברור לטווח ארוך. בתנאים כאלה, סטייה חדה מהממוצע היא לרוב "רעש" זמני שחוזר במהירות יחסית.

מדוע Mean Reversion נכשלת בטרנד חזק

הסיכון המרכזי: בשוק עם טרנד ברור וחזק (עולה או יורד), מחיר שסוטה מהממוצע לא בהכרח "חוזר" — הוא ממשיך באותו כיוון, כי הטרנד עצמו הוא הכוח הדומיננטי, לא סטייה זמנית. זו הסיבה שאסטרטגיית Mean Reversion שנבדקה רק בשוק צדדי יכולה להיכשל קשות ברגע שהשוק נכנס לטרנד — היא ממשיכה "לקנות ירידות" בדיוק כשהמחיר ממשיך לרדת.

זיהוי הזדמנות עם Z-Score

הכלי הסטטיסטי הנפוץ ביותר למדידת סטייה מהממוצע:

import yfinance as yf
import numpy as np

df = yf.download("AAPL", period="1y", interval="1d")

df["ma20"] = df["Close"].rolling(20).mean()
df["std20"] = df["Close"].rolling(20).std()
df["z_score"] = (df["Close"] - df["ma20"]) / df["std20"]

# איתות קנייה: מחיר סטה 2+ סטיות תקן מתחת לממוצע
buy_signal = df["z_score"].shift(1) < -2.0
# איתות מכירה/יציאה: המחיר חזר לממוצע
exit_signal = df["z_score"].shift(1) >= 0

Z-Score של -2 אומר שהמחיר הנוכחי נמוך ב-2 סטיות תקן מהממוצע הנע — סטייה סטטיסטית משמעותית שברוב המצבים (בהנחת התפלגות נורמלית בקירוב) נחשבת חריגה.

סינון טרנד — הצעד שמונע את רוב הכשלים

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

df["ma200"] = df["Close"].rolling(200).mean()
df["trend_strength"] = abs(df["ma20"] - df["ma200"]) / df["ma200"]

is_ranging = df["trend_strength"].shift(1) < 0.05  # פחות מ-5% הפרש בין ממוצעים = שוק צדדי יחסית
final_signal = buy_signal & is_ranging

ניהול סיכונים ב-Mean Reversion

מכיוון שהסיכון המרכזי הוא "לקנות ירידה שממשיכה לרדת", Stop Loss הוא קריטי במיוחד — יותר מבאסטרטגיית מומנטום, כי אין שום אישור שהטרנד לא ימשיך נגדכם. רבים מהבוטים המבוססים על Mean Reversion משתמשים ב-Stop Loss רחב יחסית (כדי לא לצאת מ"רעש" רגיל), בשילוב עם Position Sizing שמרני שמפצה על הסיכון הגבוה יותר.

שאלות נפוצות

איך יודעים אם השוק "צדדי" מספיק ל-Mean Reversion?

מדד נפוץ: השוואה בין ממוצע נע קצר לממוצע נע ארוך — הפרש קטן מעיד על שוק ללא טרנד ברור. מדדים נוספים כמו ADX (Average Directional Index) מיועדים ספציפית למדידת עוצמת טרנד.

מה ה-Z-Score הנכון לזיהוי הזדמנות?

נפוץ להשתמש בסף של 2 סטיות תקן, אבל זה תלוי באסטרטגיה הספציפית ובנכס. סף גבוה יותר (2.5-3) נותן פחות איתותים אך באמינות גבוהה יותר; סף נמוך יותר נותן יותר איתותים עם רעש רב יותר.

האם Mean Reversion ו-Momentum יכולים לפעול יחד בפורטפוליו?

כן, זו גישה נפוצה — שילוב שתי האסטרטגיות יכול לאזן ביניהן, כי הן נוטות לעבוד טוב בתנאי שוק משלימים (Momentum בטרנד, Mean Reversion בשוק צדדי). זה דורש ניהול סיכונים כולל שלוקח בחשבון את שתי האסטרטגיות יחד, לא רק כל אחת בנפרד.

מה ההבדל בין Mean Reversion ל-RSI Oversold/Overbought?

Mean Reversion היא הגישה הכללית (חזרה לממוצע). RSI הוא אחד הכלים הספציפיים למדידתה — ראו מדריך RSI ו-MACD להסבר המלא על האינדיקטור.

רוצה לבנות בוט כזה בעצמך?

שיחה קצרה של 20 דקות.

דברו איתנו חינם