import re, os

_ROOT = os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
lines = open(os.path.join(_ROOT, 'my_trader.log'), encoding='utf-8', errors='replace').readlines()
today = [l for l in lines if '2026-04-15' in l]

# 找所有开仓 + 之后的平仓/止损
NAMES   = ['TR','OB','FR','TK','OI','MP','VD','BTC','GM','IV','EX','LC','MR','SM']
WEIGHTS = [0.10,0.06,0.02,0.12,0.05,0.01,0.09,0.07,0.06,0.01,0.07,0.15,0.06,0.00]

def parse_factors(fl):
    pat = (r'TR:([+-][0-9.]+).*OB:([+-][0-9.]+).*FR:([+-][0-9.]+).*TK:([+-][0-9.]+)'
           r'.*OI:([+-][0-9.]+).*MP:([+-][0-9.]+).*VD:([+-][0-9.]+).*BTC:([+-][0-9.]+)'
           r'.*GM:([+-][0-9.]+).*IV:([+-][0-9.]+).*EX:([+-][0-9.]+).*LC:([+-][0-9.]+)'
           r'.*MR:([+-][0-9.]+).*SM:([+-][0-9.]+).*=> ([+-][0-9.]+) -> (\w+)')
    m = re.search(pat, fl)
    if not m:
        return None
    vals = [float(m.group(i+1)) for i in range(14)]
    return {'vals': vals, 'score': float(m.group(15)), 'dir': m.group(16)}

# 按时间顺序整理所有事件
events = []
for i, l in enumerate(today):
    ts = re.match(r'(\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2})', l)
    ts = ts.group(1) if ts else ''

    # 开仓
    if re.search(r'执行开仓|触发 (LONG|SHORT)，执行', l):
        factors = ''
        for j in range(max(0, i-8), i+1):
            if re.search(r'TR:[+-].*->', today[j]):
                factors = today[j]
        m2 = re.search(r'(LONG|SHORT)', l)
        events.append({'type':'open', 'ts':ts, 'dir': m2.group(1) if m2 else '?', 'factors': parse_factors(factors)})

    # 平仓/止损/止盈
    elif re.search(r'止损|止盈|平仓成功|P&L.*USD|TP\$|SL\$|closed', l, re.IGNORECASE):
        m2 = re.search(r'([+-]?\$?[0-9.]+)\s*USD|P&L:([+-]?[0-9.]+)', l)
        pnl = None
        if m2:
            pnl = float((m2.group(1) or m2.group(2) or '0').replace('$','').replace('+',''))
        events.append({'type':'close', 'ts':ts, 'line':l.strip()[-120:], 'pnl':pnl})

    # equity快照
    elif re.search(r'Cycle \d+: equity', l):
        m2 = re.search(r'equity=\$([0-9.]+)', l)
        if m2:
            events.append({'type':'equity', 'ts':ts, 'eq': float(m2.group(1))})

# 计算每次开仓后的equity变化
print("=" * 70)
print("今日交易分析")
print("=" * 70)
opens = [e for e in events if e['type'] == 'open']
equities = [e for e in events if e['type'] == 'equity']

print(f"\n开仓次数: {len(opens)}")
if equities:
    print(f"今日开盘equity: ${equities[0]['eq']:.4f}")
    print(f"今日峰值equity: ${max(e['eq'] for e in equities):.4f}")
    print(f"今日最低equity: ${min(e['eq'] for e in equities):.4f}")
    print(f"当前equity:     ${equities[-1]['eq']:.4f}")
    print(f"今日盈亏:       {equities[-1]['eq']-equities[0]['eq']:+.4f}")

print("\n" + "=" * 70)
print("各次开仓的因子贡献分析")
print("=" * 70)

factor_wins   = {n: [] for n in NAMES}  # 开仓方向正确的因子值
factor_losses = {n: [] for n in NAMES}  # 开仓方向错误的因子值

for idx, op in enumerate(opens):
    print(f"\n开仓#{idx+1} [{op['ts']}] {op['dir']} 总分:{op['factors']['score']:+.3f}" if op['factors'] else f"\n开仓#{idx+1} {op['dir']}")
    if not op['factors']:
        continue
    f = op['factors']
    contribs = [(NAMES[i], f['vals'][i], WEIGHTS[i], f['vals'][i]*WEIGHTS[i]) for i in range(14)]
    # 按贡献绝对值排序
    top = sorted(contribs, key=lambda x: abs(x[3]), reverse=True)[:8]
    for n, v, w, c in top:
        mark = 'OK' if (c > 0 and f['dir']=='LONG') or (c < 0 and f['dir']=='SHORT') else 'NO'
        print(f"  {mark} {n:4s}: {v:+.2f} x{w:.2f} = {c:+.3f}")

print("\n" + "=" * 70)
print("因子方向与总盈亏相关性分析")
print("=" * 70)

# 找开仓后最近10个equity，看equity变化
for idx, op in enumerate(opens):
    op_time = op['ts']
    # 找开仓后的equity序列
    after = [e for e in equities if e['ts'] > op_time]
    if len(after) >= 5:
        eq_before = next((e['eq'] for e in equities if e['ts'] <= op_time), None)
        eq_after  = after[4]['eq']  # 约5分钟后
        if eq_before:
            delta = eq_after - eq_before
            result = 'WIN' if delta > 0.001 else ('LOSS' if delta < -0.001 else 'FLAT')
            print(f"\n开仓#{idx+1} {op['dir']} -> {result} ({delta:+.4f}$, ~5min)")
            if op['factors']:
                f = op['factors']
                # 记录各因子方向是否预测正确
                for i, n in enumerate(NAMES):
                    v = f['vals'][i]
                    if abs(v) > 0.05:
                        correct = (v > 0 and op['dir'] == 'LONG') or (v < 0 and op['dir'] == 'SHORT')
                        if result == 'WIN':
                            factor_wins[n].append(1 if correct else -1)
                        elif result == 'LOSS':
                            factor_losses[n].append(1 if correct else -1)

print("\n" + "=" * 70)
print("因子信号质量（今日）")
print("=" * 70)
print(f"{'因子':<6} {'权重':>5} {'胜率贡献':>10} {'亏损贡献':>10} {'净效果':>8}")
for n, w in zip(NAMES, WEIGHTS):
    wins  = factor_wins[n]
    losses = factor_losses[n]
    win_score  = sum(wins)  / len(wins)  if wins  else 0
    loss_score = sum(losses)/ len(losses)if losses else 0
    net = win_score - loss_score
    if wins or losses:
        print(f"{n:<6} {w:>5.2f}  {win_score:>+10.2f}  {loss_score:>+10.2f}  {net:>+8.2f}  {'↑建议提权' if net > 0.3 else ('↓建议降权' if net < -0.3 else '')}")
