stock/design/README.md
2026-02-27 03:17:12 +08:00

25 KiB
Raw Blame History

OpenClaw Trading - 生存压力驱动的量化交易系统设计文档

概述

结合 ClawWork 的生存压力机制 + TradingAgents 的多智能体架构 + abu 的因子系统,创建一个必须为自己的决策付费的交易 Agent 系统。


1. 系统架构

┌─────────────────────────────────────────────────────────────────┐
│                     OpenClaw Trading                           │
│                    生存压力驱动的量化系统                        │
├─────────────────────────────────────────────────────────────────┤
│                                                                 │
│  ┌──────────────┐    ┌──────────────┐    ┌──────────────┐      │
│  │   资金层     │◄──►│   Agent 层   │◄──►│   市场层     │      │
│  │  Capital     │    │  Multi-Agent │    │   Market     │      │
│  └──────────────┘    └──────────────┘    └──────────────┘      │
│         │                   │                   │              │
│         ▼                   ▼                   ▼              │
│  ┌──────────────────────────────────────────────────────┐      │
│  │                  生存压力引擎                         │      │
│  │  ┌──────────┐  ┌──────────┐  ┌──────────────────┐   │      │
│  │  │ 成本计算  │  │ 收益评估  │  │ 生存状态管理     │   │      │
│  │  │ Cost     │  │ Reward   │  │ Life State       │   │      │
│  │  └──────────┘  └──────────┘  └──────────────────┘   │      │
│  └──────────────────────────────────────────────────────┘      │
│                                                                 │
└─────────────────────────────────────────────────────────────────┘

2. 核心机制设计

2.1 经济压力模型(借鉴 ClawWork

class TradingEconomicTracker:
    """
    交易Agent经济追踪器
    每个Agent必须为自己的决策付费
    """

    def __init__(self,
                 agent_id: str,
                 initial_capital: float = 10000.0,  # 启动资金 $10,000
                 token_cost_per_1m_input: float = 2.5,
                 token_cost_per_1m_output: float = 10.0,
                 trade_fee_rate: float = 0.001):  # 交易手续费 0.1%

        self.balance = initial_capital
        self.token_costs = 0.0
        self.trade_costs = 0.0
        self.realized_pnl = 0.0

        # 生存状态阈值
        self.thresholds = {
            'thriving': initial_capital * 1.5,   # 盈利 50%+
            'stable': initial_capital * 1.1,      # 盈利 10%+
            'struggling': initial_capital * 0.8,  # 亏损 20%+
            'bankrupt': initial_capital * 0.3     # 亏损 70%+
        }

    def calculate_decision_cost(self,
                                tokens_input: int,
                                tokens_output: int,
                                market_data_calls: int) -> float:
        """
        计算每次决策的成本
        """
        llm_cost = (tokens_input / 1e6 * self.token_cost_per_1m_input +
                    tokens_output / 1e6 * self.token_cost_per_1m_output)

        data_cost = market_data_calls * 0.01  # 每次数据调用 $0.01

        total_cost = llm_cost + data_cost
        self.token_costs += total_cost
        self.balance -= total_cost

        return total_cost

    def calculate_trade_cost(self,
                            trade_value: float,
                            is_win: bool,
                            win_amount: float = 0.0,
                            loss_amount: float = 0.0) -> dict:
        """
        计算交易成本和收益
        """
        fee = trade_value * self.trade_fee_rate
        self.trade_costs += fee
        self.balance -= fee

        pnl = win_amount - loss_amount - fee
        self.realized_pnl += pnl
        self.balance += pnl

        return {
            'fee': fee,
            'pnl': pnl,
            'balance': self.balance,
            'status': self.get_survival_status()
        }

    def get_survival_status(self) -> str:
        """获取生存状态"""
        if self.balance >= self.thresholds['thriving']:
            return '🚀 thriving'      # 繁荣 - 可扩张交易规模
        elif self.balance >= self.thresholds['stable']:
            return '💪 stable'        # 稳定 - 正常交易
        elif self.balance >= self.thresholds['struggling']:
            return '⚠️ struggling'    # 挣扎 - 只能做小单
        elif self.balance >= self.thresholds['bankrupt']:
            return '🔴 critical'      # 危急 - 只能模拟交易
        else:
            return '💀 bankrupt'      # 破产 - 被淘汰

2.2 多 Agent 角色设计(借鉴 TradingAgents

class TradingAgentTeam:
    """
    交易Agent团队
    每个Agent都有自己的资金账户和生存压力
    """

    def __init__(self):
        self.agents = {
            # 分析师团队 - 成本低,收费少
            'market_analyst': AnalystAgent(
                role='market',
                decision_cost=0.05,  # 每次分析 $0.05
                min_balance=50
            ),
            'sentiment_analyst': AnalystAgent(
                role='sentiment',
                decision_cost=0.08,
                min_balance=80
            ),
            'fundamental_analyst': AnalystAgent(
                role='fundamental',
                decision_cost=0.10,
                min_balance=100
            ),

            # 研究员团队 - 中等成本
            'bull_researcher': ResearcherAgent(
                stance='bull',
                decision_cost=0.15,
                min_balance=150
            ),
            'bear_researcher': ResearcherAgent(
                stance='bear',
                decision_cost=0.15,
                min_balance=150
            ),

            # 风险管理 - 高成本但必要
            'risk_manager': RiskManagerAgent(
                decision_cost=0.20,
                min_balance=200
            ),

            # 交易员 - 执行决策,成本最高
            'trader': TraderAgent(
                decision_cost=0.30,
                min_balance=500,
                trade_fee_rate=0.001
            )
        }

2.3 工作-交易权衡机制ClawWork 核心机制)

class WorkTradeBalance:
    """
    工作-交易权衡系统
    Agent需要决定立即交易赚钱 vs 学习提升能力
    """

    def decide_activity(self, agent: Agent) -> str:
        """
        根据当前经济状态决定是交易还是学习
        """
        status = agent.economic_tracker.get_survival_status()
        skill_level = agent.skill_level
        win_rate = agent.historical_win_rate

        # 决策逻辑
        if status == '💀 bankrupt':
            return 'liquidate'  # 清仓,停止交易

        elif status == '🔴 critical':
            # 危急状态:只能做最有把握的交易
            if win_rate > 0.7 and skill_level > 0.8:
                return 'conservative_trade'
            else:
                return 'paper_trade'  # 模拟交易,学习为主

        elif status == '⚠️ struggling':
            # 挣扎状态:谨慎交易,适当学习
            if win_rate < 0.5:
                return 'learn'  # 胜率低,先学习
            else:
                return 'selective_trade'  # 选择性交易

        elif status == '💪 stable':
            # 稳定状态:正常交易 + 适度学习
            if skill_level < 0.6:
                return 'learn'  # 投资自己
            else:
                return 'normal_trade'

        elif status == '🚀 thriving':
            # 繁荣状态:可以承担更多风险
            if skill_level < 0.9:
                return 'aggressive_learn'  # 大量投资学习
            else:
                return 'aggressive_trade'  # 扩大交易规模

2.4 学习投资系统

class LearningInvestment:
    """
    学习投资系统
    Agent可以投资学习来提升交易能力
    """

    LEARNING_COURSES = {
        'technical_analysis': {
            'cost': 100.0,           # 学费 $100
            'duration_days': 7,      # 学习周期 7天
            'skill_improvement': 0.1, # 技能提升 10%
            'win_rate_boost': 0.05    # 胜率提升 5%
        },
        'risk_management': {
            'cost': 150.0,
            'duration_days': 10,
            'skill_improvement': 0.15,
            'max_drawdown_reduction': 0.1
        },
        'market_psychology': {
            'cost': 200.0,
            'duration_days': 14,
            'skill_improvement': 0.2,
            'sentiment_accuracy_boost': 0.1
        },
        'advanced_strategies': {
            'cost': 500.0,
            'duration_days': 30,
            'skill_improvement': 0.3,
            'new_strategy_unlock': True
        }
    }

    def enroll_course(self, agent: Agent, course_name: str) -> bool:
        """
        报名学习课程
        """
        course = self.LEARNING_COURSES[course_name]

        # 检查是否有足够资金
        if agent.balance < course['cost'] * 1.5:  # 保留50%安全边际
            return False

        # 扣除学费
        agent.balance -= course['cost']

        # 开始学习
        agent.learning_status = {
            'course': course_name,
            'start_date': datetime.now(),
            'end_date': datetime.now() + timedelta(days=course['duration_days']),
            'expected_improvement': course['skill_improvement']
        }

        return True

2.5 交易因子插件系统(借鉴 abu

class FactorPluginSystem:
    """
    因子插件系统
    Agent可以购买/解锁因子来提升交易能力
    """

    AVAILABLE_FACTORS = {
        # 基础因子 - 免费
        'moving_average_cross': {
            'cost': 0,
            'type': 'buy',
            'description': '均线金叉策略'
        },
        'rsi_oversold': {
            'cost': 0,
            'type': 'buy',
            'description': 'RSI超卖反弹'
        },

        # 进阶因子 - 付费解锁
        'bollinger_squeeze': {
            'cost': 50.0,
            'type': 'buy',
            'description': '布林带挤压突破'
        },
        'macd_divergence': {
            'cost': 80.0,
            'type': 'buy',
            'description': 'MACD背离信号'
        },

        # 高级因子 - 昂贵但强大
        'machine_learning_pred': {
            'cost': 500.0,
            'type': 'buy',
            'description': '机器学习预测模型'
        },
        'sentiment_momentum': {
            'cost': 300.0,
            'type': 'buy',
            'description': '情绪动量策略'
        },

        # 卖出因子
        'atr_trailing_stop': {
            'cost': 100.0,
            'type': 'sell',
            'description': 'ATR追踪止损'
        },
        'time_decay_exit': {
            'cost': 150.0,
            'type': 'sell',
            'description': '时间衰减退出'
        }
    }

    def purchase_factor(self, agent: Agent, factor_name: str) -> bool:
        """
        购买因子
        """
        factor = self.AVAILABLE_FACTORS[factor_name]

        if agent.balance < factor['cost'] * 1.2:  # 保留20%缓冲
            return False

        agent.balance -= factor['cost']
        agent.unlocked_factors.append(factor_name)

        return True

2.6 风险评估与拦截系统(借鉴 abu UMP

class SurvivalRiskManager:
    """
    生存风险管理系统
    防止Agent因高风险交易而破产
    """

    def evaluate_trade_risk(self, agent: Agent, trade_signal: dict) -> dict:
        """
        评估交易对Agent生存的风险
        """
        balance = agent.balance
        status = agent.economic_tracker.get_survival_status()

        # 风险指标
        position_size = trade_signal['position_size']
        stop_loss = trade_signal['stop_loss']
        max_loss = position_size * stop_loss

        risk_assessment = {
            'approved': False,
            'risk_level': 'unknown',
            'max_position_size': 0,
            'reason': ''
        }

        # 根据生存状态限制风险
        if status == '💀 bankrupt':
            risk_assessment['reason'] = 'Agent已破产禁止交易'
            return risk_assessment

        elif status == '🔴 critical':
            # 危急状态最大损失不能超过余额的1%
            max_risk = balance * 0.01
            if max_loss > max_risk:
                risk_assessment['reason'] = f'风险过高,最大允许损失: ${max_risk:.2f}'
                risk_assessment['max_position_size'] = max_risk / stop_loss
            else:
                risk_assessment['approved'] = True
                risk_assessment['risk_level'] = 'extreme_low'

        elif status == '⚠️ struggling':
            max_risk = balance * 0.03  # 3%风险
            if max_loss > max_risk:
                risk_assessment['max_position_size'] = max_risk / stop_loss
            else:
                risk_assessment['approved'] = True
                risk_assessment['risk_level'] = 'low'

        elif status == '💪 stable':
            max_risk = balance * 0.05  # 5%风险
            if max_loss > max_risk:
                risk_assessment['max_position_size'] = max_risk / stop_loss
            else:
                risk_assessment['approved'] = True
                risk_assessment['risk_level'] = 'medium'

        elif status == '🚀 thriving':
            max_risk = balance * 0.10  # 10%风险
            if max_loss > max_risk:
                risk_assessment['max_position_size'] = max_risk / stop_loss
            else:
                risk_assessment['approved'] = True
                risk_assessment['risk_level'] = 'high'

        return risk_assessment

3. 核心工作流程

class OpenClawTradingWorkflow:
    """
    OpenClaw Trading 核心工作流
    """

    async def execute_trading_cycle(self, agent_team: TradingAgentTeam, symbol: str):
        """
        执行一个交易周期
        """

        # Step 1: 检查每个Agent的生存状态
        for agent_name, agent in agent_team.agents.items():
            status = agent.economic_tracker.get_survival_status()
            if status == '💀 bankrupt':
                logger.warning(f'{agent_name} 已破产跳过该Agent')
                continue

        # Step 2: 决定活动(交易还是学习)
        work_trade = WorkTradeBalance()
        activities = {}
        for agent_name, agent in agent_team.agents.items():
            activities[agent_name] = work_trade.decide_activity(agent)

        # Step 3: 如果决定学习,执行学习
        for agent_name, activity in activities.items():
            if 'learn' in activity:
                await self.execute_learning(agent_team.agents[agent_name])

        # Step 4: 市场分析(分析师团队)
        analysis_results = {}
        for analyst_name in ['market_analyst', 'sentiment_analyst', 'fundamental_analyst']:
            analyst = agent_team.agents[analyst_name]
            if activities[analyst_name] in ['normal_trade', 'selective_trade', 'conservative_trade']:
                # 扣除分析成本
                cost = analyst.economic_tracker.calculate_decision_cost(
                    tokens_input=2000,
                    tokens_output=500,
                    market_data_calls=5
                )
                analysis_results[analyst_name] = await analyst.analyze(symbol)
                logger.info(f'{analyst_name} 分析完成,成本: ${cost:.4f}')

        # Step 5: 研究员辩论(看多 vs 看空)
        if activities['bull_researcher'] in ['normal_trade', 'selective_trade']:
            bull_view = await agent_team.agents['bull_researcher'].debate(
                analysis_results, 'bull'
            )

        if activities['bear_researcher'] in ['normal_trade', 'selective_trade']:
            bear_view = await agent_team.agents['bear_researcher'].debate(
                analysis_results, 'bear'
            )

        # Step 6: 风险评估
        risk_assessment = await agent_team.agents['risk_manager'].assess_risk(
            bull_view, bear_view, symbol
        )

        # Step 7: 交易决策
        if risk_assessment['approved']:
            trader = agent_team.agents['trader']

            # 生存风险管理
            survival_risk = SurvivalRiskManager()
            trade_approval = survival_risk.evaluate_trade_risk(
                trader, risk_assessment['trade_signal']
            )

            if trade_approval['approved']:
                # 执行交易
                result = await trader.execute_trade(
                    symbol,
                    risk_assessment['trade_signal'],
                    max_position=trade_approval.get('max_position_size')
                )

                # 计算交易后的经济状态
                trade_cost_result = trader.economic_tracker.calculate_trade_cost(
                    trade_value=result['value'],
                    is_win=result['pnl'] > 0,
                    win_amount=max(0, result['pnl']),
                    loss_amount=max(0, -result['pnl'])
                )

                logger.info(f'交易执行: {result}')
                logger.info(f'经济状况: {trade_cost_result}')

        # Step 8: 反思与学习BM25 记忆系统)
        await agent_team.reflect_and_learn()

        return {
            'activities': activities,
            'analysis': analysis_results,
            'trades': result if 'result' in locals() else None,
            'economic_status': {
                name: agent.economic_tracker.get_survival_status()
                for name, agent in agent_team.agents.items()
            }
        }

4. 可视化仪表板

class SurvivalDashboard:
    """
    生存状态实时仪表板
    """

    def render(self, agent_team: TradingAgentTeam):
        """
        渲染实时仪表板
        """
        console = Console()

        # 创建Agent状态表格
        table = Table(title="Agent 生存状态")
        table.add_column("Agent", style="cyan")
        table.add_column("余额", justify="right")
        table.add_column("状态", justify="center")
        table.add_column("胜率", justify="right")
        table.add_column("技能等级", justify="right")
        table.add_column("已解锁因子", justify="center")

        for name, agent in agent_team.agents.items():
            status = agent.economic_tracker.get_survival_status()
            status_color = {
                '🚀 thriving': 'green',
                '💪 stable': 'blue',
                '⚠️ struggling': 'yellow',
                '🔴 critical': 'red',
                '💀 bankrupt': 'dim'
            }.get(status, 'white')

            table.add_row(
                name,
                f"${agent.balance:,.2f}",
                f"[{status_color}]{status}[/{status_color}]",
                f"{agent.win_rate:.1%}",
                f"{agent.skill_level:.1%}",
                str(len(agent.unlocked_factors))
            )

        console.print(table)

        # 经济压力曲线图
        self.render_pressure_chart(agent_team)

        # 交易盈亏分布
        self.render_pnl_distribution(agent_team)

5. 配置示例

{
  "openclaw_trading": {
    "initial_capital": {
      "market_analyst": 1000,
      "sentiment_analyst": 1000,
      "fundamental_analyst": 1000,
      "bull_researcher": 2000,
      "bear_researcher": 2000,
      "risk_manager": 3000,
      "trader": 10000
    },

    "cost_structure": {
      "llm_input_per_1m": 2.5,
      "llm_output_per_1m": 10.0,
      "market_data_per_call": 0.01,
      "trade_fee_rate": 0.001
    },

    "survival_thresholds": {
      "thriving_multiplier": 1.5,
      "stable_multiplier": 1.1,
      "struggling_multiplier": 0.8,
      "bankrupt_multiplier": 0.3
    },

    "learning_courses": {
      "enabled": true,
      "auto_enroll": false,
      "min_balance_ratio": 1.2
    },

    "factor_market": {
      "enabled": true,
      "free_factors": ["moving_average_cross", "rsi_oversold"],
      "premium_factors": ["machine_learning_pred", "sentiment_momentum"]
    }
  }
}

6. 系统特点总结

特性 设计来源 说明
💰 经济压力 ClawWork 每个Agent必须为自己的token和交易付费
🎯 生存状态 ClawWork 5级生存状态影响交易权限和风险承受
📚 学习投资 ClawWork Agent可投资学习提升能力但需权衡成本
🤖 多Agent协作 TradingAgents 分析师、研究员、风险管理、交易员分工
🧠 记忆系统 TradingAgents BM25离线记忆从过往交易中学习
📊 因子插件 abu 可购买解锁的交易策略因子
🛡️ 风险拦截 abu UMP 基于生存状态的动态风险限制

7. 实现路线图

第一阶段:基础框架

  • 实现基础经济追踪器
  • 单Agent交易能力
  • 生存状态管理
  • 基础CLI界面

第二阶段多Agent协作

  • 添加多Agent协作架构
  • 实现辩论机制
  • 工作流编排
  • 记忆系统集成

第三阶段:高级功能

  • 因子市场系统
  • 学习投资系统
  • 风险管理拦截
  • 可视化仪表板

第四阶段:生产就绪

  • 完善监控系统
  • 添加回测能力
  • 性能优化
  • 文档和示例

8. 参考项目

项目 核心借鉴 路径
ClawWork 经济压力机制、生存状态 /Users/cillin/workspeace/stock/reference/ClawWork
TradingAgents 多智能体架构、BM25记忆 /Users/cillin/workspeace/stock/reference/TradingAgents
abu 因子插件系统、UMP风险拦截 /Users/cillin/workspeace/stock/reference/abu
daily_stock_analysis 数据源管理、通知推送 /Users/cillin/workspeace/stock/reference/daily_stock_analysis
Lean 回测引擎、性能优化 /Users/cillin/workspeace/stock/reference/Lean

9. 调研报告目录

所有参考项目的详细调研报告保存在:

/Users/cillin/workspeace/stock/report/
├── abu_report.md                    # 阿布量化系统
├── ClawWork_report.md               # AI经济生存基准测试
├── daily_stock_analysis_report.md   # 每日股票分析系统
├── Lean_report.md                   # 量化交易平台(待生成)
└── TradingAgents_report.md          # 多智能体交易框架

10. Phase 4 实现完成

完成时间: 2026-02-25

已完成模块

任务 模块 文件数 状态
TASK-045 策略框架基类 7 完成
TASK-046 策略组合管理器 5 完成
TASK-047 策略回测对比 5 完成
TASK-048 Agent学习记忆 3 完成
TASK-049 策略优化器 6 完成
TASK-050 进化算法集成 6 完成

代码统计

  • Python 文件: 64 个
  • 测试文件: 17 个
  • 测试用例: 300+

功能验证

运行 python demo_phase4.py 验证所有功能:

  • 策略框架基类 (Strategy, Signal, StrategyContext)
  • 策略组合管理 (StrategyPortfolio, 权重分配)
  • 策略回测对比 (ComparisonMetrics, StrategyComparator)
  • Agent学习记忆 (LearningMemory, BM25Index)
  • 策略优化器 (GridSearch, RandomSearch, Bayesian)
  • 进化算法 (GeneticAlgorithm, EvolutionEngine, NSGA2)

实现路线图更新

第一阶段:基础框架

  • 实现基础经济追踪器
  • 单Agent交易能力
  • 生存状态管理
  • 基础CLI界面

第二阶段多Agent协作

  • 添加多Agent协作架构
  • 实现辩论机制
  • 工作流编排
  • 记忆系统集成

🔄 第三阶段:高级功能 (进行中)

  • 因子市场系统
  • 学习投资系统
  • 风险管理拦截
  • 可视化仪表板

第四阶段:生产就绪

  • 完善监控系统
  • 添加回测能力
  • 性能优化
  • 文档和示例

设计文档版本: 1.1 Phase 4 完成时间: 2026-02-25 设计来源: Claude Code 基于多项目分析