#!/usr/bin/env python3 # -*- coding: utf-8 -*- import sys, io if sys.platform == 'win32': sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding='utf-8') sys.stderr = io.TextIOWrapper(sys.stderr.buffer, encoding='utf-8') import pandas as pd import warnings warnings.filterwarnings('ignore') df = pd.read_csv( 'D:/work/project/cyb50-quant/cat-fly/t1/t1_trades_with_environment_20260327_141655.csv', encoding='utf-8-sig' ) cols = [ '交易方向','开仓时间','平仓时间','开仓价格','平仓价格','仓位', '盈亏金额','盈亏百分比','退出原因','持仓周期数','持仓小时数', 'T1调整','原平仓时间','原平仓价格','原盈亏','盈亏变化', '入场信号','开仓市值','平仓时资金','市场状态', '趋势短期','趋势中期','趋势强度','波动率分位','波动率水平', '成交量分位','布林带位置','布林带区域','RSI分位','RSI区域', '1日动量','入场价格' ] df.columns = cols df['开仓时间'] = pd.to_datetime(df['开仓时间']) df['年份'] = df['开仓时间'].dt.year df['盈利'] = df['盈亏金额'] > 0 y26 = df[df['年份'] == 2026].copy() print(f'2026年交易: {len(y26)}笔, 胜率{y26["盈利"].mean():.1%}') print() # 各类别分布 for col in ['市场状态', '波动率水平', 'RSI区域', '趋势中期', '布林带区域', 'T1调整']: print(f'[{col}]') vc = y26[col].value_counts() for v, cnt in vc.items(): sub = y26[y26[col] == v] wr = sub['盈利'].mean() print(f' {v}: {cnt}笔, 胜率{wr:.1%}') print() # 连续指标 for col in ['波动率分位', 'RSI分位', '趋势强度', '1日动量']: vals = y26[col].dropna() print(f'[{col}] min={vals.min():.3f}, max={vals.max():.3f}, mean={vals.mean():.3f}, median={vals.median():.3f}') print() # 逐笔明细 print('2026年逐笔明细:') print('-' * 100) for _, r in y26.iterrows(): win = 'WIN' if r['盈利'] else 'LOSS' date = str(r['开仓时间'])[:10] ms = str(r['市场状态']) vl = str(r['波动率水平']) rsi = str(r['RSI区域']) vq = r['波动率分位'] rq = r['RSI分位'] ts = r['趋势强度'] mom = r['1日动量'] t1 = str(r['T1调整']) pnl = r['盈亏金额'] print(f'{date} {win:4s} | 市场:{ms:<12} 波动:{vl:<5} 波动分位:{vq:.2f} RSI区:{rsi:<8} RSI分位:{rq:.3f} 趋强:{ts:.2f} 动量:{mom:.4f} T1:{t1[:6]} | {pnl:>+9,.0f}元') print() # 检查 "禁止条件" 在2026年会误杀多少笔 print('=' * 60) print('禁止条件在2026年的命中情况:') print() # 条件1: 市场状态 == 下跌趋势低波 c1 = y26['市场状态'] == '下跌趋势低波' print(f'条件1 [市场状态=下跌趋势低波]: {c1.sum()}笔被过滤') if c1.sum() > 0: sub = y26[c1] print(f' 其中胜率: {sub["盈利"].mean():.1%}, 盈亏: {sub["盈亏金额"].sum():+,.0f}元') # 条件2: 波动率水平 == 极高 c2 = y26['波动率水平'] == '极高' print(f'条件2 [波动率水平=极高]: {c2.sum()}笔被过滤') if c2.sum() > 0: sub = y26[c2] print(f' 其中胜率: {sub["盈利"].mean():.1%}, 盈亏: {sub["盈亏金额"].sum():+,.0f}元') # 条件3: 波动率分位 > 0.7 c3 = y26['波动率分位'] > 0.7 print(f'条件3 [波动率分位>0.7]: {c3.sum()}笔被过滤') if c3.sum() > 0: sub = y26[c3] print(f' 其中胜率: {sub["盈利"].mean():.1%}, 盈亏: {sub["盈亏金额"].sum():+,.0f}元') # 条件4: RSI区域 == 超卖 c4 = y26['RSI区域'] == '超卖' print(f'条件4 [RSI区域=超卖]: {c4.sum()}笔被过滤') if c4.sum() > 0: sub = y26[c4] print(f' 其中胜率: {sub["盈利"].mean():.1%}, 盈亏: {sub["盈亏金额"].sum():+,.0f}元') # 条件5: T+1调整 c5 = y26['T1调整'].str.contains('T0', na=False) print(f'条件5 [T1调整=T0→T1]: {c5.sum()}笔被过滤') if c5.sum() > 0: sub = y26[c5] print(f' 其中胜率: {sub["盈利"].mean():.1%}, 盈亏: {sub["盈亏金额"].sum():+,.0f}元') print() # 综合: 任意条件触发则过滤 any_filter = c1 | c2 | c3 | c4 | c5 print(f'任意禁止条件触发: {any_filter.sum()}笔被过滤 (共{len(y26)}笔)') kept = y26[~any_filter] filtered = y26[any_filter] print(f' 被过滤: {len(filtered)}笔, 胜率{filtered["盈利"].mean():.1%}, 盈亏{filtered["盈亏金额"].sum():+,.0f}元') print(f' 保留: {len(kept)}笔, 胜率{kept["盈利"].mean():.1%}, 盈亏{kept["盈亏金额"].sum():+,.0f}元')