Files
2026-07-14 15:10:58 +08:00

336 lines
20 KiB
Bash
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# ============================================================
# Polymarket Copy Trader - 配置文件
# ============================================================
# 复制: cp .env.example .env
# 必填项: TELEGRAM_BOT_TOKEN + TELEGRAM_CHAT_ID
# 修改后需重启机器人才能生效
# ============================================================
# ╔══════════════════════════════════════════════════════════════╗
# ║ 资金与仓位 ║
# ╚══════════════════════════════════════════════════════════════╝
# 初始本金(美元),用于 Kelly 公式计算建议仓位
# 调大 → 建议仓位更大;调小 → 建议仓位更保守
INITIAL_CAPITAL_USD=10000
# 单笔最大仓位比例(占本金百分比)
# 0.05 = 5%,即单笔最多 $500(本金 $10000 时)
# 调大 → 允许更重的单笔仓位;调小 → 更分散
MAX_POSITION_PCT=0.05
# Kelly 分数系数(0~1),用于降低 Kelly 公式的激进程度
# 0.5 = 半凯利(推荐),1.0 = 全凯利(激进),0.25 = 四分之一凯利(保守)
# 调大 → 仓位更大但风险更高;调小 → 更保守
KELLY_FRACTION=0.5
# ╔══════════════════════════════════════════════════════════════╗
# ║ 价格防护 ║
# ╚══════════════════════════════════════════════════════════════╝
# 允许跟单的最低 / 最高价格
# 极端价格(<0.10 或 >0.90)通常是噪音或信息已充分定价,赔率极差
# 调大范围 → 接收更多信号但质量可能下降;收窄范围 → 只跟踪中等赔率市场
MIN_PRICE=0.10
MAX_PRICE=0.90
# ╔══════════════════════════════════════════════════════════════╗
# ║ 交易规则 ║
# ╚══════════════════════════════════════════════════════════════╝
# 被监控钱包的单笔最低交易金额(美元),低于此值被忽略
# 调大 → 过滤小额噪音,信号更少但更可靠;调小 → 更多信号但可能包含噪音
MIN_TRADE_SIZE_USD=500
# 信号产生后的模拟执行延迟(秒),实盘时有用
EXECUTION_DELAY_SECONDS=5
# 是否启用实盘交易(true=实盘下单,false=仅记录信号不执行)
# 设为 true 前必须填写下方的 POLY_API_KEY 等 CLOB 凭证
ENABLE_EXECUTION=false
# ╔══════════════════════════════════════════════════════════════╗
# ║ 钱包池(目标钱包筛选) ║
# ╚══════════════════════════════════════════════════════════════╝
# 钱包池上限(最多跟踪多少个钱包)
# 实际数量取决于多少钱包通过下方三道过滤门槛,不足则全取
# 调大 → 池子更大,共识信号可能更多;调小 → 更聚焦
WALLET_POOL_SIZE=100
# ═══════════════════════════════════════════════════════════════
# 以下三个过滤条件共用一个时间窗口:WALLET_PNL_WINDOW_DAYS
# ═══════════════════════════════════════════════════════════════
# 钱包最低总盈亏(美元)— 窗口内的现金盈亏 + 已平仓盈亏
# 现金盈亏 = 当前持仓 cashPnl;已平仓盈亏 = /closed-positions 按 timestamp 过滤
# 调大 → 只要高盈利钱包;调小 → 扩大池子,可能混入不稳定钱包
WALLET_PNL_MIN_USD=5000
# 钱包最少交易笔数 — /trades 接口,按 transactionHash 去重,仅统计窗口内
# 调大 → 只要经验丰富的钱包;调小 → 扩大池子,包含新手钱包
WALLET_MIN_TRADES=30
# 钱包最少覆盖品类数 — /trades + /positions 的 eventSlug 合并去重,仅统计窗口内
# 调大 → 只要多元化钱包;调小 → 扩大池子,包含专注单一品类的钱包
WALLET_MIN_CATEGORIES=3
# 时间窗口(天),以上三个过滤条件共用此窗口
# 默认 90 天(从 30 天改为 90 天以降低幸存者偏差 — 只看 30 天会过度偏向
# 近期运气好的钱包,而 90 天能过滤掉短期波动,识别真正稳定的盈利者)
# 调大 → 数据量更大,门槛变低,更多钱包通过;调小 → 只看近期,更严格
WALLET_PNL_WINDOW_DAYS=90
# /closed-positions 分页上限(每页 50 条,20 页 = 1000 条)
# 超活跃钱包在 90 天窗口内可能产生 500+ 平仓记录,上限太低会截断 PnL
# 贝叶斯更新阶段自动用 3 倍此值(只处理池内 ~100 钱包,可承受更多 API 调用)
# 调大 → PnL 更准确但 API 调用更多;调小 → 更快但可能低估活跃钱包的 PnL
CLOSED_POSITIONS_MAX_PAGES=20
# 钱包池刷新间隔(小时),到期后重新扫描市场 + 重新评估钱包
# 调小 → 更频繁刷新,钱包池更新更快但 API 调用更多
# 调大 → 减少 API 压力,但可能错过新晋优质钱包
WALLET_REFRESH_HOURS=24
# ╔══════════════════════════════════════════════════════════════╗
# ║ 贝叶斯信誉分先验参数 ║
# ╚══════════════════════════════════════════════════════════════╝
# 新钱包的初始信誉分(0~1),0.5 表示"不确定其能力"
# 调大 → 对新钱包更信任,信号更容易触发;调小 → 对新钱包更谨慎
BAYESIAN_PRIOR_SKILL=0.5
# 历史表现衰减窗口(天),通过 /closed-positions 的 timestamp 字段过滤
# 只统计此窗口内的平仓盈亏来更新信誉分,超出窗口的平仓记录被忽略
# 调大 → 历史数据保留更久;调小 → 更看重近期表现
BAYESIAN_DECAY_DAYS=14
# 贝叶斯更新步长(0~1),控制单次信誉分变化幅度
# 0.05 = 每次最多调整 5%,比较保守;0.1 = 更激进
# 调大 → 信誉分变化更快但可能过度反应;调小 → 更平稳但适应慢
BAYESIAN_STEP=0.05
# ╔══════════════════════════════════════════════════════════════╗
# ║ Telegram 通知 ║
# ╚══════════════════════════════════════════════════════════════╝
# 是否开启 Telegram 信号推送
TELEGRAM_ENABLED=false
# Telegram Bot Token(从 @BotFather 获取)
TELEGRAM_BOT_TOKEN=
# Telegram 接收消息的 Chat ID(用户或群组 ID)
TELEGRAM_CHAT_ID=
# ╔══════════════════════════════════════════════════════════════╗
# ║ Polymarket CLOB 实盘凭证(启用实盘时必填) ║
# ╚══════════════════════════════════════════════════════════════╝
# Polymarket API Key(从 polymarket.com/settings/api 获取)
POLY_API_KEY=
# Polymarket API Secret
POLY_API_SECRET=
# Polymarket API Passphrase
POLY_API_PASSPHRASE=
# 钱包私钥(用于链上签名下单)
POLY_WALLET_PRIVATE_KEY=
# ╔══════════════════════════════════════════════════════════════╗
# ║ HTTP / 代理(按需配置) ║
# ╚══════════════════════════════════════════════════════════════╝
# HTTP 代理地址,用于访问 Polymarket API(国内网络可能需要)
# 格式: http://127.0.0.1:7890Clash/V2Ray 等代理)
# 留空则直连,不经过代理
HTTP_PROXY=
# ╔══════════════════════════════════════════════════════════════╗
# ║ 数据源轮询参数 ║
# ╚══════════════════════════════════════════════════════════════╝
# 轮询间隔(秒),每隔多久拉取一次所有钱包的最新交易
# 调小 → 更及时但 API 调用更多(注意频率限制);调大 → 省 API 但可能延迟
USER_POLL_INTERVAL_SECONDS=30
# 预热时长(秒),启动后跳过历史交易的时间窗口
# 避免机器人把启动前的旧交易当作"新交易"来跟单
# 调大 → 更安全地跳过热启动历史;调小 → 更快开始工作
STREAM_WARMUP_SECONDS=30
# 每个钱包每次拉取的最大交易记录数
# 预热期间会用这笔数建立"已见过"的基准线
# 调大 → 基准线更长,预热更慢;调小 → 更快但可能漏掉部分历史
STREAM_MAX_TRADES_PER_WALLET=20
# 是否开启详细轮询日志(每轮都打印 poll 信息)
# true → 每 30s 输出一次 poll 统计;false → 每 10 轮才输出一次
STREAM_VERBOSE_LOGGING=false
# 单个钱包 /activity 轮询超时(秒)
# /activity 比 /positions 更重(返回完整交易历史),需要更长超时
# 如果太短,活跃钱包会全部超时 → _last_seen 永远为空 → 无信号
STREAM_POLL_TIMEOUT=15
# ╔══════════════════════════════════════════════════════════════╗
# ║ 共识信号参数 ║
# ╚══════════════════════════════════════════════════════════════╝
# 共识时间窗口(秒),在此窗口内多个钱包的同方向交易才算"共识"
# 调大 → 更容易形成共识但信号可能滞后;调小 → 信号更及时但共识更难达成
CONSENSUS_WINDOW_SECONDS=600
# 最少共识钱包数,至少 N 个钱包同方向交易才触发信号
# 调大 → 信号更可靠但数量更少;调小 → 信号更多但可能包含噪音
CONSENSUS_MIN_WALLETS=2
# 共识强度阈值,买入强度 - 卖出强度 必须 ≥ 此值才触发
# 强度 = 各钱包信誉分之和,0.4 约等于 1 个 0.4 分钱包或 2 个 0.2 分钱包
# 调大 → 信号更确定但更难触发;调小 → 更容易触发信号
CONSENSUS_STRENGTH_THRESHOLD=0.4
# 钱包防抖(秒),同一钱包在同一市场 N 秒内只处理一次交易
# 防止同一钱包短时间内多次交易产生重复信号
# 调大 → 防抖更严格;调小 → 更敏感但可能重复
WALLET_DEBOUNCE_SECONDS=600
# 最低信誉分,信誉分低于此值的钱包被忽略
# 0~10.3 是比较宽松的阈值
# 调大 → 只跟高信誉钱包;调小 → 更包容但可能跟踪表现差的钱包
MIN_CREDIBILITY=0.3
# 信誉分更新间隔(分钟),贝叶斯算法根据最新表现重新计算钱包信誉
# 调小 → 信誉分变化更频繁;调大 → 更新更平稳
CREDIBILITY_UPDATE_MINUTES=60
# ╔══════════════════════════════════════════════════════════════╗
# ║ 信号过滤(策略修复) ║
# ╚══════════════════════════════════════════════════════════════╝
# 仅发 BUY 信号。SELL 在 Polymarket = 卖出已持有的 token(非做空),
# 无持仓跟踪无法跟单 SELL,仅记录为反向指标
# true → 只跟 BUY(推荐);false → 也跟 SELL 信号
BUY_ONLY_SIGNALS=true
# 同市场信号冷却(秒)— 同一 condition_id 发出信号后 N 秒内不再重复
# 86400 = 1 天,防止同一市场短时间内反复发信号
# 调大 → 更保守,一天最多一个信号/市场;调小 → 更频繁
SIGNAL_COOLDOWN_SECONDS=86400
# 跳过距结算不足 N 小时的市场(流动性薄 + 结算风险高)
# 24 = 跳过 24 小时内结算的市场
# 调大 → 更安全但可跟的市场更少;调小 → 接受更高结算风险
MIN_HOURS_TO_RESOLUTION=24
# ╔══════════════════════════════════════════════════════════════╗
# ║ 钱包池过滤(策略修复) ║
# ╚══════════════════════════════════════════════════════════════╝
# 排除做市商(同一 conditionId 持有 Yes+No 双边持仓的钱包)
# 做市商的交易不是方向性的,跟单无意义
# true → 排除双边持仓 >10% 的钱包;false → 不排除
EXCLUDE_MARKET_MAKERS=true
# 未实现 cashPnl 折扣(0.0~1.0
# Polymarket 中间价常高估实际可成交价(薄流动性 + bid-ask spread
# 0.5 = 只计一半未实现盈亏;1.0 = 全额计入;0.0 = 完全忽略未实现盈亏
CASH_PNL_DISCOUNT=0.5
# ╔══════════════════════════════════════════════════════════════╗
# ║ Kelly 仓位管理(策略修复) ║
# ╚══════════════════════════════════════════════════════════════╝
# 历史已 resolve 的信号不足 N 条时,不用 Kelly 公式,改用保守固定仓位
# 防止数据不足时 Kelly 公式产生不可靠的仓位建议
# 调大 → Kelly 更晚启用,前期更保守;调小 → Kelly 更早启用但可能不准
KELLY_MIN_SAMPLES=50
# Kelly 数据不足时的保守固定仓位比例(占本金百分比)
# 0.01 = 1%,即 $100 本金时每次下 $1
# 调大 → 前期仓位更大;调小 → 更保守
KELLY_FALLBACK_FRACTION=0.01
# ╔══════════════════════════════════════════════════════════════╗
# ║ 风控熔断(策略修复) ║
# ╚══════════════════════════════════════════════════════════════╝
# 信号发出前会检查三道风控闸门:日亏损 / 连续亏损 / 最大持仓
# 任一闸门触发都会阻止新信号产生
# 日亏损上限(美元)— 24h 内已实现亏损超过此值则暂停发信号
# 调大 → 容忍更大日内亏损;调小 → 更快止损
MAX_DAILY_LOSS_USD=500
# 连续亏损次数上限 — 连续 N 次信号亏损则暂停
# 调大 → 容忍更长连亏;调小 → 更快暂停
MAX_CONSECUTIVE_LOSSES=5
# 熔断暂停时长(分钟)— 闸门触发后暂停 N 分钟
# 调大 → 暂停更久,给市场更多时间恢复;调小 → 更快恢复
RISK_PAUSE_MINUTES=60
# 最大同时持仓数 — 未 resolve 的信号数超过此值则不发新信号
# 调大 → 允许更多并行持仓;调小 → 更集中
MAX_OPEN_POSITIONS=10
# ╔══════════════════════════════════════════════════════════════╗
# ║ 信号结果回填(策略分析) ║
# ╚══════════════════════════════════════════════════════════════╝
# 信号发出后,市场结算的结果会被自动回填到 copy_signals 表
# 数据用于 /analytics 看板的命中率与 PnL 聚合统计
# 回填循环间隔(分钟),每 N 分钟扫描一次未回填的信号
# 调小 → 更及时回填新结果但 API 调用更多;调大 → 更省 API
OUTCOME_RESOLVE_MINUTES=15
# 每批扫描的最大信号数(防止一次性打太多 API)
# 调大 → 单次回填更快但可能集中触发限流;调小 → 更温和
OUTCOME_RESOLVE_BATCH_SIZE=50
# 单次 /markets 请求超时(秒)
OUTCOME_RESOLVE_TIMEOUT=5.0
# ╔══════════════════════════════════════════════════════════════╗
# ║ 调试日志 ║
# ╚══════════════════════════════════════════════════════════════╝
# 是否打印 API 返回的原始交易数据(true=会输出大量日志,仅调试时用)
DEBUG_LOG_API_PAYLOADS=false
# ╔══════════════════════════════════════════════════════════════╗
# ║ 数据库 ║
# ╚══════════════════════════════════════════════════════════════╝
# SQLite 数据库文件路径(相对项目根目录)
# 删除此文件即可清空所有数据,重新冷启动
DB_PATH=data/copytrader.db
# ╔══════════════════════════════════════════════════════════════╗
# ║ 日志级别 ║
# ╚══════════════════════════════════════════════════════════════╝
# 日志级别: DEBUG / INFO / WARNING / ERROR
# DEBUG → 输出所有调试信息(包括每笔交易过滤详情)
# INFO → 正常运行时推荐(信号、轮询统计、心跳等)
# WARNING → 仅警告和错误
LOG_LEVEL=INFO