原先的策略不太嚴謹所以,增加了一些判斷標準,例如:
RSI 在 50 以上且模型預測漲 → 做多
RSI 在 50 以下且模型預測跌 → 做空
MACD 趨勢方向:僅當 MACD 與 Signal 線方向一致時才進場。
MA 趨勢:僅當價格在 MA20 或 MA50 之上(上漲趨勢)才考慮做多。
又再增加了止損/止盈規則例如:
止損 1%
止盈 2%
動態止損:依 ATR 設定止損距離(例如 ATR × 1.5)
def backtest_strategy(df, y_true, y_pred, test_index, initial_capital=10000,
position_size=0.1, atr_multiplier=1.5, take_profit_ratio=0.02):
"""
改進版回測:
1. RSI 濾波
2. ATR 動態止損
3. 固定止盈比例
4. 倉位管理
"""
df_test = df.iloc[test_index].copy()
df_test['True'] = y_true
df_test['Pred'] = y_pred
capital = initial_capital
equity_curve = [capital]
for i in range(1, len(df_test)):
price_prev = df_test['close'].iloc[i-1]
price_now = df_test['close'].iloc[i]
# 計算真實報酬率
ret = (price_now / price_prev) - 1
# 進場條件:RSI 濾波
rsi = df_test['RSI'].iloc[i]
pred = df_test['Pred'].iloc[i-1]
atr = df_test['ATR'].iloc[i]
enter_trade = False
if pred == 1 and rsi > 50: # 預測漲且 RSI 支持上漲
enter_trade = True
direction = 1
elif pred == 0 and rsi < 50: # 預測跌且 RSI 支持下跌
enter_trade = True
direction = -1
if enter_trade:
position_capital = capital * position_size
stop_loss = atr * atr_multiplier
take_profit = take_profit_ratio * price_now
# 模擬止損 / 止盈
if direction == 1: # 多單
if ret <= -stop_loss / price_now:
ret = -stop_loss / price_now
elif ret >= take_profit_ratio:
ret = take_profit_ratio
else: # 空單
if ret >= stop_loss / price_now:
ret = -stop_loss / price_now
elif ret <= -take_profit_ratio:
ret = take_profit_ratio
strategy_ret = direction * ret
capital += capital * position_size * strategy_ret
equity_curve.append(capital)
df_test['Equity'] = equity_curve
# 畫資金曲線
plt.figure(figsize=(12,6))
plt.plot(df_test['timestamp'], df_test['Equity'], label="Equity Curve", color="blue")
plt.axhline(initial_capital, linestyle="--", color="gray", alpha=0.7)
plt.title("Backtest Equity Curve (改進版策略)")
plt.xlabel("Time")
plt.ylabel("Capital")
plt.legend()
plt.xticks(rotation=45)
plt.show()
total_return = (capital / initial_capital - 1) * 100
print(f"💰 最終資金: {capital:.2f} USDT")
print(f"📈 總報酬率: {total_return:.2f}%")
return df_test