huice/check_buy1_price_decline.py
Your Name e5dd5b5593 feat: 期货数据分析工具集 v2.0
## 核心功能
### 1. 成交量序列分析 (volume_price_sequence.py)
- 按累计成交量排序的价格趋势分析
- 三合一综合图表:价格序列+成交量分布+时间序列
- 关键价格水平自动标注

### 2. 成交量分布深度分析 (volume_distribution_analysis.py)
- 7种专业可视化图表
- 统计特征分析和分布拟合
- 交易模式识别和业务洞察

### 3. 大额订单分析工具集 (large_orders/)
- 买1/卖1量大单分析 (阈值99)
- 买卖挂单合计分析 (阈值200)
- 当前成交量分析 (阈值150)
- 信号抑制优化算法 (38%抑制率)

## 技术特性
- 信号抑制算法:有效减少重复信号干扰
- 多维度分析:支持多种信号类型
- 专业可视化:四宫格综合分析图
- 业务洞察:基于数据的交易建议

## 分析结果
- 卖1量大单:短期下跌,长期大幅上涨反转
- 买挂合计:各时间窗口小幅正收益
- 信号抑制:短期收益从-0.0778提升至+0.1347

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-02 15:15:53 +08:00

194 lines
8.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
# -*- coding: utf-8 -*-
"""
检查买1量大于99的挂单后是否出现低于当前价格的数据
详细分析买1量大单出现后的价格行为验证是否真的全部上涨
"""
import pandas as pd
import numpy as np
import os
def check_buy1_price_decline():
"""检查买1量大单后的价格下跌情况"""
# 加载数据
data_file = 'data/au2512_20251013.parquet'
if not os.path.exists(data_file):
print(f"数据文件不存在: {data_file}")
return
print("正在加载数据...")
df = pd.read_parquet(data_file)
print(f"数据加载成功: {len(df):,} 条记录")
# 确保按数列号排序
if '数列号' in df.columns:
df = df.sort_values('数列号').reset_index(drop=True)
# 找到买1量列
buy1_col = None
for col in df.columns:
if '买1量' in col:
buy1_col = col
break
if buy1_col is None:
print("未找到买1量列")
return
print(f"使用买1量列: {buy1_col}")
# 筛选买1量大于99的数据
threshold = 99
large_buy1_mask = df[buy1_col] > threshold
large_buy1_orders = df[large_buy1_mask].copy().reset_index(drop=True)
print(f"\n买1量 > {threshold} 的记录数: {len(large_buy1_orders):,}")
print(f"占总记录比例: {len(large_buy1_orders)/len(df)*100:.2f}%")
if len(large_buy1_orders) == 0:
print("未找到符合条件的记录")
return
# 详细分析每个大单后的价格行为
print(f"\n" + "="*80)
print("买1量大单后价格行为详细分析")
print("="*80)
decline_100_count = 0
decline_200_count = 0
detailed_results = []
for idx, row in large_buy1_orders.iterrows():
current_seq_num = row['数列号'] if '数列号' in row else idx
current_price = row['成交价']
buy1_volume = row[buy1_col]
# 获取后续100笔数据
future_mask_100 = df['数列号'] >= current_seq_num + 1
future_data_100 = df[future_mask_100].head(100)
# 获取后续200笔数据
future_mask_200 = df['数列号'] >= current_seq_num + 1
future_data_200 = df[future_mask_200].head(200)
# 分析100笔内的价格行为
if len(future_data_100) > 0:
min_price_100 = future_data_100['成交价'].min()
max_price_100 = future_data_100['成交价'].max()
price_decline_100 = current_price - min_price_100 # 价格下跌幅度
price_rise_100 = max_price_100 - current_price # 价格上涨幅度
# 检查是否出现低于当前价格的情况
has_decline_100 = min_price_100 < current_price
if has_decline_100:
decline_100_count += 1
decline_info_100 = f"是 (最低: {min_price_100:.2f}, 下跌: {price_decline_100:.2f})"
else:
decline_info_100 = f"否 (最低: {min_price_100:.2f})"
# 分析200笔内的价格行为
if len(future_data_200) > 0:
min_price_200 = future_data_200['成交价'].min()
max_price_200 = future_data_200['成交价'].max()
price_decline_200 = current_price - min_price_200 # 价格下跌幅度
price_rise_200 = max_price_200 - current_price # 价格上涨幅度
# 检查是否出现低于当前价格的情况
has_decline_200 = min_price_200 < current_price
if has_decline_200:
decline_200_count += 1
decline_info_200 = f"是 (最低: {min_price_200:.2f}, 下跌: {price_decline_200:.2f})"
else:
decline_info_200 = f"否 (最低: {min_price_200:.2f})"
# 记录详细结果
detailed_results.append({
'序号': idx + 1,
'数列号': current_seq_num,
'当前价格': current_price,
'买1量': buy1_volume,
'100笔样本数': len(future_data_100),
'100笔最低价': min_price_100 if len(future_data_100) > 0 else None,
'100笔最高价': max_price_100 if len(future_data_100) > 0 else None,
'100笔是否下跌': has_decline_100 if len(future_data_100) > 0 else None,
'100笔下跌幅度': price_decline_100 if len(future_data_100) > 0 else None,
'100笔上涨幅度': price_rise_100 if len(future_data_100) > 0 else None,
'200笔样本数': len(future_data_200),
'200笔最低价': min_price_200 if len(future_data_200) > 0 else None,
'200笔最高价': max_price_200 if len(future_data_200) > 0 else None,
'200笔是否下跌': has_decline_200 if len(future_data_200) > 0 else None,
'200笔下跌幅度': price_decline_200 if len(future_data_200) > 0 else None,
'200笔上涨幅度': price_rise_200 if len(future_data_200) > 0 else None,
})
# 保存详细结果
results_df = pd.DataFrame(detailed_results)
results_df.to_csv('large_orders/buy1_detailed_price_analysis.csv', index=False, encoding='utf-8-sig')
# 打印汇总统计
print(f"\n【汇总统计】")
print(f"总样本数: {len(large_buy1_orders)}")
print(f"100笔内出现价格下跌的样本数: {decline_100_count} ({decline_100_count/len(large_buy1_orders)*100:.1f}%)")
print(f"200笔内出现价格下跌的样本数: {decline_200_count} ({decline_200_count/len(large_buy1_orders)*100:.1f}%)")
# 打印详细分析
print(f"\n【详细分析 - 前15个样本】")
print(f"{'序号':>4} {'数列号':>8} {'当前价格':>10} {'买1量':>8} {'100笔下跌?':>12} {'200笔下跌?':>12}")
print("-" * 80)
for i, result in enumerate(detailed_results[:15]):
decline_100_status = "" if result['100笔是否下跌'] else ""
decline_200_status = "" if result['200笔是否下跌'] else ""
print(f"{result['序号']:>4} {result['数列号']:>8.0f} {result['当前价格']:>10.2f} "
f"{result['买1量']:>8.0f} {decline_100_status:>12} {decline_200_status:>12}")
# 分析下跌样本的详细信息
decline_samples_100 = [r for r in detailed_results if r['100笔是否下跌']]
decline_samples_200 = [r for r in detailed_results if r['200笔是否下跌']]
if decline_samples_100:
print(f"\n【100笔内出现价格下跌的样本详情】")
for result in decline_samples_100:
print(f"序号{result['序号']}: 当前价格={result['当前价格']:.2f}, "
f"最低价格={result['100笔最低价']:.2f}, "
f"下跌幅度={result['100笔下跌幅度']:.2f}元, "
f"买1量={result['买1量']:.0f}")
if decline_samples_200:
print(f"\n【200笔内出现价格下跌的样本详情】")
for result in decline_samples_200:
print(f"序号{result['序号']}: 当前价格={result['当前价格']:.2f}, "
f"最低价格={result['200笔最低价']:.2f}, "
f"下跌幅度={result['200笔下跌幅度']:.2f}元, "
f"买1量={result['买1量']:.0f}")
# 价格波动统计
print(f"\n【价格波动统计】")
if len(detailed_results) > 0:
all_declines_100 = [r['100笔下跌幅度'] for r in detailed_results if r['100笔下跌幅度'] is not None]
all_rises_100 = [r['100笔上涨幅度'] for r in detailed_results if r['100笔上涨幅度'] is not None]
if all_declines_100:
avg_decline_100 = np.mean(all_declines_100)
max_decline_100 = np.max(all_declines_100)
print(f"100笔内平均下跌幅度: {avg_decline_100:.3f}")
print(f"100笔内最大下跌幅度: {max_decline_100:.3f}")
if all_rises_100:
avg_rise_100 = np.mean(all_rises_100)
max_rise_100 = np.max(all_rises_100)
print(f"100笔内平均上涨幅度: {avg_rise_100:.3f}")
print(f"100笔内最大上涨幅度: {max_rise_100:.3f}")
print(f"\n分析完成!详细结果已保存到: large_orders/buy1_detailed_price_analysis.csv")
return decline_100_count, decline_200_count
if __name__ == "__main__":
check_buy1_price_decline()