Files
sanguo_quant_live/zhaoyun-data/strategies/pure-breakout-20260327/rules

突破策略买卖规则目录

📋 规则体系设计

1. 规则层级结构

纯突破策略规则体系
├── 突破检测规则
│   ├── 价格突破规则
│   ├── 成交量确认规则
│   └── 过滤条件规则
├── 买入执行规则
│   ├── 买入时机规则
│   ├── 买入金额规则
│   └── 买入确认规则
├── 卖出执行规则
│   ├── 止盈规则
│   ├── 止损规则
│   ├── 移动止损规则
│   └── 强制卖出规则
└── 仓位管理规则
    ├── 初始仓位规则
    ├── 加仓规则
    └── 减仓规则

2. 核心规则定义

2.1 突破检测规则 (breakout_rules.py)

# rules/breakout_rules.py
from typing import Dict, List
import pandas as pd

class BreakoutRules:
    """突破检测规则集合"""
    
    def __init__(self, config: Dict):
        self.config = config
        
    def is_new_high_breakout(self, stock_data: pd.DataFrame) -> bool:
        """检测新高突破"""
        current_price = stock_data['close'].iloc[-1]
        prev_high = stock_data['high'].rolling(window=self.config['period']).max().iloc[-2]
        
        # 价格突破条件
        price_condition = current_price > prev_high * (1 + self.config['min_breakout_pct'])
        
        # 成交量确认

        volume_condition = self._check_volume_confirmation(stock_data)
        
        # 突破前震荡确认

        consolidation_condition = self._check_prior_consolidation(stock_data)
        
        return price_condition and volume_condition and consolidation_condition
    
    def is_range_breakout(self, stock_data: pd.DataFrame) -> bool:
        """检测区间突破"""
        # 确定区间范围

        recent_data = stock_data.tail(self.config['range_period'])
        resistance = recent_data['high'].max()
        support = recent_data['low'].min()
        
        current_price = stock_data['close'].iloc[-1]
        range_amplitude = (resistance - support) / support
        
        # 区间突破条件

        if self.config['breakout_direction'] == 'up':
            breakout_condition = (
                current_price > resistance and 
                range_amplitude >= self.config['min_range_amplitude']
            )
        else:
            breakout_condition = (
                current_price < support and 
                range_amplitude >= self.config['min_range_amplitude']
            )
        
        # 成交量确认

        volume_condition = self._check_volume_confirmation(stock_data)
        
        return breakout_condition and volume_condition
    
    def _check_volume_confirmation(self, stock_data: pd.DataFrame) -> bool:
        """成交量确认规则"""
        current_volume = stock_data['volume'].iloc[-1]
        avg_volume = stock_data['volume'].rolling(window=20).mean().iloc[-1]
        
        # 成交量要求

        return current_volume >= avg_volume * self.config['min_volume_ratio']
    
    def _check_prior_consolidation(self, stock_data: pd.DataFrame) -> bool:
        """突破前震荡确认规则"""
        # 检查突破前价格是否在一定范围内震荡

        lookback = self.config['consolidation_lookback']
        recent_data = stock_data.tail(lookback)
        
        price_range = recent_data['high'].max() - recent_data['low'].min()
        avg_price = recent_data['close'].mean()
        
        consolidation_ratio = price_range / avg_price
        
        return consolidation_ratio <= self.config['max_consolidation_ratio']

2.2 买入执行规则 (buy_rules.py)

# rules/buy_rules.py
from typing import Dict, Optional
import pandas as pd
from dataclasses import dataclass

@dataclass
class BuySignal:
    """买入信号"""
    stock_code: str
    signal_date: str
    signal_price: float
    signal_type: str  # 'new_high', 'range_breakout', 'pattern_breakout'
    confidence_score: float
    volume_ratio: float

class BuyRules:
    """买入执行规则集合"""
    
    def __init__(self, config: Dict):
        self.config = config
        
    def should_buy(self, signal: BuySignal, current_price: float) -> bool:
        """判断是否应该买入"""
        # 基本买入条件

        if not self._check_basic_buy_conditions(signal):
            return False
        
        # 价格确认

        if not self._check_price_confirmation(signal, current_price):
            return False
        
        # 风险控制

        if not self._check_risk_conditions(signal):
            return False
        
        return True
    
    def get_buy_price(self, signal: BuySignal, market_data: pd.DataFrame) -> float:
        """获取买入价格"""
        if self.config['buy_timing'] == 'close':
            # 突破日收盘价买入

            return signal.signal_price
        elif self.config['buy_timing'] == 'next_open':
            # 突破次日开盘价买入

            next_date = pd.to_datetime(signal.signal_date) + pd.Timedelta(days=1)
            next_data = market_data.loc[market_data['date'] >= next_date].iloc[0]
            return next_data['open']
        elif self.config['buy_timing'] == 'limit':
            # 限价买入

            return signal.signal_price * (1 + self.config['buy_limit_offset'])
        
        return signal.signal_price
    
    def get_buy_amount(self, signal: BuySignal, total_capital: float) -> float:
        """获取买入金额"""
        if self.config['buy_amount_type'] == 'percentage':
            # 按总资金比例买入

            base_amount = total_capital * self.config['buy_percentage']
            
            # 根据信号强度调整

            adjusted_amount = base_amount * signal.confidence_score
            
            # 单只股票最大仓位限制

            max_position = total_capital * self.config['max_position_per_stock']
            
            return min(adjusted_amount, max_position)
        
        elif self.config['buy_amount_type'] == 'fixed':
            # 固定金额买入

            return self.config['fixed_buy_amount']
        
        return 0
    
    def _check_basic_buy_conditions(self, signal: BuySignal) -> bool:
        """检查基本买入条件"""
        # 信号强度要求

        if signal.confidence_score < self.config['min_confidence_score']:
            return False
        
        # 成交量要求

        if signal.volume_ratio < self.config['min_volume_ratio']:
            return False
        
        # 突破类型启用检查

        breakout_type_enabled = self.config['breakout_types'].get(signal.signal_type, False)
        if not breakout_type_enabled:
            return False
        
        return True
    
    def _check_price_confirmation(self, signal: BuySignal, current_price: float) -> bool:
        """价格确认规则"""
        if not self.config['confirmation']['required']:
            return True
        
        # 价格确认条件

        price_change = (current_price - signal.signal_price) / signal.signal_price
        
        if self.config['confirmation']['direction'] == 'up':
            return price_change >= self.config['confirmation']['percentage']
        elif self.config['confirmation']['direction'] == 'down':
            return price_change <= -self.config['confirmation']['percentage']
        
        return True
    
    def _check_risk_conditions(self, signal: BuySignal) -> bool:
        """风险控制规则"""
        # 市场状态检查

        if self.config['market_state']['check_required']:
            # 检查市场是否处于可买入状态

            pass
        
        # 突破频率限制

        if self.config['frequency_limit']['enabled']:
            # 限制同一股票的买入频率

            pass
        
        return True

2.3 卖出执行规则 (sell_rules.py)

# rules/sell_rules.py
from typing import Dict, Optional
import pandas as pd
from dataclasses import dataclass

@dataclass
class SellSignal:
    """卖出信号"""
    stock_code: str
    signal_date: str
    signal_price: float
    signal_type: str  # 'take_profit', 'stop_loss', 'force_sell'
    profit_loss_pct: float
    holding_days: int

class SellRules:
    """卖出执行规则集合"""
    
    def __init__(self, config: Dict):
        self.config = config
        
    def should_sell(self, position: Dict, current_price: float, market_data: pd.DataFrame) -> Optional[SellSignal]:
        """判断是否应该卖出"""
        # 检查止盈条件

        take_profit_signal = self._check_take_profit(position, current_price)
        if take_profit_signal:
            return take_profit_signal
        
        # 检查止损条件

        stop_loss_signal = self._check_stop_loss(position, current_price)
        if stop_loss_signal:
            return stop_loss_signal
        
        # 检查强制卖出条件

        force_sell_signal = self._check_force_sell(position, current_price, market_data)
        if force_sell_signal:
            return force_sell_signal
        
        return None
    
    def _check_take_profit(self, position: Dict, current_price: float) -> Optional[SellSignal]:
        """检查止盈条件"""
        if not self.config['take_profit']['enabled']:
            return None
        
        buy_price = position['buy_price']
        holding_days = position['holding_days']
        
        current_profit_pct = (current_price - buy_price) / buy_price
        
        # 固定止盈

        if self.config['take_profit']['fixed']['enabled']:
            if current_profit_pct >= self.config['take_profit']['fixed']['percentage']:
                return SellSignal(
                    stock_code=position['stock_code'],
                    signal_date=pd.Timestamp.now().strftime('%Y-%m-%d'),
                    signal_price=current_price,
                    signal_type='take_profit',
                    profit_loss_pct=current_profit_pct,
                    holding_days=holding_days
                )
        
        # 动态止盈

        if self.config['take_profit']['dynamic']['enabled'] and 'highest_price' in position:
            highest_price = position['highest_price']
            
            trailing_stop_price = highest_price * (1 - self.config['take_profit']['dynamic']['trailing_stop_percentage'])
            
            if current_price <= trailing_stop_price:
                return SellSignal(
                    stock_code=position['stock_code'],
                    signal_date=pd.Timestamp.now().strftime('%Y-%m-%d'),
                    signal_price=current_price,
                    signal_type='take_profit',
                    profit_loss_pct=current_profit_pct,
                    holding_days=holding_days
                )
        
        # 时间止盈

        if self.config['take_profit']['time_based']['enabled']:
            if holding_days >= self.config['take_profit']['time_based']['max_holding_days']:
                return SellSignal(
                    stock_code=position['stock_code'],
                    signal_date=pd.Timestamp.now().strftime('%Y-%m-%d'),
                    signal_price=current_price,
                    signal_type='take_profit',
                    profit_loss_pct=current_profit_pct,
                    holding_days=holding_days
                )
        
        return None
    
    def _check_stop_loss(self, position: Dict, current_price: float) -> Optional[SellSignal]:
        """检查止损条件"""
        if not self.config['stop_loss']['enabled']:
            return None
        
        buy_price = position['buy_price']
        holding_days = position['holding_days']
        
        current_loss_pct = (current_price - buy_price) / buy_price
        
        # 固定止损

        if self.config['stop_loss']['fixed']['enabled']:
            if current_loss_pct <= -self.config['stop_loss']['fixed']['percentage']:
                return SellSignal(
                    stock_code=position['stock_code'],
                    signal_date=pd.Timestamp.now().strftime('%Y-%m-%d'),
                    signal_price=current_price,
                    signal_type='stop_loss',
                    profit_loss_pct=current_loss_pct,
                    holding_days=holding_days
                )
        
        # 移动止损

        if self.config['stop_loss']['moving']['enabled'] and 'highest_price' in position:
            highest_price = position['highest_price']
            
            moving_stop_price = highest_price * (1 - self.config['stop_loss']['moving']['percentage'])
            
            if current_price <= moving_stop_price:
                return SellSignal(
                    stock_code=position['stock_code'],
                    signal_date=pd.Timestamp.now().strftime('%Y-%m-%d'),
                    signal_price=current_price,
                    signal_type='stop_loss',
                    profit_loss_pct=current_loss_pct,
                    holding_days=holding_days
                )
        
        # 技术止损

        if self.config['stop_loss']['technical']['enabled']:
            # 检查是否跌破重要技术位
            pass
        
        return None
    
    def _check_force_sell(self, position: Dict, current_price: float, market_data: pd.DataFrame) -> Optional[SellSignal]:
        """检查强制卖出条件"""
        if not self.config['force_sell']['enabled']:
            return None
        
        buy_price = position['buy_price']
        holding_days = position['holding_days']
        
        current_pct = (current_price - buy_price) / buy_price
        
        # 成交量异常条件
        if self.config['force_sell']['volume_anomaly']['enabled']:
            volume_condition = self._check_volume_anomaly(position, market_data)
            if volume_condition:
                return SellSignal(
                    stock_code=position['stock_code'],
                    signal_date=pd.Timestamp.now().strftime('%Y-%m-%d'),
                    signal_price=current_price,
                    signal_type='force_sell',
                    profit_loss_pct=current_pct,
                    holding_days=holding_days
                )
        
        # 价格异常条件
        if self.config['force_sell']['price_anomaly']['enabled']:
            price_condition = self._check_price_anomaly(position, current_price)
            if price_condition:
                return SellSignal(
                    stock_code=position['stock_code'],
                    signal_date=pd.Timestamp.now().strftime('%Y-%m-%d'),
                    signal_price=current_price,
                    signal_type='force_sell',
                    profit_loss_pct=current_pct,
                    holding_days=holding_days
                )
        
        return None
    
    def _check_volume_anomaly(self, position: Dict, market_data: pd.DataFrame) -> bool:
        """检查成交量异常"""
        # 获取最近成交量数据
        recent_volume = market_data.tail(10)['volume']
        
        # 计算成交量比率
        avg_volume = recent_volume.mean()
        current_volume = market_data['volume'].iloc[-1]
        
        volume_ratio = current_volume / avg_volume
        
        return volume_ratio < self.config['force_sell']['volume_anomaly']['drop_ratio']
    
    def _check_price_anomaly(self, position: Dict, current_price: float) -> bool:
        """检查价格异常"""
        buy_price = position['buy_price']
        
        price_drop_pct = (current_price - buy_price) / buy_price
        
        return price_drop_pct <= -self.config['force_sell']['price_anomaly']['drop_percentage']

2.4 仓位管理规则 (position_rules.py)

# rules/position_rules.py
from typing import Dict, List
import pandas as pd

class PositionRules:
    """仓位管理规则集合"""
    
    def __init__(self, config: Dict):
        self.config = config
        
    def can_open_position(self, portfolio: Dict, stock_data: pd.DataFrame) -> bool:
        """判断是否可以开仓"""
        # 持仓数量限制
        if len(portfolio['positions']) >= self.config['max_positions']:
            return False
        
        # 资金使用率限制
        capital_usage = portfolio['total_value'] / portfolio['capital']
        if capital_usage >= self.config['max_capital_usage']:
            return False
        
        # 个股仓位限制
        stock_code = stock_data['code'].iloc[-1]
        existing_position = self._get_existing_position(portfolio, stock_code)
        if existing_position:
            current_weight = existing_position['value'] / portfolio['total_value']
            if current_weight >= self.config['max_position_per_stock']:
                return False
        
        # 行业暴露限制
        industry = stock_data['industry'].iloc[-1]
        industry_exposure = self._calculate_industry_exposure(portfolio, industry)
        if industry_exposure >= self.config['max_industry_exposure']:
            return False
        
        return True
    
    def should_add_position(self, position: Dict, current_price: float) -> bool:
        """判断是否应该加仓"""
        if not self.config['add_position']['enabled']:
            return False
        
        buy_price = position['buy_price']
        price_increase_pct = (current_price - buy_price) / buy_price
        
        # 价格涨幅条件
        if price_increase_pct >= self.config['add_position']['conditions']['price_increase']['percentage']:
            # 检查加仓次数限制
            add_count = position.get('add_count', 0)
            if add_count < self.config['add_position']['max_add_times']:
                return True
        
        return False
    
    def should_reduce_position(self, position: Dict, current_price: float) -> bool:
        """判断是否应该减仓"""
        if not self.config['reduce_position']['enabled']:
            return False
        
        buy_price = position['buy_price']
        current_profit_pct = (current_price - buy_price) / buy_price
        
        # 部分止盈条件
        if self.config['reduce_position']['partial_take_profit']['enabled']:
            if current_profit_pct >= self.config['reduce_position']['partial_take_profit']['percentage']:
                return True
        
        # 风险控制减仓
        if self.config['reduce_position']['risk_control']['enabled']:
            # 基于市场风险或个股风险判断
            pass
        
        return False
    
    def _get_existing_position(self, portfolio: Dict, stock_code: str) -> Optional[Dict]:
        """获取现有持仓"""
        for position in portfolio['positions']:
            if position['stock_code'] == stock_code:
                return position
        return None
    
    def _calculate_industry_exposure(self, portfolio: Dict, industry: str) -> float:
        """计算行业暴露"""
        industry_value = 0
        total_value = portfolio['total_value']
        
        for position in portfolio['positions']:
            if position.get('industry') == industry:
                industry_value += position['value']
        
        return industry_value / total_value if total_value > 0 else 0

3. 目录结构

rules/
├── README.md                      # 本说明文件
├── __init__.py                    # 规则包初始化
├── breakout_rules.py              # 突破检测规则
├── buy_rules.py                   # 买入执行规则
├── sell_rules.py                  # 卖出执行规则
├── position_rules.py              # 仓位管理规则
├── validation_rules.py             # 规则验证工具(待创建)
├── optimization_rules.py           # 规则优化工具(待创建)
└── test_rules.py                  # 规则测试模块(待创建)

4. 规则使用指南

4.1 规则初始化

from rules.breakout_rules import BreakoutRules
from rules.buy_rules import BuyRules
from rules.sell_rules import SellRules
from rules.position_rules import PositionRules

# 加载配置
import yaml
with open('configs/trading_config.yaml', 'r') as f:
    trading_config = yaml.safe_load(f)

# 创建规则实例
breakout_rules = BreakoutRules(trading_config['breakout'])
buy_rules = BuyRules(trading_config['buy'])
sell_rules = SellRules(trading_config['sell'])
position_rules = PositionRules(trading_config['position'])

4.2 规则执行流程

# 1. 检测突破信号
if breakout_rules.is_new_high_breakout(stock_data):
    # 2. 生成买入信号
    buy_signal = BuySignal(...)
    
    # 3. 检查买入条件
    if buy_rules.should_buy(buy_signal, current_price):
        # 4. 检查仓位限制
        if position_rules.can_open_position(portfolio, stock_data):
            # 执行买入
            pass

# 5. 监控卖出条件
sell_signal = sell_rules.should_sell(position, current_price, market_data)
if sell_signal:
    # 执行卖出
    pass

5. 规则优化

5.1 参数优化建议

  1. 回测验证: 在不同市场环境下测试规则
  2. 敏感性分析: 分析参数变化对绩效的影响
  3. 组合优化: 优化规则组合和权重

5.2 规则迭代流程

  1. 数据收集: 收集历史交易数据
  2. 规则测试: 测试新规则或参数
  3. 绩效评估: 评估规则改进效果
  4. 规则更新: 更新规则库和配置文件

6. 当前状态

已完成

  • 规则体系设计
  • 核心规则类实现
  • 规则框架建立

🔄 进行中

  • 规则优化算法开发
  • 规则验证工具实现
  • 规则性能测试

待开始

  • 机器学习规则发现
  • 实时规则监控系统
  • 规则版本管理系统

7. 联系人

规则设计: 待定(量化研究团队)
规则实现: 赵云(数据工程将军)
规则验证: 待定(风险管理团队)

开发状态: 规则体系设计完成,开始规则优化
预计完成: 核心规则模块本周内完成