跳到主内容

v0.40.0 版本说明

版本说明

EnerOS v0.40.0

发布日期:2026-06-20
版本代号:Trade
Git Tag:v0.40.0
支持状态:稳定(Stable)
Crate 总数:108(新增 6 个)
测试用例数:13500+(新增 700)

概述

EnerOS v0.40.0「Trade」是能源交易专题版本,将 EnerOS 的能力从「电网运行控制」延伸到「电力市场交易」,使发电企业、售电公司、电力用户能够在 EnerOS 平台上完成从报价、出清、结算到风险管理的全流程交易。本版本标志着 EnerOS 正式覆盖电力系统的「物理层 + 市场层」双栈能力。

Trade 版本的核心设计哲学是「交易即系统调用 + 约束即合规」——市场报价、出清计算、结算清算等操作通过内核系统调用完成,与调度、潮流、约束深度耦合。交易决策受内核约束引擎强制校验,确保报价策略在物理上可行、在合约上合规、在风险上可控。这使得 EnerOS 成为同时满足物理约束与市场规则的能源交易平台。

本版本引入五大核心能力:报价策略引擎市场出清系统结算清算系统市场接口网关风险管理框架。所有能力均通过 eneros-tradeeneros-trade-bideneros-trade-clearingeneros-trade-settlementeneros-trade-risk 五个新 crate 实现。

关键数据

指标数值说明
报价处理吞吐5 万条/秒单节点
出清计算延迟2.5s日前市场
结算精度0.01 元分级精度
风险评估频率1 次/分钟实时监控
新增 Crate6交易相关
新增测试700+含 120 个端到端

新特性

1. 报价策略引擎

新增 eneros-trade-bid crate,提供基于 AI 的报价策略生成能力,结合发电成本、负荷预测、市场行情、竞争对手分析生成最优报价。

报价生成

use eneros_trade_bid::{BidEngine, BidConfig, BidStrategy};

let engine = BidEngine::new(&ctx)
    .config(BidConfig {
        market: MarketType::DayAhead,
        strategy: BidStrategy::ReinforcementLearning {
            model: "bid-rl-dqn-v3",
            exploration: 0.05,
        },
        risk_appetite: RiskAppetite::Moderate,
        cost_model: CostModel::from_generator(&generator),
    })
    .build().await?;

// 生成日前市场报价
let bid = engine.generate_bid(
    MarketDate::tomorrow(),
    &load_forecast,
    &generation_capacity,
).await?;

println!("报价方案:");
for segment in &bid.segments {
    println!("  时段 {}: {:.1} MW @ {:.2} 元/MWh",
        segment.period, segment.volume_mw, segment.price);
}
println!("预计收入: {:.0} 元", bid.estimated_revenue);
println!("预计成本: {:.0} 元", bid.estimated_cost);
println!("预计利润: {:.0} 元", bid.estimated_profit);

报价策略类型

策略类型适用场景风险等级
成本加成经典保守经营
边际成本经典完全竞争
竞争对手分析博弈寡头市场
强化学习AI复杂市场中高
组合策略混合多目标可调

报价优化目标

// 多目标报价优化
let bid = engine.optimize(BidObjective::MultiObjective {
    profit: 0.6,        // 利润最大化 60%
    risk: 0.3,          // 风险最小化 30%
    market_share: 0.1,  // 市场份额 10%
}).await?;

// 约束条件
let constraints = BidConstraints {
    min_volume: 10.0,           // 最小申报量 10 MW
    max_volume: capacity,       // 最大申报量
    price_floor: 100.0,         // 最低报价 100 元/MWh
    price_ceiling: 1500.0,      // 最高报价 1500 元/MWh
    must_run: must_run_units,    // 必停机组
};

let bid = engine.optimize_with_constraints(constraints).await?;

2. 市场出清系统

新增 eneros-trade-clearing crate,提供电力市场出清计算能力,支持边际定价、节点边际电价(LMP)、分区定价等多种出清机制。

出清计算

use eneros_trade_clearing::{ClearingEngine, ClearingConfig, PricingMethod};

let engine = ClearingEngine::new(&ctx)
    .config(ClearingConfig {
        method: PricingMethod::LMP,  // 节点边际电价
        solver: ClearingSolver::MipSolver,
        security_constrained: true,   // 安全约束出清
        network_model: &network,
    })
    .build().await?;

// 收集所有报价
let bids = market.collect_bids(MarketDate::tomorrow()).await?;

// 执行出清
let result = engine.clear(bids).await?;

println!("出清结果:");
println!("  系统边际价格: {:.2} 元/MWh", result.system_marginal_price);
println!("  总成交电量: {:.1} MWh", result.total_cleared_mwh);
println!("  节点电价:");
for (bus, lmp) in &result.lmp {
    println!("    母线 {}: {:.2} 元/MWh", bus, lmp);
}

出清机制对比

机制定价方式适用市场复杂度
统一出清系统边际价简单市场
LMP节点边际电价现货市场
分区定价区域电价跨省市场
双结算虚拟+物理金融+物理

安全约束出清

// 含网络约束的出清(SCUC)
let result = engine.security_constrained_clearing(bids)
    .constraints(&[
        Constraint::line_flow_limit("L-1", 100.0),  // MW
        Constraint::voltage_range(bus_id, 0.95, 1.05),
        Constraint::n_1_contingency(vec!["L-1", "L-2"]),
    ])
    .solve().await?;

println!("出清状态: {:?}", result.status);
println!("计算耗时: {:?}", result.solve_time);

// 输出调度计划
for unit in &result.committed_units {
    println!("机组 {}: 出力 {:.1} MW, LMP {:.2} 元/MWh",
        unit.id, unit.output_mw, unit.lmp);
}

3. 结算清算系统

新增 eneros-trade-settlement crate,提供电力市场的结算与清算能力,支持日前结算、实时结算、辅助服务结算。

结算计算

use eneros_trade_settlement::{SettlementEngine, SettlementConfig};

let engine = SettlementEngine::new(&ctx)
    .config(SettlementConfig {
        precision: 2,  // 精确到分
        timezone: "Asia/Shanghai",
        settlement_rules: SettlementRules::latest(),
    })
    .build().await?;

// 日前市场结算
let settlement = engine.settle_day_ahead(
    MarketDate::from("2026-06-19"),
    &clearing_result,
    &actual_metering,
).await?;

println!("结算明细:");
println!("{:<15} {:<10} {:<10} {:<10} {:<12}",
    "机组", "申报量", "实际量", "电价", "结算金额");
for item in &settlement.items {
    println!("{:<15} {:<10.1} {:<10.1} {:<10.2} {:<12.2}",
        item.unit_id, item.bid_mw, item.actual_mw,
        item.price, item.amount);
}
println!("结算总额: {:.2} 元", settlement.total_amount);

// 偏差结算(实际 vs 计划)
let deviation = engine.settle_deviation(
    &clearing_result,
    &actual_metering,
).await?;
println!("偏差电量: {:.1} MWh", deviation.deviation_mwh);
println!("偏差费用: {:.2} 元", deviation.deviation_charge);

结算类型

结算类型频率依据说明
日前结算出清结果+计划主结算
实时结算小时实时出清+计量补充结算
偏差结算计划vs实际奖惩结算
辅助服务调度记录调频/备用
容量结算可用容量容量市场

结算对账

// 自动对账
let reconciliation = engine.reconcile(
    MarketDate::from("2026-06-19"),
    &internal_records,
    &market_operator_data,
).await?;

if reconciliation.has_discrepancies() {
    for disc in &reconciliation.discrepancies {
        println!("差异: {} 内部 {:.2} vs 交易中心 {:.2}",
            disc.item, disc.internal_amount, disc.market_amount);
    }
    // 自动提交争议
    engine.file_dispute(&reconciliation).await?;
}

4. 市场接口网关

新增 eneros-trade crate(交易核心),提供与电力交易中心的标准接口对接能力。

市场接口

use eneros_trade::{MarketGateway, MarketConfig, MarketApi};

let gateway = MarketGateway::new(MarketConfig {
    endpoint: "https://market.energy-exchange.cn/api/v2",
    auth: MarketAuth::Certificate {
        client_cert: "/etc/eneros/market-client.pem",
        ca: "/etc/eneros/market-ca.pem",
    },
    market: MarketOperator::Beijing,
}).await?;

// 提交报价
gateway.submit_bid(&bid).await?;

// 查询出清结果
let clearing = gateway.query_clearing(MarketDate::tomorrow()).await?;

// 查询结算数据
let settlement = gateway.query_settlement(MarketDate::today()).await?;

接口能力

接口方向频率说明
报价提交上行日前报价
报价修改上行截止前可改
出清查询下行出清结果
计划下发下行调度计划
计量数据下行小时实际电量
结算单下行结算明细
辅助服务双向实时调频/备用
争议提交上行按需结算争议

多市场接入

// 同时接入多个省级市场
let markets = MarketGateway::multi(vec![
    MarketConfig::beijing(),
    MarketConfig::shanghai(),
    MarketConfig::guangdong(),
]).await?;

// 跨市场套利分析
let arbitrage = markets.analyze_arbitrage().await?;
for opp in &arbitrage.opportunities {
    println!("套利机会: {} -> {}, 利差 {:.2} 元/MWh",
        opp.from_market, opp.to_market, opp.spread);
}

5. 风险管理框架

新增 eneros-trade-risk crate,提供交易全流程的风险识别、评估、控制能力。

风险评估

use eneros_trade_risk::{RiskManager, RiskConfig, RiskMetrics};

let risk_mgr = RiskManager::new(&ctx)
    .config(RiskConfig {
        var_confidence: 0.95,      // 95% 置信度
        var_horizon: Duration::days(1),
        max_var: 500_000,          // 最大 VaR 50 万元
        stress_scenarios: vec![
            StressScenario::price_spike(2.0),     // 价格翻倍
            StressScenario::load_drop(0.3),        // 负荷下降 30%
            StressScenario::unit_failure(0.2),     // 机组故障 20%
        ],
    })
    .build().await?;

// 实时风险评估
let risk = risk_mgr.assess(&current_portfolio).await?;

println!("风险指标:");
println!("  VaR (95%, 1天): {:.0} 元", risk.var);
println!("  CVaR: {:.0} 元", risk.cvar);
println!("  最大回撤: {:.1}%", risk.max_drawdown * 100.0);
println!("  风险评级: {:?}", risk.rating);

if risk.var > risk_mgr.config().max_var {
    // 触发风险告警
    risk_mgr.alert(RiskAlert::VarExceeded(risk.var)).await?;
}

风险类型

风险类型说明控制措施
价格风险市场价格波动套期保值
电量风险实际vs计划偏差偏差管理
信用风险交易对手违约保证金
操作风险系统故障冗余设计
合规风险违反市场规则规则引擎
流动性风险资金周转预算控制

风险对冲

// 生成风险对冲建议
let hedge = risk_mgr.suggest_hedge(&current_portfolio).await?;

for action in &hedge.actions {
    println!("对冲建议: {} (预计降低风险 {:.0} 元)",
        action.description, action.risk_reduction);
}

// 设置风险限额
risk_mgr.set_limits(RiskLimits {
    max_position: 1000.0,          // MW
    max_daily_loss: 100_000,       // 元
    max_deviation: 0.05,           // 5%
    max_exposure: 5_000_000,       // 元
}).await?;

// 超限自动平仓
risk_mgr.on_breach(|breach| {
    log::warn!("风险限额突破: {:?} = {:.0}", breach.type, breach.value);
    if breach.severity == Severity::Critical {
        risk_mgr.auto_closeout().await?;
    }
}).await?;

改进

  • 潮流计算:出清计算复用潮流引擎,效率提升 40%
  • 约束引擎:新增市场规则约束类型(报价上限、容量限制)
  • 时序引擎:交易数据支持按市场日历查询
  • Agent 运行时:新增 TradingAgent 类型,专门处理交易决策
  • 可观测性:交易链路全流程审计,满足监管要求

Bug 修复

  • 修复 eneros-trade-bid 强化学习模型在极端价格下报价异常的问题(#4003)
  • 修复 eneros-trade-clearing LMP 计算在含无功约束时结果不稳定的问题(#4010)
  • 修复 eneros-trade-settlement 偏差结算在跨时段时计算错误的问题(#4016)
  • 修复 eneros-trade 市场接口在弱网下重试导致重复提交的问题(#4022)
  • 修复 eneros-trade-risk VaR 计算在数据缺失时崩溃的问题(#4028)

破坏性变更

  • BidEngine::generate_bid:参数新增 &LoadForecast
  • ClearingEngine::clear:返回类型从 ClearingResult 改为 Result<ClearingResult>
  • SettlementEngine::settle_day_ahead:参数从 Date 改为 MarketDate

升级指南

  1. 更新 Cargo.toml 中的 eneros 依赖至 0.40.0
  2. 运行 eneros trade init 初始化交易引擎
  3. eneros.toml 中配置市场接口与风险参数
  4. 运行 eneros trade register 注册市场参与者账户

致谢

感谢 42 位贡献者提交的 640+ 个 commit,以及电力市场专家提供的规则验证。