| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115 |
- #!/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}元')
|