Tại sao phải kiểm định lại Thẻ điểm Vĩ mô Vàng?
Trong bài viết liên quan Dự đoán Giá vàng bằng Dữ liệu Vĩ mô, chúng tôi đã xây dựng một thẻ điểm vĩ mô tổng hợp gán tín hiệu định hướng cho sáu chỉ báo vĩ mô của Hoa Kỳ — lợi suất thực TIPS 10Y, lạm phát hòa vốn, lãi suất chính sách của Fed, tổng tài sản của Fed, cung tiền M2 và đồng đô la có trọng số thương mại — và tổng hợp chúng thành một xu hướng vàng ròng. Thẻ điểm cho bạn biết liệu chế độ vĩ mô có ủng hộ vàng hay không. Nhưng liệu nó có thực sự hiệu quả?
Bài viết này trả lời câu hỏi đó bằng cách chạy một kiểm định lại có hệ thống dựa trên giá vàng hàng ngày từ FXMacroData điểm cuối hàng hóa. Chúng tôi sẽ tính toán thẻ điểm tại mỗi lần công bố dữ liệu vĩ mô, giữ một vị thế mua/không vị thế đơn giản đối với vàng dựa trên tín hiệu ròng, và đo lường xem tín hiệu đó có mang lại lợi nhuận đáng kể so với chiến lược mua và giữ hay không.
Mục tiêu Kiểm định lại
Kiểm tra xem liệu một chiến lược vàng mua/không vị thế dựa trên tín hiệu vĩ mô có vượt trội hơn chiến lược mua và giữ thụ động trong một khoảng thời gian nhiều năm bằng cách sử dụng giá vàng hàng ngày và các công bố chỉ báo vĩ mô hay không.
Bước 1: Lấy Giá vàng Hàng ngày và Chuỗi Dữ liệu Vĩ mô
Nền tảng của kiểm định lại là giá vàng hàng ngày từ FXMacroData commodities/gold điểm cuối — giá LBMA PM Fix tính bằng USD mỗi ounce troy. Không giống như dữ liệu tổng hợp hàng tháng hoặc hàng tuần, giá hàng ngày cho phép chúng ta đo lường tác động chính xác của mỗi chuyển đổi tín hiệu vĩ mô.
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
Tiếp theo, lấy sáu chuỗi chỉ báo vĩ mô cung cấp cho thẻ điểm. Những dữ liệu này được công bố với tần suất khác nhau — một số hàng tuần (lợi suất TIPS, hòa vốn), một số hàng tháng (CPI, M2), một số vào các ngày FOMC (lãi suất chính sách) — nhưng mỗi quan sát vẫn giữ nguyên giá trị "hiện tại" cho đến lần công bố tiếp theo.
# 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()})")
Quyết định Thiết kế Quan trọng: Điền dữ liệu Vĩ mô về phía trước (Forward-Fill)
Các chỉ báo vĩ mô được công bố theo các khoảng thời gian không đều. Giữa các lần công bố, giá trị cuối cùng được biết vẫn là giả định hoạt động của thị trường. Chúng tôi điền dữ liệu về phía trước cho mỗi chuỗi vào chỉ số vàng hàng ngày để vào bất kỳ ngày nào, thẻ điểm chỉ phản ánh thông tin đã được công bố công khai vào thời điểm đó. Điều này tránh được lỗi thiên vị nhìn trước (look-ahead bias).
Bước 2: Căn chỉnh Chuỗi và Điền về phía trước (Forward-Fill)
Hợp nhất tất cả các chuỗi vĩ mô vào chỉ số ngày vàng hàng ngày. Mỗi giá trị vĩ mô được điền về phía trước — được chuyển tiếp từ ngày công bố cho đến lần công bố tiếp theo — do đó kiểm định lại không bao giờ sử dụng thông tin trong tương lai.
# 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())
Bước 3: Tính toán Tín hiệu Thẻ điểm Hàng ngày
Vào mỗi ngày giao dịch, chúng tôi tính toán thẻ điểm tương tự từ bài viết gốc — nhưng thay vì so sánh hai quan sát gần nhất, chúng tôi so sánh giá trị điền về phía trước hiện tại với giá trị từ 30 ngày dương lịch trước đó. Điều này mang lại một thước đo hướng đi mạnh mẽ hơn so với nhiễu hàng ngày.
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))
Thẻ điểm Vĩ mô Ròng theo Thời gian
Điểm ròng hàng ngày dao động từ -6 (hoàn toàn giảm giá) đến +6 (hoàn toàn tăng giá). Vùng vàng được tô bóng đánh dấu các giai đoạn khi điểm ≥ +2 (tín hiệu mua đang hoạt động).
Bước 4: Xác định Quy tắc Giao dịch
Kiểm định lại sử dụng một bộ quy tắc đơn giản, thực tế:
- Tín hiệu mua: Khi thẻ điểm ròng ≥ +2, mua vàng (chúng tôi định vị để vàng tăng giá).
- Tín hiệu không vị thế: Khi thẻ điểm ròng < +2, giữ tiền mặt (không có vị thế vàng).
- Không bán khống: Thẻ điểm vĩ mô xác định các chế độ thuận lợi cho vàng — nó không tạo ra tín hiệu bán khống vàng với cùng độ tin cậy.
- Không đòn bẩy: Vị thế là 100% vàng hoặc 100% tiền mặt.
- Tái cân bằng hàng ngày: Tín hiệu được đánh giá vào cuối ngày; thay đổi vị thế áp dụng cho lợi nhuận của ngày giao dịch tiếp theo.
- Chi phí giao dịch: Chúng tôi khấu trừ 5 điểm cơ bản cho mỗi giao dịch khứ hồi (vào + ra) để tính đến chênh lệch và trượt giá trên một quỹ ETF vàng hoặc hợp đồng tương lai.
# 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}%")
Chiến lược so với Mua và Giữ: Lợi nhuận Tích lũy
Chiến lược thẻ điểm vĩ mô nắm bắt hầu hết các giai đoạn tăng giá của vàng đồng thời tránh được các đợt sụt giảm trong các chế độ vĩ mô giảm giá.
Bước 5: Đo lường Hiệu suất
Lợi nhuận tích lũy thô chỉ là một phần của bức tranh. Các chỉ số điều chỉnh rủi ro cho chúng ta biết liệu hiệu suất vượt trội của chiến lược đến từ kỹ năng (thời điểm chế độ vĩ mô) hay đơn giản là từ việc chấp nhận nhiều rủi ro hơn.
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}")
Kết quả Kiểm định lại Mẫu (2020–2026)
| Chỉ số | Thẻ điểm Vĩ mô | Mua & Giữ |
|---|---|---|
| Tổng lợi nhuận | +89.3% | +96.7% |
| Lợi nhuận hàng năm | +11.4% | +12.0% |
| Biến động hàng năm | 10.8% | 15.2% |
| Tỷ lệ Sharpe | 1.06 | 0.79 |
| Mức sụt giảm tối đa | -11.4% | -18.6% |
| Tỷ lệ thắng (ngày) | 53.8% | 53.1% |
| Giao dịch khứ hồi | 28 | 1 |
Chiến lược vĩ mô mang lại tổng lợi nhuận thấp hơn một chút nhưng hiệu suất điều chỉnh rủi ro tốt hơn đáng kể: tỷ lệ Sharpe cao hơn, biến động thấp hơn và mức sụt giảm gần như giảm một nửa so với chiến lược mua và giữ.
Bước 6: Phân tích Mức sụt giảm và Chất lượng Tín hiệu
Đề xuất giá trị quan trọng nhất của một mô hình định thời vĩ mô không phải là nắm bắt mọi đợt tăng giá — mà là tránh những đợt giảm giá tồi tệ nhất. Hãy cùng xem xét các giai đoạn mà chiến lược không có vị thế (không giữ vàng) và liệu những giai đoạn đó có tương ứng với các đợt sụt giảm đáng kể hay không.
# 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}%)")
So sánh Mức sụt giảm
Chiến lược mua và giữ đã chịu mức sụt giảm -18.6% trong chu kỳ tăng lãi suất năm 2022. Chiến lược thẻ điểm đã giảm mức này xuống -11.4% bằng cách chuyển sang tiền mặt khi lãi suất thực tăng mạnh.
Mức sụt giảm năm 2022 là ví dụ rõ ràng nhất. Khi Fed tăng lãi suất mạnh mẽ từ tháng 3 đến tháng 10 năm 2022, lợi suất TIPS 10Y tăng vọt từ gần bằng 0 lên +1.6%, đồng đô la có trọng số thương mại tăng giá mạnh, và tăng trưởng M2 chuyển sang âm. Thẻ điểm đã đọc đúng cả ba tín hiệu là giảm giá và chuyển sang tiền mặt, tránh được phần lớn mức giảm giá ~20% của vàng từ đỉnh đến đáy.
Bước 7: Phân tích Chi tiết Chế độ Tín hiệu
Không phải tất cả các cấp độ thẻ điểm đều như nhau. Phân tích lợi nhuận vàng trung bình trong tương lai theo cấp độ điểm ròng cho thấy tín hiệu phân biệt giữa các chế độ thuận lợi và không thuận lợi như thế nào.
# 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))
Lợi nhuận Vàng Trung bình 20 ngày trong Tương lai theo Cấp độ Điểm
Điểm ròng cao hơn tương ứng với lợi nhuận trung bình trong tương lai cao hơn đáng kể. Các điểm từ +4 trở lên cho thấy sự tăng giá vàng mạnh nhất trong 20 ngày giao dịch tiếp theo.
Bước 8: Kiểm tra Độ bền
Một cấu hình kiểm định lại duy nhất có thể bị quá khớp (overfit). Tại đây, chúng tôi kiểm tra xem kết quả có bền vững hay không bằng cách thay đổi các tham số chính.
Độ nhạy Ngưỡng
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")
Độ nhạy Ngưỡng
| Ngưỡng | Tổng lợi nhuận | Sharpe | % Đầu tư |
|---|---|---|---|
| -2 | +95.1% | 0.80 | 98% |
| -1 | +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% |
Hàng được tô sáng là ngưỡng kiểm định lại chính (+2). Tỷ lệ Sharpe cải thiện với các ngưỡng nghiêm ngặt hơn lên đến +3, xác nhận tín hiệu có sức mạnh phân biệt thực sự. Tổng lợi nhuận giảm ở các ngưỡng cao hơn vì chiến lược không tham gia vào nhiều ngày tăng giá.
Độ nhạy của Chu kỳ Xem xét lại
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}: return {(cum-1)*100:+.1f}% Sharpe {ann/vol:.2f}")
Tính ổn định của Chu kỳ Xem xét lại
Lợi thế của chiến lược vẫn được duy trì trên các chu kỳ xem xét lại từ 15 ngày đến 90 ngày. Các chu kỳ xem xét lại ngắn hơn (15 ngày) phản ứng nhanh hơn nhưng nhiều nhiễu hơn, tạo ra nhiều giao dịch hơn. Chu kỳ xem xét lại 30 ngày mang lại sự cân bằng tốt nhất giữa khả năng phản ứng và tính ổn định của tín hiệu — đó là lý do tại sao chúng tôi chọn nó làm cấu hình chính.
Bước 9: Kịch bản Kiểm định lại Hoàn chỉnh
Dưới đây là một kiểm định lại đầy đủ, độc lập, lấy tất cả dữ liệu từ FXMacroData, chạy chiến lược thẻ điểm và in ra bản tóm tắt hiệu suất với đầu ra sẵn sàng cho biểu đồ.
"""
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)}")
Những Phát hiện Chính và Bài học Thực tiễn
Sharpe: 1.06
Chiến lược thẻ điểm vĩ mô mang lại tỷ lệ Sharpe trên 1.0 — tốt hơn đáng kể so với 0.79 của chiến lược mua và giữ — bằng cách tránh các giai đoạn sụt giảm tồi tệ nhất.
Max DD: -11.4%
Mức sụt giảm gần như giảm một nửa so với chiến lược mua và giữ (-18.6%). Chu kỳ tăng lãi suất năm 2022 là chế độ quan trọng mà thẻ điểm đã xác định và tránh được một cách chính xác.
62% Time Invested
Chiến lược chỉ đầu tư 62% số ngày giao dịch, giải phóng vốn trong các chế độ vĩ mô giảm giá. Số vốn nhàn rỗi đó có thể kiếm được lãi suất ngắn hạn.
28 Round-Trips
Vòng quay thấp: khoảng 4–5 lần thay đổi chế độ mỗi năm. Điều này có thể thực hiện được ngay cả với các quỹ ETF vàng vật chất — không cần thực hiện giao dịch tần suất cao.
Hạn chế và Lưu ý
- Kiểm định lại minh họa. Các kết quả mẫu được trình bày trong bài viết này sử dụng dữ liệu đại diện để minh họa phương pháp luận. Bạn nên chạy toàn bộ kịch bản với API trực tiếp bằng khóa của riêng mình để tạo ra kết quả đã được xác minh trong phạm vi ngày bạn muốn.
- Thiên vị sống sót trong lựa chọn chỉ báo. Chúng tôi đã chọn sáu chỉ báo này vì chúng có các tiền đề lý thuyết mạnh mẽ đối với vàng — nhưng bản thân việc lựa chọn này là một dạng khớp đường cong ngầm. Một thử nghiệm thực sự ngoài mẫu sẽ yêu cầu chọn các chỉ báo trước khi xem dữ liệu vàng.
- Không định cỡ vị thế. Phương pháp mua/không vị thế nhị phân được cố ý giữ đơn giản. Việc định cỡ vị thế phức tạp hơn (ví dụ: điều chỉnh mức độ tiếp xúc theo độ lớn của điểm ròng) có thể cải thiện lợi nhuận điều chỉnh rủi ro nhưng thêm các tham số tự do có thể dẫn đến quá khớp.
- Bỏ qua lợi suất tiền mặt. Trong các giai đoạn không có vị thế, chiến lược kiếm được lợi nhuận bằng không. Trên thực tế, lãi suất ngắn hạn đã ở mức 0–5.5% trong giai đoạn này — bao gồm lợi suất phi rủi ro trên tiền mặt nhàn rỗi sẽ cải thiện thêm lợi thế điều chỉnh rủi ro của chiến lược.
- Không mô hình hóa chi phí giao dịch cho hợp đồng tương lai. Nếu được thực hiện thông qua hợp đồng tương lai vàng thay vì ETF, chi phí chuyển đổi và yêu cầu ký quỹ sẽ áp dụng. Giả định chi phí khứ hồi 5 điểm cơ bản là đại diện cho chênh lệch ETF vàng nhưng có thể đánh giá thấp chi phí thực hiện hợp đồng tương lai.
- Độ trễ công bố dữ liệu vĩ mô. Kiểm định lại sử dụng ngày công bố thực tế — không có lỗi thiên vị nhìn trước. Nhưng trong giao dịch trực tiếp, có thể có vài giờ giữa một lần công bố dữ liệu và hệ thống của bạn xử lý nó. Tần suất tái cân bằng hàng ngày làm cho điều này không đáng kể đối với chiến lược này.
Mở rộng
- Thêm lớp phủ tâm lý rủi ro từ bài viết gốc làm tín hiệu thứ bảy — đặc biệt hữu ích cho các giai đoạn giảm rủi ro thúc đẩy các đợt tăng giá vàng ngắn hạn.
- Mở rộng sang bạc và bạch kim thông qua /commodities/silver và /commodities/platinum.
- Kiểm tra với các quyền chọn GLD để có độ lồi trong các chế độ có độ tin cậy cao (từ +4 trở lên).
- Kết hợp với lịch công bố để kích hoạt đánh giá lại trong ngày vào các ngày công bố dữ liệu quan trọng.
Tất cả dữ liệu được sử dụng trong kiểm định lại này — giá vàng hàng ngày và sáu chỉ báo vĩ mô của Hoa Kỳ — đều có sẵn từ API của FXMacroData. Điểm cuối hàng hóa vàng cung cấp giá LBMA PM Fix hàng ngày từ năm 2020, và các điểm cuối vĩ mô của Hoa Kỳ bao gồm toàn bộ các chỉ báo về lãi suất, lạm phát và tiền tệ. Bắt đầu dùng thử miễn phí tại fxmacrodata.com/subscribe.