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 次/分钟 | 实时监控 |
| 新增 Crate | 6 | 交易相关 |
| 新增测试 | 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(¤t_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(¤t_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-clearingLMP 计算在含无功约束时结果不稳定的问题(#4010) - 修复
eneros-trade-settlement偏差结算在跨时段时计算错误的问题(#4016) - 修复
eneros-trade市场接口在弱网下重试导致重复提交的问题(#4022) - 修复
eneros-trade-riskVaR 计算在数据缺失时崩溃的问题(#4028)
破坏性变更
BidEngine::generate_bid:参数新增&LoadForecastClearingEngine::clear:返回类型从ClearingResult改为Result<ClearingResult>SettlementEngine::settle_day_ahead:参数从Date改为MarketDate
升级指南
- 更新
Cargo.toml中的eneros依赖至0.40.0 - 运行
eneros trade init初始化交易引擎 - 在
eneros.toml中配置市场接口与风险参数 - 运行
eneros trade register注册市场参与者账户
致谢
感谢 42 位贡献者提交的 640+ 个 commit,以及电力市场专家提供的规则验证。