跳到主内容

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-trade、eneros-trade-bid、eneros-trade-clearing、eneros-trade-settlement、eneros-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,以及电力市场专家提供的规则验证。