根据学习结果重新修改代码

This commit is contained in:
zhangkun9038@dingtalk.com 2025-05-31 10:50:22 +00:00
parent 86bdc0077a
commit 8d19ede45d

View File

@ -46,6 +46,20 @@ class FreqaiPrimer(IStrategy):
use_dynamic_roi = True
position_adjuster = True
plot_config = {
"main_plot": {},
"subplots": {
"Signals": {
"enter_long": {"color": "green"},
"exit_long": {"color": "red"}
},
"FreqAI Predictions": {
"&-trend_strength": {"color": "blue"},
"&-volatility_forecast": {"color": "orange"},
"&-divergence_score": {"color": "purple"}
}
}
}
freqai_info = {
"model": "LightGBMMultiTargetRegressor",
@ -53,6 +67,7 @@ class FreqaiPrimer(IStrategy):
"include_timeframes": ["5m", "15m", "1h"],
"label_period_candles": 24,
"include_shifted_candles": 3,
"principal_component_analysis": True,
},
"data_split_parameters": {
"test_size": 0.2,
@ -106,16 +121,6 @@ class FreqaiPrimer(IStrategy):
"%-bb_width-period", "%-roc-period", "%-relative_volume-period", "%-close-bb_lower-period", "%-tema-period",
"%-price_trend_diff-period", "%-roc_mfi_ratio-period"
]
for col in columns_to_clean:
dataframe[col] = dataframe[col].replace([np.inf, -np.inf], 0).ffill().fillna(0)
columns_to_clean = [
"%-rsi-period", "%-mfi-period", "%-sma-period", "%-ema-period", "%-adx-period",
"bb_lowerband-period", "bb_middleband-period", "bb_upperband-period",
"%-bb_width-period", "%-roc-period", "%-relative_volume-period", "%-close-bb_lower-period", "%-tema-period",
"%-price_trend_diff-period", "%-roc_mfi_ratio-period"
]
for col in columns_to_clean:
dataframe[col] = dataframe[col].replace([np.inf, -np.inf], np.nan)
dataframe[col] = dataframe[col].ffill().fillna(0)
@ -147,7 +152,7 @@ class FreqaiPrimer(IStrategy):
dataframe["trend_change"] = dataframe["&-trend_strength"].pct_change(label_period)
dataframe["&-divergence_score"] = dataframe["price_change"] - dataframe["trend_change"]
# 👇 新增:清理所有目标列中的非有限值
# 👇 新增:清理所有目标列中的非有限值 + clip 背离评分
target_columns = [
"&-trend_strength",
"&-volatility_forecast",
@ -161,9 +166,11 @@ class FreqaiPrimer(IStrategy):
dataframe[col] = dataframe[col].replace([np.inf, -np.inf], np.nan)
dataframe[col] = dataframe[col].ffill().fillna(0)
# 对背离评分做裁剪,防止极端值干扰交易信号
dataframe["&-divergence_score"] = dataframe["&-divergence_score"].clip(-1, 1)
return dataframe
# 👇 缓存 mean/std 供后续使用
def populate_indicators(self, dataframe: DataFrame, metadata: dict) -> DataFrame:
dataframe = self.freqai.start(dataframe, metadata, self)
@ -182,17 +189,25 @@ class FreqaiPrimer(IStrategy):
return dataframe
# 👇 使用背离信号作为入场条件
def populate_entry_trend(self, df: DataFrame, metadata: dict) -> DataFrame:
conditions = []
if "&-divergence_score" in df.columns:
buy_condition = df["&-divergence_score"] > 0.01
mean_divergence = df["mean_divergence"].iloc[-1] if "mean_divergence" in df.columns else 0
std_divergence = df["std_divergence"].iloc[-1] if "std_divergence" in df.columns else 1
# 计算 Z-score
z_score_divergence = (df["&-divergence_score"] - mean_divergence) / std_divergence
# 正向背离Z-score > 1
buy_condition = z_score_divergence > 1
# 结合趋势强度过滤
if "&-trend_strength" in df.columns:
buy_condition &= df["&-trend_strength"] > 0.005
# 成交量过滤:成交量需大于 20 日均值的 1 倍
df["vol_mean"] = df["volume"].rolling(20).mean()
buy_condition &= (df["volume"] > df["vol_mean"] * 1)
@ -203,14 +218,21 @@ class FreqaiPrimer(IStrategy):
return df
# 👇 使用背离信号作为出场条件
def populate_exit_trend(self, df: DataFrame, metadata: dict) -> DataFrame:
conditions = []
if "&-divergence_score" in df.columns:
sell_condition = df["&-divergence_score"] < -0.01
mean_divergence = df["mean_divergence"].iloc[-1] if "mean_divergence" in df.columns else 0
std_divergence = df["std_divergence"].iloc[-1] if "std_divergence" in df.columns else 1
# 计算 Z-score
z_score_divergence = (df["&-divergence_score"] - mean_divergence) / std_divergence
# 负向背离Z-score < -1
sell_condition = z_score_divergence < -1
# 结合趋势强度过滤
if "&-trend_strength" in df.columns:
sell_condition &= df["&-trend_strength"] < -0.005
@ -221,7 +243,6 @@ class FreqaiPrimer(IStrategy):
return df
# 👇 自定义止损(基于波动率缩放)
def custom_stoploss(self, pair: str, trade: Trade, current_time: datetime,
current_rate: float, current_profit: float, **kwargs) -> float:
dataframe, _ = self.dp.get_analyzed_dataframe(pair, self.timeframe)
@ -233,7 +254,6 @@ class FreqaiPrimer(IStrategy):
return dynamic_stoploss
# 👇 动态调整持仓止盈
def adjust_trade_position(self, trade: Trade, current_time: datetime,
current_rate: float, current_profit: float,
min_roi: Dict[float, float], max_profit: float) -> Optional[Dict[float, float]]: