fix: 修复 auto_trade 推理预处理逻辑,新增 create_labels 版对比测试脚本
auto_trade_polymarket.py: 新增 preprocess_for_inference 方法,推理时不调用 create_labels(避免 df[:-1] 砍掉输入K线),与 test 脚本逻辑一致。 test_dlinear_jan_2026_create_labels.py: 使用 create_labels 方式的 DLinear 测试 脚本,用于对比两种预处理方式的准确率差异。 Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
1 parent
7990312878
commit
e78836bf42
2 files changed
+343
-18
No files matched your search
+38
-18
@@ -123,24 +123,44 @@ class ClassificationPreprocessor:
|
||||
df = self.add_features(df)
|
||||
df = self.create_labels(df)
|
||||
df = df.dropna().reset_index(drop=True)
|
||||
|
||||
feature_cols = ['open', 'high', 'low', 'close', 'volume',
|
||||
|
||||
feature_cols = ['open', 'high', 'low', 'close', 'volume',
|
||||
'rsi', 'macd', 'macd_hist', 'macd_signal']
|
||||
|
||||
|
||||
if fit:
|
||||
scaled_features = self.scaler.fit_transform(df[feature_cols])
|
||||
self.is_fitted = True
|
||||
self.feature_columns = feature_cols
|
||||
else:
|
||||
scaled_features = self.scaler.transform(df[feature_cols])
|
||||
|
||||
|
||||
X, y = [], []
|
||||
for i in range(len(scaled_features) - self.lookback):
|
||||
X.append(scaled_features[i:i + self.lookback])
|
||||
y.append(df['label'].iloc[i + self.lookback])
|
||||
|
||||
|
||||
return np.array(X), np.array(y), df
|
||||
|
||||
def preprocess_for_inference(self, df: pd.DataFrame):
|
||||
"""推理专用预处理:不调用create_labels,整个df一次性处理
|
||||
|
||||
与test_dlinear_jan_2026.py逻辑一致:
|
||||
加特征 -> dropna -> scaler.transform -> 构建窗口
|
||||
"""
|
||||
df = self.add_features(df)
|
||||
df = df.dropna().reset_index(drop=True)
|
||||
|
||||
feature_cols = ['open', 'high', 'low', 'close', 'volume',
|
||||
'rsi', 'macd', 'macd_hist', 'macd_signal']
|
||||
|
||||
scaled_features = self.scaler.transform(df[feature_cols])
|
||||
|
||||
X = []
|
||||
for i in range(len(scaled_features) - self.lookback):
|
||||
X.append(scaled_features[i:i + self.lookback])
|
||||
|
||||
return np.array(X), df
|
||||
|
||||
|
||||
class PolymarketBTCTrader:
|
||||
"""Polymarket BTC Hourly交易器"""
|
||||
@@ -616,11 +636,19 @@ class PolymarketBTCTrader:
|
||||
logger.info(f" 当前K线时间: {current_time} (预测目标)")
|
||||
logger.info(f" 当前收盘价: ${current_close:,.2f} (实际结果)")
|
||||
|
||||
# 用除最后一根外的数据进行预测
|
||||
# 用除最后一根外的数据进行预测(无create_labels,与test逻辑一致)
|
||||
df_for_prediction = df.iloc[:-1]
|
||||
X, _, _ = self.preprocessor.preprocess(df_for_prediction, fit=False)
|
||||
X, processed_df = self.preprocessor.preprocess_for_inference(df_for_prediction)
|
||||
|
||||
# 打印模型输入的最后一根K线数据
|
||||
last_input_row = df_for_prediction.iloc[-1]
|
||||
logger.info(f" 📌 模型输入末根K线: {last_input_row['timestamp']} "
|
||||
f"O:{last_input_row['open']:.2f} H:{last_input_row['high']:.2f} "
|
||||
f"L:{last_input_row['low']:.2f} C:{last_input_row['close']:.2f} "
|
||||
f"V:{last_input_row['volume']:.0f}")
|
||||
|
||||
X_last = torch.FloatTensor(X[-1:]).to(self.device)
|
||||
|
||||
|
||||
with torch.no_grad():
|
||||
logits = self.model(X_last).cpu().numpy()
|
||||
prob = 1 / (1 + np.exp(-logits))
|
||||
@@ -632,14 +660,6 @@ class PolymarketBTCTrader:
|
||||
logger.info(f"🤖 DLinear预测: {direction}")
|
||||
logger.info(f" 置信度: {confidence:.2%}")
|
||||
|
||||
# 显示预测是否正确 (用于验证)
|
||||
actual_up = current_close > prev_close
|
||||
if prediction == 1:
|
||||
correct = actual_up
|
||||
else:
|
||||
correct = not actual_up
|
||||
logger.info(f" 实际涨跌: {'📈 涨' if actual_up else '📉 跌'} ({'✅ 正确' if correct else '❌ 错误'})")
|
||||
|
||||
return prediction, probability
|
||||
|
||||
def run_once(self) -> Dict:
|
||||
@@ -784,9 +804,9 @@ class PolymarketBTCTrader:
|
||||
logger.info(f" 上一K线: {prev_time} 收盘价: ${prev_close:,.2f}")
|
||||
logger.info(f" 当前K线: {current_time} 收盘价: ${current_close:,.2f}")
|
||||
|
||||
# 进行预测
|
||||
# 进行预测(无create_labels,与test逻辑一致)
|
||||
df_for_prediction = df.iloc[:-1]
|
||||
X, _, _ = self.preprocessor.preprocess(df_for_prediction, fit=False)
|
||||
X, _ = self.preprocessor.preprocess_for_inference(df_for_prediction)
|
||||
X_last = torch.FloatTensor(X[-1:]).to(self.device)
|
||||
|
||||
with torch.no_grad():
|
||||
|
||||
Reference in new issue
Block a user