From e332d346f6ca7850c7773cb8df12b5006ed90540 Mon Sep 17 00:00:00 2001 From: liam Date: Wed, 9 Sep 2026 08:05:57 +0000 Subject: [PATCH] Add V6 stock strategy analysis and JD fapai scrape skill - Add V6 strategy section to us-stock-trading-evaluation: fixes indicator dilution, SMA period hardcode, and stoploss tier issues; includes hyperopt results and backtest comparison - Add jd-fapai-scrape skill: Playwright-based scraper for JD judicial auction properties with incremental update support Co-Authored-By: Claude Opus 4.6 --- quant/us-stock-trading-evaluation.md | 89 ++++ skills/jd-fapai-scrape/SKILL.md | 123 ++++++ skills/jd-fapai-scrape/requirements.txt | 1 + skills/jd-fapai-scrape/scrape.py | 551 ++++++++++++++++++++++++ skills/jd-fapai-scrape/url_structure.md | 179 ++++++++ 5 files changed, 943 insertions(+) create mode 100644 skills/jd-fapai-scrape/SKILL.md create mode 100644 skills/jd-fapai-scrape/requirements.txt create mode 100644 skills/jd-fapai-scrape/scrape.py create mode 100644 skills/jd-fapai-scrape/url_structure.md diff --git a/quant/us-stock-trading-evaluation.md b/quant/us-stock-trading-evaluation.md index 4de5fa5..fc9171c 100644 --- a/quant/us-stock-trading-evaluation.md +++ b/quant/us-stock-trading-evaluation.md @@ -593,6 +593,95 @@ OKX 现货 API ◄──── freqtrade 执行下单 ◄─────── --- +### 4.9 V6 策略:修代码硬伤 + 调止损 + Hyperopt + 回测验证 + +V5-Stock 跑通后深度分析发现 3 个问题,V6 针对性修复并跑 hyperopt 验证。 + +#### 4.9.1 三个问题与 V6 修复 + +**问题 1:指标被非开盘 K 线稀释(代码硬伤)** + +V5-Stock 的 `populate_indicators` 在完整 24/7 dataframe 上计算 ATR/ADX/SMA/通道。OKX 代币化股票 96 根/天 K 线中仅 ~19% 在美股交易时段(9:30-16:00 ET),62% 周末 K 线近似 0 波动。ATR 被稀释 ~16%,通道高低点被平盘 K 线拉偏。 + +V6 修复:在 `populate_indicators` 中提取交易时段子集 `mh`,仅在 `mh` 上计算全部指标,然后用 `reindex(dataframe.index, method='ffill')` forward-fill 回完整 dataframe。实测验证:ATR 从稀释值恢复 1.16x,无 NaN 结构问题。Freqtrade 的 `StrategyResultValidator` 要求返回的 dataframe 行数/末行日期/末行收盘不变,此方法保留所有原始行。 + +**问题 2:SMA 周期 `* 96` 硬编码** + +V5 原版 `ma_span_long_days * 96` 假设 96 根/天全是有效 K 线(加密 24/7 语义)。代币化股票仅 26 根/天是交易时段。V6 改为 `* 26`(`MARKET_CANDLES_PER_DAY = 26`),`ma_span_long_days=2` → 52 根交易时段 K 线 = 2 个交易日,与 V5 加密版语义一致。 + +**问题 3:止损阶梯为加密尺度** + +V5 的 `custom_stoploss` 利润阈值 5%/15%/30% 适合加密 10x 杠杆。股票 1x 下单笔 30% 利润极罕见。V6 下调到 3%/8%/15%(保本+0.5%/允许 5% 回撤/允许 8% 回撤)。 + +#### 4.9.2 V6 参数搜索范围 + +| 参数 | V5-Stock 范围 | V6 范围 | 原因 | +|------|-------------|---------|------| +| `up_line_span` | 100-400 | 50-150 | 交易时段 K 线,50-150 = 2-6 交易日 | +| `buy_stop_profit_span` | 50-200 | 20-80 | 1-3 交易日 | +| `ma_span_long_days` | 1-5 | 1-5 | ×26 后 = 26-130 | +| `adx_threshold` | 15-40 | 15-35 | 股票 ADX 常态 15-30 | +| `up_line_offset` | -0.2~0.4 | -0.3~0.3 | 真实 ATR 下范围居中 | +| `buy_stop_profit_offset` | -0.2~0.2 | -0.2~0.4 | 同上 | +| `max_slippage` | 0.005-0.03 | 0.005-0.03 | 不变 | + +`startup_candle_count` 600 → 800(覆盖 up_line_span=150 的 ~781 根预热,剩余 ~21 交易日用于信号生成)。 + +#### 4.9.3 三方回测对比 + +回测区间:2026-07-24 ~ 2026-08-23(29 天,~21 个有效交易日)。24 只标的,XSNOW/XSMH 因数据不足被跳过。 + +| 维度 | V5-Stock(旧代码+旧参数) | V6 默认(新代码+默认参数) | V6 优化(新代码+Hyperopt 参数) | +|------|--------------------------|---------------------------|-------------------------------| +| 交易数 | 32 | 33 | 51 | +| 收益率 | +4.74% | +1.56% | -1.14% | +| 胜率 | 43.8% | 57.6% | 62.7% | +| Sharpe(closed) | 2.35 | 1.46 | -1.59 | +| 最大回撤 | 4.71% | 3.74% | 5.73% | +| 被拒入场信号 | 119 | 77 | 21 | +| 平均持仓 | 3d 9h | 2d 20h | 16h 28m | + +**Hyperopt 最优参数(Epoch 295/300,Objective=0.05952)** + +```python +# Buy +adx_threshold = 25, buy_stop_profit_span = 38, ma_span_long_days = 5 +max_slippage = 0.027, up_line_offset = 0.26, up_line_span = 104 +# Sell +buy_stop_profit_offset = 0.17 +# ROI(hyperopt 新发现,V5/V5-Stock 原为 {"0": 100} 禁用) +{"0": 0.257, "89": 0.063, "255": 0.018, "545": 0} +# Stoploss +-0.084 +``` + +#### 4.9.4 分析与结论 + +**V6 代码改进有效但未带来收益提升:** +- V6 默认参数 vs V5-Stock:胜率从 43.8% → 57.6%,回撤从 4.71% → 3.74%,但收益从 +4.74% → +1.56%。指标修复(ATR 恢复真实水平)和止损阶梯下调改善了风险控制,但默认参数(`up_line_span=80, adx=20, up_line_offset=0.0`)较 V5-Stock 默认值(`340, 25, -0.18`)更保守,入场更少、利润更小。 +- 交易时段指标计算确实生效——被拒信号从 119 降到 77(V5-Stock 拒了更多噪声信号),说明 ATR/通道基于真实交易时段波动后,`confirm_trade_entry` 的滑点检查更精准。 + +**Hyperopt 过拟合(核心问题):** +- 300 轮 hyperopt 在 29 天数据上收敛,最优 epoch 的 Objective 从 2.57 → 0.059(持续下降,收敛正常)。 +- 但最优参数回测收益 -1.14%,远不如 V6 默认 +1.56% 和 V5-Stock +4.74%。 +- 根因:Hyperopt 找到一组高胜率(62.7%)但负期望参数。ROI 止盈(39 笔 ROI 退出,82.1% 胜率,avg +0.95%)快速锁利,但被 ROI 截断的赢家平均仅赚 0.95%,而 11 笔 channel_exit 亏损平均亏 -3.06%——盈亏比倒挂。 +- `ma_span_long_days=5`(搜索范围上限)和 `up_line_offset=0.26`(偏积极)说明 hyperopt 在小样本上过拟合到了少数大波动标的(XSOXL 亏 -2.80%,XTSM 亏 -1.00%)。 +- **结论:29 天 / ~21 个有效交易日的数据量不足以支撑可靠的 hyperopt。需要至少 3-6 个月历史数据。** + +**配置覆盖陷阱(已修复):** +- 初次回测 V6 优化参数时,config 的 `minimal_roi: {"0": 100}` 覆盖了 hyperopt 找到的 ROI 表,导致只有 buy/sell 参数生效(25 trades, -0.32%)。 +- Freqtrade 参数加载顺序:策略类默认 → hyperopt JSON → config 覆盖。config 中的 `minimal_roi`/`stoploss` 会覆盖 hyperopt 结果。 +- 修复:config 中改为 hyperopt 找到的值后方才生效(51 trades, -1.14%)。 + +#### 4.9.5 建议 + +1. **V6 代码保留**:指标计算修复(交易时段子集 + forward-fill)、`* 26` 修复、股票止损阶梯——这些是正确的工程改进 +2. **Hyperopt 结果暂不用**:29 天数据过拟合严重,等 OKX 积累 3-6 个月历史数据后重跑 +3. **短期用 V6 默认参数或 V5-Stock 参数**:V5-Stock 参数(`up_line_span=340, adx=25, up_line_offset=-0.18`)在当前数据上收益最高,可作为 V6 的备选参数 +4. **XSOXL 是持续性亏损标的**:在 V5-Stock、V6 默认、V6 优化三个版本中均亏损,考虑从 whitelist 移除 + +--- + ## 5. 综合推荐 按"聚焦策略不写框架"的目标排序: diff --git a/skills/jd-fapai-scrape/SKILL.md b/skills/jd-fapai-scrape/SKILL.md new file mode 100644 index 0000000..afab212 --- /dev/null +++ b/skills/jd-fapai-scrape/SKILL.md @@ -0,0 +1,123 @@ +--- +name: jd-fapai-scrape +description: 抓取京东法拍房搜索结果并支持增量更新。通过 Playwright 渲染京东法拍 H5 页面,拦截 API 响应,提取完整房源数据。支持项目链接、拍卖轮次、智能增量更新(遇到已知数据即停止,不全量下载)。 +--- + +# 京东法拍房源抓取 + +## 用途 + +从京东司法拍卖频道搜索结果页抓取全部房源信息: +- 房源标题与地址(完整不截断) +- 项目链接(`https://m.jd.com/product/{skuId}.html`) +- 起拍价 / 当前价 / 均价 +- 户型 / 面积 / 用途 / 小区名称 +- 拍卖轮次(一拍/二拍/变卖,从 API 标签或折扣率推断) +- 拍卖状态 / 出价次数 / 围观人数 +- 拍卖开始与结束时间 +- 增量追踪字段(`_first_seen` / `_last_seen`) + +## 前置条件 + +```bash +pip install playwright +python3 -m playwright install chromium +# 或 apt install chromium-browser +``` + +## 使用方法 + +### 首次抓取 + +```bash +# 默认抓取塘厦镇 +python3 skills/jd-fapai-scrape/scrape.py + +# 抓取东莞市全部法拍房(~4000 条,约 3 分钟) +python3 skills/jd-fapai-scrape/scrape.py --keyword 东莞市 --output-dir ../法拍/data + +# 自定义参数 +python3 skills/jd-fapai-scrape/scrape.py --keyword 长安 --sort-field 11 --cate-id 15 +``` + +### 增量更新 + +```bash +# 加 -i 标志,只下载新房源,遇到已知 paimaiId 即停止 +python3 skills/jd-fapai-scrape/scrape.py --keyword 东莞市 --output-dir ../法拍/data -i +``` + +增量模式的智能行为: +- 读取已有 `{keyword}_法拍房源.json` 中的所有 `paimaiId` +- 按最新发布排序加载(`spo_sortField=11`) +- **每加载一批(~40 条)检查是否全部已知**,如果是则立即停止 +- 典型增量更新只需加载 1-2 批(~30 秒),而非全量下载 100 批(~3 分钟) +- 新房源添加 `_first_seen` 和 `_last_seen` 时间戳 +- 已有房源更新可变字段(当前价、状态、出价次数等)并刷新 `_last_seen` + +## 去重机制 + +**去重 key = `paimaiId`(拍卖ID)** + +- 每次拍卖有唯一的 `paimaiId`,同一房产的一拍和二拍是不同的 `paimaiId`,各自保留 +- 不会因为标题相同而合并不同拍卖轮次 +- `paimaiId` 对应唯一的详情页 URL(`https://m.jd.com/product/{skuId}.html`),等价于按 URL 去重 + +## 命令行参数 + +| 参数 | 默认值 | 说明 | +|------|--------|------| +| `--keyword` | 塘厦 | 搜索关键词 | +| `--cate-id` | 15 | 类目 ID(15=法拍房) | +| `--sort-field` | 11 | 排序(11=最新发布) | +| `--max-scrolls` | 100 | 最大滚动次数 | +| `--output-dir` | . | 输出目录 | +| `--incremental` / `-i` | false | 增量更新模式 | + +## 输出文件 + +| 文件 | 内容 | +|------|------| +| `{keyword}_法拍房源.csv` | CSV 表格(26 列,最新发布在前) | +| `{keyword}_法拍房源.json` | 完整原始 JSON(含增量追踪字段) | +| `{keyword}_增量日志.log` | 每次增量更新的新增/变更记录(仅增量模式) | + +### CSV 列说明 + +| 列 | 说明 | +|----|------| +| 序号 / 拍卖ID / SKU ID | 唯一标识 | +| 标题 | 完整房产标题 | +| **项目链接** | `https://m.jd.com/product/{skuId}.html` | +| 位置 / 用途 / 户型 / 面积(㎡) / 小区 / 均价 | 房产属性 | +| 起拍价 / 当前价 / 折扣率 | 价格信息 | +| **拍卖轮次** | 一拍/二拍/变卖(API 标签或折扣率推断) | +| **标签** | 全部标签(诉讼资产、低于评估价等) | +| 状态 / 出价次数 / 围观人数 | 拍卖状态 | +| 开始时间 / 结束时间 | 拍卖时间 | +| 拍卖类型 | 司法拍卖等 | +| **首次发现** / **最后更新** | 增量追踪时间戳 | + +## 工作原理 + +1. **Playwright 渲染**:headless Chromium 打开京东法拍 H5 页面 +2. **SSR 数据提取**:页面加载后从 `