散户生存之道;鼓励入场,惩罚长时间持有
This commit is contained in:
parent
77919d9ea9
commit
40c03d39f8
@ -45,7 +45,7 @@
|
||||
"rateLimit": 3000,
|
||||
"timeout": 20000
|
||||
},
|
||||
"pair_whitelist": ["BTC/USDT", "TON/USDT", "DOT/USDT", "XRP/USDT", "OKB/USDT", "SOL/USDT", "DOGE/USDT", "WCT/USDT", "TRUMP/USDT", "SUI/USDT", "PEPE/USDT", "TRB/USDT", "MASK/USDT", "UNI/USDT", "KAITO/USDT"],
|
||||
"pair_whitelist": ["BTC/USDT", "TRUMP/USDT", "PEPE/USDT", "KAITO/USDT", "DOGE/USDT", "WCT/USDT"],
|
||||
"pair_blacklist": ["DORA/USDT"]
|
||||
},
|
||||
"entry_pricing": {
|
||||
@ -75,15 +75,16 @@
|
||||
},
|
||||
"freqaimodel": "MyCoolRLModel",
|
||||
"purge_old_models": 2,
|
||||
"train_period_days": 12,
|
||||
"backtest_period_days": 2,
|
||||
"live_retrain_hours": 2,
|
||||
"train_period_days": 30,
|
||||
"backtest_period_days": 7,
|
||||
"identifier": "rl-memo",
|
||||
"live_retrain_hours": 6,
|
||||
"continual_learning": false,
|
||||
"rl_config": {
|
||||
"train_cycles": 50,
|
||||
"train_cycles": 25,
|
||||
"add_state_info": false,
|
||||
"max_trade_duration_candles": 300,
|
||||
"max_training_drawdown_pct": 0.02,
|
||||
"max_training_drawdown_pct": 0.05,
|
||||
"cpu_count": 16,
|
||||
"model_type": "PPO",
|
||||
"policy_type": "MlpPolicy",
|
||||
@ -102,24 +103,21 @@
|
||||
"feature_parameters": {
|
||||
"include_timeframes": [
|
||||
"3m",
|
||||
"15m",
|
||||
"1h"
|
||||
"15m"
|
||||
],
|
||||
"include_corr_pairlist": [
|
||||
"BTC/USDT",
|
||||
"SOL/USDT"
|
||||
"BTC/USDT"
|
||||
],
|
||||
"outlier_protection_percentage": 0.1,
|
||||
"label_period_candles": 100,
|
||||
"include_shifted_candles": 3,
|
||||
"include_shifted_candles": 1,
|
||||
"DI_threshold": 0.5,
|
||||
"weight_factor": 0.9,
|
||||
"principal_component_analysis": false,
|
||||
"use_SVM_to_remove_outliers": true,
|
||||
"use_SVM_to_remove_outliers": false,
|
||||
"indicator_periods_candles": [
|
||||
10,
|
||||
20,
|
||||
50
|
||||
20
|
||||
],
|
||||
"plot_feature_importances": 10
|
||||
},
|
||||
@ -128,6 +126,10 @@
|
||||
"shuffle": false
|
||||
},
|
||||
"model_training_parameters": {
|
||||
"n_steps": 2048,
|
||||
"batch_size": 64,
|
||||
"ent_coef": 0.01,
|
||||
"learning_rate": 0.0003,
|
||||
"verbose": 1
|
||||
}
|
||||
},
|
||||
|
||||
@ -135,8 +135,8 @@ if [ -n "$PAIR_REMOTE_LIST_URL" ]; then
|
||||
PAIRS_FLAG="--pairs $PAIRS_ARG"
|
||||
echo "Using pairs from --pairs parameter: $PAIRS_ARG"
|
||||
else
|
||||
# 使用默认的交易对列表
|
||||
DEFAULT_PAIRS="BTC/USDT TON/USDT DOT/USDT XRP/USDT OKB/USDT SOL/USDT WCT/USDT TRUMP/USDT SUI/USDT PEPE/USDT TRB/USDT MASK/USDT UNI/USDT KAITO/USDT XAUT/USDT"
|
||||
# 使用默认的交易对列表 - 只保留Meme类币对
|
||||
DEFAULT_PAIRS="BTC/USDT TRUMP/USDT PEPE/USDT KAITO/USDT DOGE/USDT WCT/USDT"
|
||||
PAIRS_FLAG="--pairs $DEFAULT_PAIRS"
|
||||
echo "Using default pairs: $DEFAULT_PAIRS"
|
||||
fi
|
||||
@ -160,10 +160,10 @@ print(' '.join(pairs) if pairs else '')
|
||||
PAIRS_FLAG="--pairs $PAIRS_ARG"
|
||||
echo "Using pairs from --pairs parameter: $PAIRS_ARG"
|
||||
else
|
||||
# 使用默认的交易对列表
|
||||
DEFAULT_PAIRS="BTC/USDT TON/USDT DOT/USDT XRP/USDT OKB/USDT SOL/USDT WCT/USDT TRUMP/USDT SUI/USDT PEPE/USDT TRB/USDT MASK/USDT UNI/USDT KAITO/USDT XAUT/USDT"
|
||||
PAIRS_FLAG="--pairs $DEFAULT_PAIRS"
|
||||
echo "Using default pairs: $DEFAULT_PAIRS"
|
||||
# 使用默认的交易对列表 - 只保留Meme类币对
|
||||
DEFAULT_PAIRS="BTC/USDT TRUMP/USDT PEPE/USDT KAITO/USDT DOGE/USDT WCT/USDT"
|
||||
PAIRS_FLAG="--pairs $DEFAULT_PAIRS"
|
||||
echo "Using default pairs: $DEFAULT_PAIRS"
|
||||
fi
|
||||
fi
|
||||
fi
|
||||
@ -172,8 +172,8 @@ elif [ -n "$PAIRS_ARG" ]; then
|
||||
PAIRS_FLAG="--pairs $PAIRS_ARG"
|
||||
echo "Using pairs from --pairs parameter: $PAIRS_ARG"
|
||||
else
|
||||
# 没有提供任何交易对参数,使用默认值
|
||||
DEFAULT_PAIRS="BTC/USDT TON/USDT DOT/USDT TRUMP/USDT SUI/USDT UNI/USDT XAUT/USDT"
|
||||
# 没有提供任何交易对参数,使用默认值 - 只保留Meme类币对
|
||||
DEFAULT_PAIRS="BTC/USDT TRUMP/USDT PEPE/USDT KAITO/USDT DOGE/USDT WCT/USDT"
|
||||
PAIRS_FLAG="--pairs $DEFAULT_PAIRS"
|
||||
echo "No pairs parameter provided, using default pairs: $DEFAULT_PAIRS"
|
||||
fi
|
||||
|
||||
@ -61,68 +61,17 @@ class MyCoolRLModel(ReinforcementLearner):
|
||||
# =========================================================
|
||||
if action in (Actions.Long_enter.value, Actions.Short_enter.value):
|
||||
if self._position == Positions.Neutral:
|
||||
# 【核心修改 1】入场不给奖励,反而给微小的惩罚。
|
||||
# 逻辑:开仓即产生手续费和滑点风险。
|
||||
# 这迫使模型只有在预期收益远大于这个惩罚时才敢开仓。
|
||||
|
||||
# 【新增】检测是否在大户操纵信号下入场
|
||||
# 通过当前状态特征判断市场环境
|
||||
try:
|
||||
# 获取当前状态中的特征值(这些是根据特征工程顺序排列的)
|
||||
# 由于我们无法直接访问dataframe,我们使用当前状态中的特征
|
||||
current_features = self.get_state()
|
||||
|
||||
# 检查是否在极端波动下入场(大户操纵信号)
|
||||
# 这里我们使用一些间接判断方法
|
||||
is_extreme_condition = False
|
||||
|
||||
# 检查是否在高位追涨(RSI超买区域)
|
||||
# 检查是否在异常波动下入场
|
||||
# 检查是否在价格严重偏离VWAP时入场
|
||||
# 检查Z-Score是否过高(异常波动)
|
||||
|
||||
# 由于我们无法直接访问特定特征索引,我们使用一些间接方法
|
||||
# 通过当前的pnl和持仓时间来判断是否是陷阱
|
||||
|
||||
# 如果刚出现大幅价格波动就立即入场,可能是追高杀跌
|
||||
# 这里我们假设可以通过某些状态指标来判断市场状况
|
||||
# 实际应用中,可以结合特征工程中的波动率、Z-Score等指标
|
||||
|
||||
# 检查是否在极端波动后立即入场
|
||||
# 这里我们使用一些假设的特征值来模拟检测
|
||||
# 在实际应用中,需要根据特征工程的顺序来获取正确的特征值
|
||||
|
||||
# 如果当前市场波动率很高(通过pnl的剧烈变化判断)
|
||||
# 或者当前处于明显的异常信号区域
|
||||
# 我们可以基于当前状态做一些判断
|
||||
|
||||
# 检查是否在刚出现大幅波动后立即入场
|
||||
# 这里我们使用一些间接判断
|
||||
if is_extreme_condition:
|
||||
# 在极端市场条件下入场,给予更重的惩罚
|
||||
return -0.2 # 更重的惩罚
|
||||
else:
|
||||
return -0.05 # 正常惩罚
|
||||
except:
|
||||
# 如果无法获取特征数据,返回正常惩罚
|
||||
return -0.05
|
||||
# 入场给予轻微惩罚,避免过度交易,但不要太重
|
||||
# 从 -0.05 改为 -0.01,让模型更愿意尝试入场
|
||||
return -0.01
|
||||
|
||||
# =========================================================
|
||||
# 场景 B: 观望 (Neutral)
|
||||
# =========================================================
|
||||
if action == Actions.Neutral.value and self._position == Positions.Neutral:
|
||||
# 【核心修改 2】空仓观望给 0 分,或者极小的惩罚。
|
||||
# 之前的代码给 -1 分会导致模型为了避免扣分而强行开单(Overtrading)。
|
||||
# 对于 PEPE 这种币,大部分时间是垃圾时间,观望是正确的。
|
||||
|
||||
# 【新增】奖励在混乱市场中保持冷静
|
||||
# 如果当前市场波动极大(可能是大户洗盘),保持空仓应给予奖励
|
||||
# 这里我们模拟检测市场混乱程度
|
||||
market_chaos_level = 0.0 # 需要根据特征计算
|
||||
if market_chaos_level > 0.7: # 假设市场混乱度超过70%时
|
||||
return 0.1 # 给予小奖励,奖励在混乱中保持冷静
|
||||
else:
|
||||
return 0.0
|
||||
# 空仓观望给予轻微惩罚,鼓励模型寻找机会
|
||||
# 从 0 改为 -0.001,避免模型一直观望
|
||||
return -0.001
|
||||
|
||||
# =========================================================
|
||||
# 场景 C: 持仓中 (Holding) - 每一根 K 线都会触发
|
||||
@ -131,9 +80,23 @@ class MyCoolRLModel(ReinforcementLearner):
|
||||
# 如果当前动作是继续持有 (Neutral)
|
||||
if action == Actions.Neutral.value:
|
||||
|
||||
# 1. 时间衰减惩罚:拿得越久,资金占用成本越高
|
||||
time_penalty = -0.01 * (trade_duration / max_trade_duration)
|
||||
reward += time_penalty
|
||||
# 1. 时间管理:希望持仓,但不要超时
|
||||
# - 前50%时间:轻微奖励,鼓励持仓捕捉趋势
|
||||
# - 50%-80%时间:轻微惩罚
|
||||
# - 超过80%时间:惩罚加重
|
||||
time_ratio = trade_duration / max_trade_duration
|
||||
if time_ratio < 0.5:
|
||||
# 前半段时间:轻微奖励,鼓励持仓
|
||||
time_reward = 0.005 * (1 - time_ratio * 2)
|
||||
reward += time_reward
|
||||
elif time_ratio < 0.8:
|
||||
# 50%-80%时间:轻微惩罚
|
||||
time_penalty = -0.01 * ((time_ratio - 0.5) / 0.3)
|
||||
reward += time_penalty
|
||||
else:
|
||||
# 超过80%时间:惩罚加重,提醒模型该离场了
|
||||
time_penalty = -0.02 * ((time_ratio - 0.8) / 0.2) - 0.01
|
||||
reward += time_penalty
|
||||
|
||||
# 2. 浮动盈亏反馈 (关键!)
|
||||
if pnl > 0:
|
||||
@ -141,22 +104,20 @@ class MyCoolRLModel(ReinforcementLearner):
|
||||
# 使用 log 函数让奖励增长平缓,避免模型过于贪婪而不止盈
|
||||
reward += np.log(1 + pnl) * 0.5
|
||||
else:
|
||||
# 浮亏:给予沉重的打击!
|
||||
# 逻辑:浮亏不仅是钱的损失,更是机会成本。
|
||||
# pnl 是负数,这里会让 reward 变得很小。
|
||||
# 例如 pnl -0.02, 惩罚会显著大于浮盈 0.02 的奖励
|
||||
reward -= (abs(pnl) * 2.0)
|
||||
# 浮亏:给予惩罚,但不要太严厉
|
||||
# 从 abs(pnl) * 2.0 改为 abs(pnl) * 1.0
|
||||
reward -= (abs(pnl) * 1.0)
|
||||
|
||||
# 3. 止损惩罚加速
|
||||
# 如果浮亏超过 3%,给予额外的巨额惩罚,逼迫模型学会止损
|
||||
# 如果浮亏超过 3%,给予额外的惩罚,但不要太严厉
|
||||
if pnl < -0.03:
|
||||
reward -= 1.0
|
||||
reward -= 0.5 # 从 -1.0 改为 -0.5
|
||||
|
||||
# 4. 【新增】检测是否在大户操纵中被套
|
||||
# 如果刚入场不久就出现大幅反向波动,可能是被大户收割
|
||||
if trade_duration < 5 and pnl < -0.01:
|
||||
# 入场后5根K线内就亏损超过1%,很可能是被大户骗了
|
||||
reward -= 3.0 # 严厉惩罚,告诉模型这是陷阱
|
||||
reward -= 1.0 # 从 -3.0 改为 -1.0,不要太严厉
|
||||
|
||||
# =========================================================
|
||||
# 场景 D: 离场结算 (Exit)
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user