Files
MoFin/scripts/research/step48_predict_dd.py
T
hmo b9c68a83a7 docs: 预测超跌反弹策略研究成果归档(方法论/策略文档/研究记录/脚本)
- 新增 strategy_research_methodology.md(由果及因/12维/铁律/支撑压力规范)
- 新增 predictive_oversold_strategy.md(v5定稿,年化18.57%)
- 新增 deployment-plan-predictive-oversold.md(整合部署计划)
- 归档 docs/research/(63份研究过程文档)+ scripts/research/(19个研究脚本)
- 更新 docs/README.md 文档中心(策略研究章节)
2026-08-10 14:37:21 +08:00

53 lines
2.1 KiB
Python
Raw 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.
#!/usr/bin/env python3
# step48_predict_dd.py - 阴跌中段判定测试
import numpy as np
import pandas as pd
print("=== 加载 ===", flush=True)
tr = pd.read_csv("/tmp/step43_trades.csv")
print("交易:", len(tr), flush=True)
print("全量: avg={:.2f}% wr={:.1f}% 大亏率={:.1f}%".format(
tr["ret"].mean(), (tr["ret"]>0).mean()*100, (tr["ret"]<-10).mean()*100), flush=True)
def evaluate(cond, label):
sub = tr[cond]
if len(sub) < 50:
print("{}: n={} 不足".format(label, len(sub)), flush=True)
return
avg = sub["ret"].mean()
wr = (sub["ret"]>0).mean()*100
big_loss = (sub["ret"]<-10).mean()*100
print("{}: n={} avg={:.2f}% wr={:.1f}% 大亏率={:.1f}%".format(
label, len(sub), avg, wr, big_loss), flush=True)
print("\n=== 单特征阈值扫描 ===", flush=True)
print("\n-- mkt_down_days >= N --", flush=True)
for t in [2, 3, 4]:
evaluate(tr["mkt_down_days"] >= t, "连跌>={}(阴跌)".format(t))
print("\n-- sig_mkt_adx <= N --", flush=True)
for t in [40, 45, 50, 55]:
evaluate(tr["sig_mkt_adx"] <= t, "adx<={}(弱趋势)".format(t))
print("\n-- mkt_news5 <= N --", flush=True)
for t in [1000, 1500, 2000]:
evaluate(tr["mkt_news5"] <= t, "news<={}(冷清)".format(t))
print("\n=== 组合:阴跌中段判定 ===", flush=True)
yin_die = (tr["mkt_down_days"] >= 2) & (tr["sig_mkt_adx"] <= 50)
print("阴跌判定(连跌>=2+adx<=50) 命中:", yin_die.sum(), flush=True)
evaluate(~yin_die, "保留(非阴跌)")
evaluate(yin_die, "跳过(阴跌)")
yin_die2 = (tr["mkt_down_days"] >= 2) & (tr["sig_mkt_adx"] <= 50) & (tr["mkt_news5"] <= 2000)
print("阴跌判定2(+news<=2000) 命中:", yin_die2.sum(), flush=True)
evaluate(~yin_die2, "保留(非阴跌2")
evaluate(yin_die2, "跳过(阴跌2")
yin_die3 = (tr["mkt_down_days"] >= 2) & (tr["sig_mkt_adx"] <= 55) & (tr["sig_mkt_rsi"] >= 33)
print("阴跌判定3(连跌>=2+adx<=55+rsi>=33) 命中:", yin_die3.sum(), flush=True)
evaluate(~yin_die3, "保留(非阴跌3")
evaluate(yin_die3, "跳过(阴跌3")
print("\n=== 完成 ===", flush=True)