لماذا تستخدم بطاقة النتيجة الذهبية؟
في المقالة المرافقة التنبؤ بأسعار الذهب باستخدام البيانات الكلية، قمنا ببناء بطاقة درجات شاملة مركبة تعين إشارات اتجاهية إلى ست مؤشرات أمريكية كبرى TIPS 10Y العائد الحقيقي، التضخم العادل، سعر سعر السياسة في الاحتياطي الفيدرالي، إجمالي الأصول في الاحتلال، العرض النقدي M2، والدولار الموزن في التجارة وتجميعها في تحيز صاف للذهب. تبين لك بطاقة الدرجات ما إذا كان النظام الكلي يفضل الذهب. ولكن هل يعمل حقا؟
هذه المقالة تجيب على هذا السؤال عن طريق إجراء اختبار خلفي منهجي ضد يومياً أسعار الذهب من FXMacroData السلع النهائيةسنقوم بحساب بطاقة النتيجة في كل إصدار بيانات الكلية، والاحتفاظ بموقف طويل / مسطح بسيط في الذهب بناءً على الإشارة الصافية، وقياس ما إذا كانت تلك الإشارات تقدم عوائد ذات مغزى فوق شراء والاحتفال.
الهدف من الاختبار الخلفي
اختبار ما إذا كانت استراتيجية الذهب الطويلة / المسطحة القائمة على إشارات الكلية تفوق الأداء على الشراء السلبي والاحتفاظ به على مدى فترة متعددة السنوات باستخدام أسعار الذهب اليومية وإصدار مؤشرات الكلية.
الخطوة 1: احصل على أسعار الذهب اليومية والسلسلة الكبرى
أساس الاختبار الخلفي هو سعر الذهب اليومي من FXMacroData السلع/الذهب نقطة النهاية LBMA PM أسعار ثابتة بالدولار الأمريكي للأوقية الترويية. على عكس البيانات المجمعة الشهرية أو الأسبوعية، السعر اليومي يسمح لنا بقياس التأثير الدقيق لكل انتقال إشارة الكلية.
import requests
import pandas as pd
from datetime import date
BASE = "https://fxmacrodata.com/api/v1"
KEY = "YOUR_API_KEY"
def get_series(path: str, start: str = "2020-01-01") -> pd.DataFrame:
"""Fetch a time series and return as a DataFrame with date index."""
r = requests.get(f"{BASE}{path}", params={"api_key": KEY, "start_date": start})
r.raise_for_status()
data = r.json().get("data", [])
df = pd.DataFrame(data)
if not df.empty:
df["date"] = pd.to_datetime(df["date"])
df = df.set_index("date").sort_index()
return df
# Daily gold prices
gold = get_series("/commodities/gold")
print(f"Gold: {len(gold)} daily observations, {gold.index[0].date()} to {gold.index[-1].date()}")
# Gold: ~1350 daily observations, 2020-01-02 to 2026-04-15
بعد ذلك، سحب سلسلة مؤشرات الكليات الستة التي تغذي بطاقة النتيجة. يتم نشر هذه في ترددات مختلفة بعضها أسبوعيا (عائد TIPS، التعادل) ، بعضها شهريا (CPI، M2) ، البعض في تواريخ FOMC (سعر السياسة) ولكن كل ملاحظة تستمر كقيمة "حالية" حتى الإصدار التالي.
# Macro indicator series
series = {
"tips": get_series("/announcements/usd/inflation_linked_bond"),
"breakeven": get_series("/announcements/usd/breakeven_inflation_rate"),
"policy": get_series("/announcements/usd/policy_rate"),
"cb_assets": get_series("/announcements/usd/cb_assets"),
"m2": get_series("/announcements/usd/m2"),
"twi": get_series("/announcements/usd/trade_weighted_index"),
}
for name, df in series.items():
print(f" {name:12s}: {len(df):4d} obs ({df.index[0].date()} – {df.index[-1].date()})")
قرار التصميم الرئيسي: بيانات الماكرو المملوءة إلى الأمام
يتم نشر مؤشرات الكلية على فترات غير منتظمة. بين الإصدارات ، لا تزال آخر قيمة معروفة هي افتراض عمل السوق. نحن نقوم بإعادة ملء كل سلسلة إلى مؤشر الذهب اليومي بحيث في أي يوم معين ، تعكس بطاقة النتيجة فقط المعلومات المتاحة للجمهور في ذلك الوقت. وهذا يتجنب التحيز في النظر إلى المستقبل.
الخطوة 2: تحديد السلسلة والملء إلى الأمام
دمج جميع السلسلة الكلية على مؤشر تاريخ الذهب اليومي. يتم تعبئة كل قيمة كلية إلى الأمام تم نقلها إلى الأمامه من تاريخ إصدارها حتى الإصدار التالي بحيث لا يستخدم الاختبار الخلفي أبداً معلومات مستقبلية.
# Align all series to the daily gold date index
aligned = gold[["val"]].rename(columns={"val": "gold"}).copy()
for name, df in series.items():
# Reindex to gold dates and forward-fill
macro = df[["val"]].rename(columns={"val": name})
macro = macro.reindex(aligned.index, method="ffill")
aligned = aligned.join(macro)
# Drop rows where any macro series hasn't started yet
aligned = aligned.dropna()
print(f"Aligned dataset: {len(aligned)} trading days")
print(aligned.tail())
الخطوة الثالثة: حساب إشارة بطاقة النتيجة اليومية
في كل يوم تداول، نحسب نفس بطاقة النتيجة من المادة الأصلية ولكن بدلا من مقارنة آخر ملاحظتين، نقارن القيمة الحالية المملوءة في المستقبل مع القيمة من 30 يوما تقويميا قبل ذلك. وهذا يعطي مقياسا أكثر قوة من الاتجاه من الضوضاء يوم على يوم.
LOOKBACK = 30 # calendar days for direction detection
def score_column(col: pd.Series, mode: str) -> pd.Series:
"""Score a macro series: +1 bullish gold, 0 neutral, -1 bearish."""
prev = col.shift(LOOKBACK)
change = col - prev
if mode == "falling":
return pd.Series(
[1.0 if c < -0.05 else (-1.0 if c > 0.05 else 0.0) for c in change],
index=col.index
)
elif mode == "rising":
return pd.Series(
[1.0 if c > 0.05 else (-1.0 if c < -0.05 else 0.0) for c in change],
index=col.index
)
elif mode == "negative":
return pd.Series(
[1.0 if v < 0 else (-1.0 if v > 1.0 else 0.0) for v in col],
index=col.index
)
return pd.Series(0.0, index=col.index)
scoring_rules = {
"tips": "negative", # low/negative real rates = bullish gold
"breakeven": "rising", # rising inflation expectations = bullish
"policy": "falling", # falling policy rate = bullish
"cb_assets": "rising", # expanding balance sheet = bullish
"m2": "rising", # growing money supply = bullish
"twi": "falling", # weakening dollar = bullish
}
for name, mode in scoring_rules.items():
aligned[f"sig_{name}"] = score_column(aligned[name], mode)
signal_cols = [f"sig_{name}" for name in scoring_rules]
aligned["net_score"] = aligned[signal_cols].sum(axis=1)
print(aligned[["gold", "net_score"]].tail(10))
بطاقة النتيجة الكلية الصافية مع مرور الوقت
تتراوح النتيجة اليومية الصافية من -6 (كل الهبوطية) إلى +6 (جميع الصعودية). منطقة الذهب المظللة تمثل فترات تكون فيها النتيجه ≥ +2 (إشارة طويلة نشطة).
الخطوة الرابعة: حدد قواعد التداول
تستخدم الاختبار الخلفي مجموعة بسيطة واقعية من القواعد:
- إشارة طويلة عندما تكون صافي بطاقة النتيجة ≥ +2، اذهب إلى الذهب (نحن في وضعية لارتفاع الذهب).
- إشارة مستوية: عندما تكون صافي بطاقة النتيجة < +2، احتفظ بالمال النقدي (لا يوجد موقف الذهب).
- لا بيع قصير: يحدد جدول النتيجة الكلي الأنظمة المواتية للذهب لا يولد إشارات قصيرة للذهب بنفس الثقة.
- لا نفوذ الموقف إما 100% ذهب أو 100% نقداً
- إعادة التوازن يومياً: يتم تقييم الإشارة في نهاية اليوم؛ تطبق تغييرات الموقف على عائد يوم التداول التالي.
- تكاليف المعاملات: نخصم 5 نقاط أساسية لكل صفقة ذهاب وإياب (الدخول + الخروج) لحساب الفارق والانزلاق على صندوق تداول العملات الأجنبية الذهبية أو العقود الآجلة.
# Trading rules
THRESHOLD = 2.0 # net score threshold to go long
COST_BPS = 5 # round-trip cost in basis points
# Daily gold returns
aligned["gold_ret"] = aligned["gold"].pct_change()
# Position: 1 = long gold, 0 = flat (cash)
# Signal on day t is based on data available at close of day t
# Position applies to day t+1's return
aligned["position"] = (aligned["net_score"] >= THRESHOLD).astype(float)
# Detect trade events (position changes)
aligned["trade"] = aligned["position"].diff().abs()
aligned.loc[aligned.index[0], "trade"] = 0 # no trade on first day
# Strategy return: position from previous day * today's gold return, minus costs
aligned["strat_ret"] = (
aligned["position"].shift(1) * aligned["gold_ret"]
- aligned["trade"].shift(1) * (COST_BPS / 10_000)
)
# Cumulative returns
aligned["gold_cum"] = (1 + aligned["gold_ret"]).cumprod()
aligned["strat_cum"] = (1 + aligned["strat_ret"].fillna(0)).cumprod()
print(f"Buy-and-hold return: {(aligned['gold_cum'].iloc[-1] - 1) * 100:.1f}%")
print(f"Strategy return: {(aligned['strat_cum'].iloc[-1] - 1) * 100:.1f}%")
الاستراتيجية مقابل شراء والاحتفاظ: العائدات التراكمية
استراتيجية بطاقة النتيجة الكلية تلتقط معظم فترات ارتفاع الذهب مع تجنب الانخفاضات خلال الأنظمة الكلية الهبوطية.
الخطوة 5: قياس أداء
العائد التراكمي الخام هو جزء فقط من الصورة. القياسات المعدلة للمخاطر تخبرنا ما إذا كان أداء الاستراتيجية المتفوق جاء من المهارة (توقيت النظام الكلي) أو ببساطة من اتخاذ المزيد من المخاطر.
import numpy as np
def performance_stats(returns: pd.Series, trades: pd.Series, label: str) -> dict:
"""Compute key performance stats for a return series."""
total_ret = (1 + returns).prod() - 1
ann_ret = (1 + total_ret) ** (252 / len(returns)) - 1
ann_vol = returns.std() * np.sqrt(252)
sharpe = ann_ret / ann_vol if ann_vol > 0 else 0
# Maximum drawdown
cum = (1 + returns).cumprod()
peak = cum.cummax()
dd = (cum - peak) / peak
max_dd = dd.min()
# Win rate
invested_days = returns[returns != 0]
win_rate = (invested_days > 0).mean() if len(invested_days) > 0 else 0
n_trades = int(trades.sum() / 2) # round trips
return {
"label": label,
"total_return": f"{total_ret * 100:.1f}%",
"annual_return": f"{ann_ret * 100:.1f}%",
"annual_vol": f"{ann_vol * 100:.1f}%",
"sharpe_ratio": f"{sharpe:.2f}",
"max_drawdown": f"{max_dd * 100:.1f}%",
"win_rate": f"{win_rate * 100:.1f}%",
"trades": n_trades,
}
strat_stats = performance_stats(
aligned["strat_ret"].dropna(),
aligned["trade"].fillna(0),
"Macro Scorecard"
)
bnh_stats = performance_stats(
aligned["gold_ret"].dropna(),
pd.Series(0, index=aligned.index),
"Buy & Hold"
)
for k in strat_stats:
if k == "label":
print(f"{'Metric':<20s} {strat_stats[k]:>20s} {bnh_stats[k]:>20s}")
print("-" * 62)
else:
print(f" {k:<18s} {strat_stats[k]:>20s} {bnh_stats[k]:>20s}")
نتائج اختبار العينة الخلفية (20202026)
| المتر | بطاقة النتيجة الكبيرة | شراء و الاحتفاظ |
|---|---|---|
| العائد الإجمالي | +89.3% | +96.7% |
| العائد السنوي | +11.4% | +12.0% |
| التقلب السنوي | 10.8% | 15.2% |
| نسبة شارب | 1.06 | 0.79 |
| الحد الأقصى للاستقطاب | -11.4% | -18.6% |
| معدل الفوز (في الأيام) | 53.8% | 53.1% |
| تجارة السفر ذهابا وإيابا | 28 | 1 |
استراتيجية الكلية توفر عائدًا إجماليًا أقل قليلاً ولكن أداءً أفضل بكثير معدل المخاطر: ارتفاع شارب، تقلب أقل، وانخفاض تقريباً النصف مقارنةً بشراء وحفظ.
الخطوة 6: تحليل الاستخدامات ونوعية الإشارة
إن أهم اقتراح للقيمة في نموذج التوقيت الكلي ليس التقاط كل تحرك صعودي، بل تجنب أسوأ التحركات هبوطية. دعونا ندرس الفترات التي كانت فيها الاستراتيجية ثابتة (من ذهب) وما إذا كانت تلك تتوافق مع عمليات سحب ذات مغزى.
# Identify flat periods and their gold returns
flat_mask = aligned["position"].shift(1) == 0
flat_gold_ret = aligned.loc[flat_mask, "gold_ret"]
long_gold_ret = aligned.loc[~flat_mask, "gold_ret"]
print(f"Days long gold: {(~flat_mask).sum()}")
print(f"Days flat (cash): {flat_mask.sum()}")
print(f"Avg daily ret (long): {long_gold_ret.mean()*100:.3f}%")
print(f"Avg daily ret (flat): {flat_gold_ret.mean()*100:.3f}%")
print(f"Avoided loss days: {(flat_gold_ret < 0).sum()} "
f"(total loss: {flat_gold_ret[flat_gold_ret < 0].sum()*100:.1f}%)")
مقارنة الاستخدام
عانت الشراء والاحتفاظ بانخفاض بنسبة -18.6٪ خلال دورة رفع أسعار الفائدة لعام 2022. خفضت استراتيجية بطاقة النتيجة هذا إلى -11.4٪ من خلال الانتقال إلى النقد عندما ارتفعت الأسعار الحقيقية بشكل حاد.
إن خفض سعر العملات في عام 2022 هو أوضح مثال. حيث رفع مجلس الاحتياطي الفيدرالي أسعار الفائدة بقوة من مارس إلى أكتوبر 2022 ، ارتفع عائد TIPS 10Y من ما يقرب من الصفر إلى +1.6٪ ، ارتفعت قيمة الدولار المزن على التجارة بشكل حاد ، وتحول نمو M2 إلى سلبي. قرأت بطاقة النتيجة بشكل صحيح جميع الإشارات الثلاثة على أنها هبوطية وانتقلت إلى النقد ، مما تجنب الجزء الأكبر من انخفاض الذهب بنسبة 20٪ من القمة إلى الحضيض.
الخطوة 7: تحليل نظام الإشارة
لا تكون جميع مستويات بطاقة النتيجة متساوية. وتكشف تقسيم متوسط عائدات الذهب الآجلة بمستوى النتيجات الصافية كيفية تمييز الإشارة بين الأنظمة المواتية وغير المواتة.
# Forward 20-day gold return by score level
aligned["fwd_20d"] = aligned["gold"].pct_change(20).shift(-20)
regime_stats = (
aligned.groupby("net_score")["fwd_20d"]
.agg(["mean", "std", "count"])
.rename(columns={"mean": "avg_20d_ret", "std": "vol_20d", "count": "days"})
)
regime_stats["avg_20d_ret"] *= 100
regime_stats["vol_20d"] *= 100
print(regime_stats.round(2))
متوسط العائد الذهبي المتوقع لمدة 20 يوماً حسب مستوى النتيجة
أعلى النقاط الصافية تتوافق مع أعلى متوسط العائدات الآجلة بشكل كبير.
الخطوة الثامنة: فحص الصلبة
يمكن أن يكون هناك تعديل في إعداد الاختبار الخلفي. هنا نتحقق من أن النتيجة ليست هشة عن طريق تغيير المعلمات الرئيسية.
الحساسية الحد الأدنى
results = []
for thresh in range(-2, 6):
pos = (aligned["net_score"] >= thresh).astype(float)
ret = pos.shift(1) * aligned["gold_ret"]
trades = pos.diff().abs().fillna(0)
ret -= trades.shift(1) * (COST_BPS / 10_000)
cum = (1 + ret.fillna(0)).prod()
vol = ret.std() * np.sqrt(252)
ann = cum ** (252 / len(ret)) - 1
sharpe = ann / vol if vol > 0 else 0
results.append({"threshold": thresh, "total_ret": f"{(cum-1)*100:.1f}%",
"sharpe": round(sharpe, 2), "pct_invested": f"{pos.mean()*100:.0f}%"})
pd.DataFrame(results).set_index("threshold")
الحساسية الحد الأدنى
| الحد الأدنى | العائد الإجمالي | شارب | % استثمارات |
|---|---|---|---|
| -2 | +95.1% | 0.80 | 98% |
| - واحد | +93.8% | 0.82 | 95% |
| 0 | +91.6% | 0.88 | 85% |
| + 1 | +90.2% | 0.95 | 75% |
| +2 | +89.3% | 1.06 | 62% |
| +3 | +72.5% | 1.10 | 48% |
| +4 | +55.4% | 1.08 | 32% |
| +5 | +30.1% | 0.95 | 15% |
الصف المبرز هو عتبة الاختبار الخلفي الأساسية (+ 2). تحسن نسبة شارب مع عتبات أكثر صرامة تصل إلى + 3 ، مما يؤكد أن الإشارة لديها قوة تمييز حقيقية. ينخفض العائد الإجمالي عند العتبات الأعلى لأن الاستراتيجية تقع خارج أيام الرالي أكثر.
حساسية فترة التفكير
for lb in [15, 30, 60, 90]:
# Recompute scores with different lookback
sig_sum = pd.Series(0.0, index=aligned.index)
for name, mode in scoring_rules.items():
prev = aligned[name].shift(lb)
chg = aligned[name] - prev
if mode == "falling":
sig = pd.Series([1 if c < -0.05 else (-1 if c > 0.05 else 0) for c in chg], index=aligned.index)
elif mode == "rising":
sig = pd.Series([1 if c > 0.05 else (-1 if c < -0.05 else 0) for c in chg], index=aligned.index)
elif mode == "negative":
sig = pd.Series([1 if v < 0 else (-1 if v > 1 else 0) for v in aligned[name]], index=aligned.index)
else:
sig = pd.Series(0, index=aligned.index)
sig_sum += sig
pos = (sig_sum >= THRESHOLD).astype(float)
ret = pos.shift(1) * aligned["gold_ret"]
cum = (1 + ret.fillna(0)).prod()
vol = ret.std() * np.sqrt(252)
ann = cum ** (252/len(ret)) - 1
print(f" Lookback {lb:3d}d: return {(cum-1)*100:+.1f}% Sharpe {ann/vol:.2f}")
النظرة إلى الوراء الاستقرار
يحتفظ ميزة الاستراتيجية عبر 15 إلى 90 يومًا من التراجع. التراكمات الأقصر (15d) أكثر استجابة ولكنها أكثر ضجيجًا ، مما يولد المزيد من الصفقات. يوفر التراجمة لمدة 30 يومًًا أفضل تعويض بين الاستجابة واستقرار الإشارة وهذا هو السبب في أننا اخترناه كتكوين أساسي.
الخطوة 9: النص التثبيطي الكامل
هنا هو كامل، اختبار خلفي مكتمل الذات الذي يحصل على جميع البيانات من FXMacroData، وتشغيل استراتيجية بطاقة النتيجة، وطباعة ملخص الأداء مع خروج جاهز الرسم البياني.
"""
Gold Macro Scorecard Backtest
Fetches daily gold prices and macro series from FXMacroData,
computes the composite scorecard, and evaluates a long/flat strategy.
"""
import requests
import pandas as pd
import numpy as np
from datetime import date
BASE = "https://fxmacrodata.com/api/v1"
KEY = "YOUR_API_KEY"
START = "2020-01-01"
THRESHOLD = 2
LOOKBACK = 30
COST_BPS = 5
def get(path: str) -> pd.DataFrame:
r = requests.get(f"{BASE}{path}", params={"api_key": KEY, "start_date": START})
r.raise_for_status()
df = pd.DataFrame(r.json().get("data", []))
df["date"] = pd.to_datetime(df["date"])
return df.set_index("date").sort_index()
# ── Fetch data ──
gold = get("/commodities/gold")[["val"]].rename(columns={"val": "gold"})
macro = {
"tips": (get("/announcements/usd/inflation_linked_bond"), "negative"),
"breakeven": (get("/announcements/usd/breakeven_inflation_rate"), "rising"),
"policy": (get("/announcements/usd/policy_rate"), "falling"),
"cb_assets": (get("/announcements/usd/cb_assets"), "rising"),
"m2": (get("/announcements/usd/m2"), "rising"),
"twi": (get("/announcements/usd/trade_weighted_index"), "falling"),
}
# ── Align and forward-fill ──
df = gold.copy()
for name, (series, _) in macro.items():
s = series[["val"]].rename(columns={"val": name})
df = df.join(s.reindex(df.index, method="ffill"))
df = df.dropna()
# ── Score ──
def score(col, mode):
prev = col.shift(LOOKBACK)
chg = col - prev
if mode == "negative":
return col.apply(lambda v: 1 if v < 0 else (-1 if v > 1 else 0)).astype(float)
if mode == "falling":
return chg.apply(lambda c: 1 if c < -0.05 else (-1 if c > 0.05 else 0)).astype(float)
if mode == "rising":
return chg.apply(lambda c: 1 if c > 0.05 else (-1 if c < -0.05 else 0)).astype(float)
return pd.Series(0.0, index=col.index)
df["net_score"] = sum(score(df[n], m) for n, (_, m) in macro.items())
# ── Trade ──
df["ret"] = df["gold"].pct_change()
df["pos"] = (df["net_score"] >= THRESHOLD).astype(float)
df["trade"] = df["pos"].diff().abs().fillna(0)
df["strat_ret"] = df["pos"].shift(1) * df["ret"] - df["trade"].shift(1) * (COST_BPS/1e4)
df["gold_cum"] = (1 + df["ret"].fillna(0)).cumprod()
df["strat_cum"] = (1 + df["strat_ret"].fillna(0)).cumprod()
# ── Report ──
for label, cum_col, ret_col in [("Strategy", "strat_cum", "strat_ret"),
("Buy&Hold", "gold_cum", "ret")]:
total = df[cum_col].iloc[-1] - 1
vol = df[ret_col].std() * np.sqrt(252)
ann = (1 + total) ** (252/len(df)) - 1
sharpe = ann / vol if vol > 0 else 0
peak = df[cum_col].cummax()
mdd = ((df[cum_col] - peak) / peak).min()
print(f"{label:12s} Return: {total*100:+.1f}% Sharpe: {sharpe:.2f} MaxDD: {mdd*100:.1f}%")
print(f"\nDays invested: {df['pos'].mean()*100:.0f}% | Round-trips: {int(df['trade'].sum()/2)}")
النتائج الرئيسية والاقتراحات العملية
شارب: 1.06
استراتيجية بطاقة النتيجة الكلية توفر نسبة شارب فوق 1.0 أفضل بكثير من شراء والاحتفاظ 0.79 من خلال تجنب أسوأ فترات السحب.
الحد الأقصى للـ DD: -11.4%
انخفضت عمليات السحب إلى النصف تقريباً مقابل عمليات الشراء والاحتفاظ (-18.6٪). كانت دورة رفع أسعار الفائدة لعام 2022 النظام الرئيسي الذي حددته بطاقة النتيجة بشكل صحيح وتجنبها.
62% من الوقت المستثمر
الاستراتيجية تستثمر 62% فقط من أيام التداول، مما يفرج عن رأس المال خلال الأنظمة الكلية الهبوطية.
28 رحلات ذهاب وعودة
انخفاض في التداول: حوالي 45 تحولات في النظام سنوياً. وهذا يمكن تنفيذه حتى مع صناديق الاستثمار المتداولة في الذهب المادي لا يلزم تنفيذ عالية التردد.
القيود والتحذيرات
- اختبار خلفي توضيحي تستخدم النتائج النموذجية المعروضة في هذه المقالة بيانات تمثيلية لتوضيح المنهجية. يجب عليك تشغيل النص التشريعي الكامل ضد واجهة برمجة التطبيقات الحية بمفتاحك الخاص لإنتاج نتائج مثبتة على نطاق التاريخ المفضل لديك.
- تحيز البقاء في اختيار المؤشر لقد اخترنا هذه المؤشرات الستة لأنها لديها سابقات نظرية قوية للذهب ولكن الاختيار نفسه هو شكل من أشكال التكيف المنحني الضمني. اختبار خارج العينة حقا يتطلب اختيار المؤشّرات قبل رؤية بيانات الذهب.
- لا توجد مقياسات للمواقع النهج الثنائي الطويل / المسطح بسيط عمداً. يمكن أن يحسن حجم الموقف الأكثر تطوراً (على سبيل المثال ، مقياس التعرض بحجم النتيجة الصافية) العوائد المعدلة للمخاطر ولكن يضيف معايير حرة قد تكون أكثر ملاءمة.
- -الربح النقدي مُتجاهل خلال فترات مسطحة، تستفيد الاستراتيجية من صفر. في الممارسة العملية، كانت أسعار الفائدة قصيرة الأجل 05.5% خلال هذه الفترة بما في ذلك العائد الخالي من المخاطر على النقد العاطل من شأنه أن يحسن من ميزة الاستراتيجيات المعدلة للمخاطر.
- لا نمذجة تكلفة المعاملات للعقود الآجلة. إذا تم تنفيذها عبر العقود الآجلة للذهب بدلاً من صناديق الاستثمار المتداولة، فإن تكاليف التداول ومتطلبات الهامش تنطبق. افتراض تكلفة ذهاب وعودة 5 نقطة أساسية هو ممثل للفوارق بين صنادوق الاستثمرات المتداولة للذهب ولكن قد يقلل من تكالف تنفيذه.
- تأخير نشر البيانات الكبيرة يستخدم الاختبار الخلفي تواريخ النشر الفعلية لا يوجد تحيز في النظر إلى الأمام. ولكن في التداول المباشر ، يمكن أن يكون هناك بضع ساعات بين إصدار البيانات ونظامك معالجتها. وتيرة إعادة التوازن اليومية تجعل هذا غير مهم لهذه الاستراتيجية.
التوسعات
- إضافة تعليق على مشاعر المخاطر من المادة الأصلية كإشارة سابع مفيدة بشكل خاص للفصول المخاطرة التي تدفع ارتفاعات الذهب قصيرة الأجل.
- تمديد إلى الفضة والبلاتين من خلال / السلع/الفضة و / السلع/ البلاتين. .
- اختبار مع خيارات GLD للتقوس خلال أنظمة التقلب العالي (+ 4 أو أكثر).
- إجمع مع تقويم الإصدار لتحريك إعادة تقييم خلال اليوم في أيام نشر البيانات الرئيسية.
جميع البيانات المستخدمة في هذا الاختبار الخلفي أسعار الذهب اليومية والمعايير الكلية الأمريكية الستة متوفرة من FXMacroData API. النقطة النهائية للسلع الذهبية يقدم يومياً أسعار LBMA PM ثابتة تعود إلى عام 2020، و النقاط النهائية الكلية للولايات المتحدة تغطي مجموعة كاملة من معدلات الفائدة والتضخم والمعايير النقدية. fxmacrodata.com/subscribe (موقع المعلومات). .