Tutorial/التنبؤ بأسعار الصرف
Tutorial

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

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

MMexchangerate.dev·Jul 6, 2026·7 دقائق قراءة

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

Key points
المعيار المرجعي الذي يجب على أي تنبؤ فوركس أن يتخطاه هو المشي العشوائي: سعر الغد يساوي سعر اليوم. في الأزواج الرئيسية اليومية، من الصعب جدًا التفوق عليه.
يمكنك تشغيل الاختبار كاملًا على الخطة المجانية: اجلب السلسلة، ابنِ معيار عدم التغيير، وقيّم بواسطة 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. الخطة المجانية لا تحتاج مفتاحًا للبدء.

python — fetch a daily seriescopy
import requests, numpy as np, pandas as pd

def fetch_range(base, symbol, start, end, key=None):
    rows, cursor = [], None
    headers = {"Authorization": f"Bearer {key}"} if key else {}
    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")

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

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

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

python — features and a Ridge modelcopy
from sklearn.linear_model import Ridge

fx["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-Westcopy
from scipy import stats
r2 = 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 نادرًا ما تتخطى الدلالة الإحصائية، والخلايا التي تقترب منها تتحرك عندما تُعدّل التقسيم أو الأخطاء المعيارية. ارفع عدد الخصائص لإضافة "تعقيد" ولن يزداد الأداء خارج العينة إلا سوءًا. أنت تشاهد الإفراط في الملاءمة يحدث في الزمن الحقيقي. لقد شغّلنا الاختبار الكامل على خمسة أزواج ونشرنا كل رقم.

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

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

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

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

MM
exchangerate.dev
أدلة بيانات الفوركس للمطورين الذين يبنون باستخدام أسعار إرشادية.

Keep reading

Blogحاولنا التفوق على المشي العشوائي في خمسة أزواجRead Guideهل يمكنك التنبؤ بأسعار الصرف؟ جدار الأربعين عامًاRead Guideتعبئة أسعار الصرف دون تحيز التطلع الأماميRead