الأدلةدروس

هل يمكنك التفوق على المشي العشوائي في التنبؤ بأسعار الصرف؟ جرّب الاختبار في 30 سطرًا

النتيجة الكلاسيكية تقول إن تنبؤ "بلا تغيير" يتفوق على أي نموذج خارج العينة. إليك الكود لتختبر ذلك بنفسك، مقابل أسعار يومية حية.

6 يوليو 2026 · 7 دقائق قراءة

المعيار المرجعي الذي يجب على أي تنبؤ بسعر الصرف أن يتخطاه هو المشي العشوائي: التنبؤ الذي لا يفعل شيئًا، أي أن سعر الغد يساوي سعر اليوم. منذ Meese و Rogoff (1983) لم يتفوق عليه شيء تقريبًا في الآفاق القصيرة، وورقة بحثية من الاحتياطي الفيدرالي عام 2025 أعادت تأكيد ذلك لتعلّم الآلة الحديث. هذا هو الرفيق العملي لـجدار الأربعين عامًا: نحو 30 سطرًا من بايثون تجلب البيانات، وتبني المعيار المرجعي، وتقيّم نموذجًا بأمانة.

  • المعيار المرجعي الذي يجب على أي تنبؤ فوركس أن يتخطاه هو المشي العشوائي: سعر الغد يساوي سعر اليوم. في الأزواج الرئيسية اليومية، من الصعب جدًا التفوق عليه.
  • يمكنك تشغيل الاختبار كاملًا على Plus أو Pro: اجلب السلسلة، ابنِ معيار عدم التغيير، وقيّم بواسطة R² خارج العينة إضافة إلى اختبار Clark-West.
  • تخلَّص من صفوف نهايات الأسبوع والعطلات المعبأة للأمام (علامة is_forward_filled) وإلا فإن نموذجك سيتعلّم بصمت من أيام أحد ثابتة.
  • زيادة تعقيد النموذج تجعل الدقة خارج العينة أسوأ، لا أفضل. أنت تشاهد الإفراط في الملاءمة يحدث في الزمن الحقيقي.
  • المقالة المرافقة تُشغّل هذا على خمسة أزواج عملات وتُظهر كيف يمكن لبضعة خيارات قابلة للدفاع أن تصنع بسهولة ميزة "ذات دلالة إحصائية".

المعيار المرجعي: "الغد يساوي اليوم"

في عام 1983، أظهر Meese و Rogoff أنه لا يوجد نموذج اقتصادي كلي يمكنه التفوق في التنبؤ على نموذج يقول إن سعر الصرف غدًا سيكون كما هو اليوم. فروق أسعار الفائدة، عرض النقود، تعادل القوة الشرائية: لم يساعد أي منها. ذلك "النموذج" هو المشي العشوائي، وأربعون عامًا من الاقتصاد المتزايد الذكاء ارتدت في معظمها عنه. نشرح السبب في هل يمكنك التنبؤ بأسعار الصرف؟ هذا الدليل هو النصف العملي: الكود لتتحقق من الادعاء بنفسك.

في سبتمبر 2025، أخضع اقتصادي في الاحتياطي الفيدرالي تعلّم الآلة الحديث لنفس الاختبار. الورقة البحثية، *Virtue or Mirage? Complexity in Exchange Rate Prediction* (Rehim Kılıç، FEDS 2025-089)، وضعت انحدار Ridge على Random Fourier Features في مواجهة المشي العشوائي، وحُكم عليها بواسطة R² خارج العينة واختباري Clark-West و Diebold-Mariano. كان الحكم حذرًا: التعقيد أعطى "مكاسب متواضعة وموضعية فقط" كانت "هشة ونادرًا ما تكون ذات دلالة إحصائية"، ولم يتحول أبدًا إلى ميزة منهجية على المشي العشوائي.

ما يمكننا وما لا يمكننا إعادة إنتاجه

تستخدم الورقة البحثية أساسيات اقتصاد كلي شهرية لا تقدمها واجهة برمجة تطبيقات لأسعار الصرف، لذا لا يمكننا استنساخها تمامًا. لكن يمكننا اختبار السؤال الجوهري، ذلك الذي يصطدم به معظم المطورين فعليًا: باستخدام تاريخ الأسعار فقط، هل يمكن لنموذج مدرَّب أن يتفوق على "الغد يساوي اليوم"؟

اجلب البيانات

خمس سنوات من EUR/USD اليومي عبر /v1/range بمفتاح Plus أو Pro.

python, fetch a daily series
import requests, numpy as np, pandas as pddef fetch_range(base, symbol, start, end, key):    rows, cursor = [], None    headers = {"Authorization": f"Bearer {key}"}    while True:        p = {"base": base, "symbols": symbol, "start_date": start, "end_date": end}        if cursor: p["cursor"] = cursor        d = requests.get("https://api.exchangerate.dev/v1/range",                         params=p, headers=headers, timeout=30).json()        rows += [{"date": r["date"], "rate": r["rates"][symbol]} for r in d["data"]]        if not d.get("has_more"): break        cursor = d["next_cursor"]    df = pd.DataFrame(rows).drop_duplicates("date")    df["date"] = pd.to_datetime(df["date"])    return df.sort_values("date").set_index("date")fx = fetch_range("EUR", "USD", "2021-01-01", "2026-01-01", "YOUR_API_KEY")

شيء يستحق القيام به بشكل صحيح: كل صف يحمل علامة is_forward_filled وحقل source. عطلات نهاية الأسبوع والأعياد معبأة للأمام، لذا فإن أي دراسة جادة تتخلص من تلك الصفوف. لا تريد أن "يتعلّم" نموذجك من يوم أحد ثابت، وهي نسخة صغيرة من فخاخ التطلع الأمامي المذكورة في تعبئة البيانات دون تحيز التطلع الأمامي.

ابنِ المعيار المرجعي والمنافس

المشي العشوائي يتنبأ بعائد صفري كل يوم (المارتينجيل عديم الانجراف الذي استخدمه Meese و Rogoff). امنح المنافس كل ميزة رخيصة يمكن استخلاصها من سلسلة الأسعار وحدها، الزخم، العودة إلى المتوسط، التقلب المحقق، ودع Ridge (المُقدِّر الخاص بالورقة البحثية نفسها) يتنبأ بعائد الغد.

python, features and a Ridge model
from sklearn.linear_model import Ridgefx["ret"] = np.log(fx["rate"]).diff()f = pd.DataFrame(index=fx.index)for lag in (1, 2, 3, 5, 10): f[f"lag{lag}"] = fx["ret"].shift(lag)f["mom5"], f["mom20"] = fx["ret"].rolling(5).sum().shift(1), fx["ret"].rolling(20).sum().shift(1)f["vol10"], f["y"] = fx["ret"].rolling(10).std().shift(1), fx["ret"]f = f.dropna()split = int(len(f) * 0.7)X = [c for c in f.columns if c != "y"]m = Ridge(alpha=1.0).fit(f.iloc[:split][X], f.iloc[:split]["y"])pred, y = m.predict(f.iloc[split:][X]), f.iloc[split:]["y"].values

قيّمه بأمانة

R² خارج العينة مقابل المشي العشوائي (موجب يعني أنك فزت)، بالإضافة إلى اختبار Clark-West، وهو المناسب عندما يكون المشي العشوائي متضمَّنًا داخل نموذجك.

python, out-of-sample R² and Clark-West
from scipy import statsr2 = 1 - np.sum((y - pred)**2) / np.sum(y**2)f_hat = y**2 - ((y - pred)**2 - pred**2)t = f_hat.mean() / (f_hat.std(ddof=1) / np.sqrt(len(f_hat)))print(f"OOS R2 {r2:+.4%} | Clark-West t {t:+.2f} p {1-stats.norm.cdf(t):.3f}")

شغّله على EUR/USD وGBP/USD وUSD/JPY وبضع نوافذ. النمط عنيد. R² خارج العينة يستقر عند الصفر أو أقل منه، من شبه مستوٍ إلى سالب ببضع نقاط مئوية، ما يعني أن النموذج المدرَّب أدى عادة أسوأ من افتراض عدم وجود أي تغيير على الإطلاق. إحصائية Clark-West نادرًا ما تتخطى الدلالة الإحصائية، والخلايا التي تقترب منها تتحرك عندما تُعدّل التقسيم أو الأخطاء المعيارية. ارفع عدد الخصائص لإضافة "تعقيد" ولن يزداد الأداء خارج العينة إلا سوءًا. أنت تشاهد الإفراط في الملاءمة يحدث في الزمن الحقيقي. لقد شغّلنا الاختبار الكامل على خمسة أزواج ونشرنا كل رقم.

لماذا يهم هذا إذا كنت تبني منتجًا

إذا أطلقت خاصية "السعر المتوقع"، فإن المعيار المرجعي الذي يجب عليك التفوق عليه هو إعادة سعر اليوم، وفي بيانات الأزواج الرئيسية اليومية، من الصعب جدًا التفوق على هذا المعيار المرجعي. نقطة نهاية تنبؤ تؤدي أداءً أسوأ بصمت هي رقم خاطئ بثقة يجلس في مسار الدفع لشخص ما أو في لوحة معلومات خزينة.

القيمة القابلة للدفاع موجودة في مكان آخر. قدّم المستوى بدقة وسرعة، لأن أفضل تنبؤ نقطي للسعر القادم هو فعليًا السعر الحالي. قِس عدم اليقين بدلًا من التنبؤ بنقطة واحدة: التقلب ونطاقات الثقة مفيدة حقًا ولا تتطلب التفوق على المشي العشوائي. وكن صادقًا بشأن الأفق الزمني، لأن قابلية التنبؤ شبه معدومة يومًا بيوم ولا تزيد إلا تدريجيًا على مدى أشهر، وهو المكان الذي تجد فيه الأدبيات العلمية القليل من الميزة الموجودة.

ذلك الخط المستوي للمشي العشوائي هو معلومة بحد ذاته. إنه السوق يقول إن سعر اليوم يحمل بالفعل معظم ما يمكن معرفته عن سعر الغد. بالنسبة لمزود بيانات، الخطوة الرابحة هي نشر ذلك السعر بدقة أكبر وسرعة أكبر من أي أحد، وأن يكون صريحًا بشأن حدود التنبؤ.

أسئلة

ما هو معيار المشي العشوائي المرجعي في التنبؤ بأسعار الصرف؟

هو أبسط تنبؤ ممكن: سعر الصرف غدًا يساوي سعر اليوم، بلا معاملات وبلا أساسيات. ولأنه من الصعب جدًا التفوق عليه خارج العينة، فهو المعيار المرجعي القياسي الذي يجب أن يُقاس مقابله أي ادعاء تنبؤ جاد.

هل يمكن لتعلّم الآلة أن يتفوق على المشي العشوائي في العملات؟

ليس بشكل منهجي في الآفاق القصيرة. وجدت ورقة بحثية من الاحتياطي الفيدرالي عام 2025 أن الميزة الظاهرة للنماذج المعقدة هي "سراب" يتلاشى مع اتساع نافذة الاختبار، وفي اختبار بسيط قائم على السعر فقط يمكنك إعادة إنتاجه، إضافة الخصائص تجعل الدقة خارج العينة أسوأ لا أفضل.

كيف أختبر تنبؤ فوركس مقابل مشي عشوائي في بايثون؟

اجلب سلسلة يومية (على سبيل المثال من نقطة النهاية /v1/range الخاصة بـ exchangerate.dev)، قسّمها زمنيًا بحيث لا يرى النموذج أبدًا نافذة الاختبار، تنبأ بالعائد التالي، ثم قيّم باستخدام R² خارج العينة مقابل مشي عشوائي بعائد صفري واختبار دلالة Clark-West. الكود الكامل موجود في هذا الدليل.

لماذا نتخلص من الصفوف المعبأة للأمام قبل الاختبار الرجعي؟

أسعار عطلات نهاية الأسبوع والأعياد معبأة للأمام من آخر يوم تداول. تركها يغذي نموذجك بقيم ثابتة ومكررة لم يكن ليتداول عليها أبدًا، ما يضخّم الدقة الظاهرة. كل استجابة من الـ API تُعلّم هذه الصفوف بـ is_forward_filled حتى تتمكن من استبعادها.

تابع القراءة

ابدأ بمفتاح API مجاني

5,000 طلب شهريًا ضمن الخطة المجانية. لا حاجة إلى بطاقة ائتمان.

احصل على مفتاح مجاني