尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

电价预测实战:从边际成本定价到LightGBM分位数模型

电价预测实战:从边际成本定价到LightGBM分位数模型 简介这份文档面向电力市场、能源经济及相关专业的学习者与从业者系统讲解电价的基本理论与预测方法帮助读者理解电价形成机制、定价原则及影响因素适合作为课程学习或市场分析的参考材料。资源包内含1个doc文件约177KB内容围绕电价确定方法、电价分类、影响电价的内外部因素以及电价预测思路展开涵盖竞争导向定价法、成本导向定价法与边际成本定价法并梳理上网电价、输电电价、配电电价和销售电价的构成逻辑。目前已有169人学习浏览。通过这份资料读者可掌握电价制定的成本补偿、合理收益、依法计税与公平负担等原则理解政府政策、税收、发电成本、负荷波动、发电商报价及气象突发事件对电价的影响并建立从理论到预测的分析框架为电力市场研究、成本测算与价格趋势判断提供参考。1. 电价预测这件事难在把“电”当成普通商品就输了很多做数据的人第一次接触电力市场会下意识把电价当成股票或油价来建模有历史序列、有周期、有波动套个 LSTM 或 ARIMA 就能出结果。真跑起来才发现电价会突然从 300 元/MWh 跳到 1500 元/MWh也会在中午光伏大发时跌到零甚至负值模型误差大得离谱。原因在于电有物理约束——不能大规模经济存储供需必须实时平衡输电还有阻塞。这就决定了电价的基本理论不是金融资产定价那一套而是边际成本定价加上容量约束的影子价格。这篇内容面向电力市场的数据分析、算法和交易支持岗位也适合刚转进能源行业的 IT 从业者。我会先把电价形成的理论骨架讲清楚再落到可复现的预测流程数据怎么取、特征怎么造、模型怎么选、参数怎么调、误差怎么归因。读完你应该能自己搭一条从原始负荷/新能源数据到日前电价预测的流水线并且知道哪些坑是理论层面就注定的。2. 电价基本理论从边际成本到节点电价的推导链2.1 边际成本定价与电能的“不可存储”约束电力市场的定价起点是经济调度在满足负荷和机组约束的前提下让总发电成本最小。拉格朗日乘子对负荷求偏导得到的就是系统边际电价SMP。用一段简化代码表达这个逻辑比看公式更直观。import numpy as np from scipy.optimize import minimize # 三台机组的成本系数成本 a*P^2 b*P c units [ {a: 0.002, b: 30, c: 100, pmin: 50, pmax: 300}, {a: 0.004, b: 25, c: 80, pmin: 30, pmax: 250}, {a: 0.001, b: 40, c: 120, pmin: 20, pmax: 200}, ] load 450 # 系统负荷 MW def total_cost(P): return sum(u[a]*p**2 u[b]*p u[c] for u, p in zip(units, P)) cons [{type: eq, fun: lambda P: np.sum(P) - load}] bounds [(u[pmin], u[pmax]) for u in units] res minimize(total_cost, x0[150, 150, 150], boundsbounds, constraintscons) # 用微小扰动求边际价格 eps 0.1 cons_eps [{type: eq, fun: lambda P: np.sum(P) - (load eps)}] res_eps minimize(total_cost, x0res.x, boundsbounds, constraintscons_eps) smp (res_eps.fun - res.fun) / eps print(f机组出力: {res.x.round(2)}, 系统边际电价: {smp:.2f} 元/MWh)这段代码用二次成本函数和出力上下限约束做经济调度再通过负荷加 0.1 MW 的扰动计算边际成本得到的就是 SMP。参数a越大代表机组越不经济pmin/pmax是物理爬坡和最小技术出力约束。实际市场中还要加入启停成本、爬坡速率和备用约束但定价的核心逻辑不变电价由最后一台满足负荷的边际机组成本决定。2.2 节点电价 LMP 的三个分量与阻塞的影子价格实际市场多用节点边际电价LMP它等于系统能量价格、阻塞价格和网损价格之和。阻塞分量来自线路传输极限的对偶变量是电价空间差异的根源。分量来源典型场景能量分量系统负荷平衡约束的对偶变量全网统一随负荷升高阻塞分量线路潮流约束的对偶变量送出受限地区价格被压低网损分量网损近似函数的偏导通常较小重载时上升理解这张表对预测很关键如果你只按系统负荷预测一个全网统一价在阻塞频繁的区域会系统性偏差。常见做法是分节点或分区建模把阻塞作为独立特征或分段条件。2.3 为什么电价分布是尖峰厚尾的供需曲线在接近可用容量上限时变得极陡负荷的小幅波动会引发价格大幅跳升。同时新能源出力预测误差让供需两侧都有随机性。这两点叠加使电价分布呈现尖峰、厚尾、偶尔负值。用正态假设的模型会严重低估极端价格后面选损失函数时要专门处理。3. 电价预测的数据工程特征构造与预处理3.1 数据源清单与对齐口径预测日前电价输入通常包括历史电价、系统负荷预测、新能源风/光出力预测、机组检修计划、联络线计划、天气预报。时间粒度一般是 15 分钟或 1 小时国内日前市场多为 24 点或 96 点曲线。import pandas as pd # 假设各源已导出为 csv时间列为 datetime price pd.read_csv(price.csv, parse_dates[ts]).set_index(ts) load pd.read_csv(load_forecast.csv, parse_dates[ts]).set_index(ts) wind pd.read_csv(wind_forecast.csv, parse_dates[ts]).set_index(ts) df price.join([load, wind], howinner) df df.resample(1h).mean() # 统一到小时粒度 df df.interpolate(limit2) # 最多补 2 个点避免长段插值失真 df[net_load] df[load] - df[wind] # 净负荷核心特征 print(df.describe())resample(1h).mean()把不同粒度的数据统一interpolate(limit2)限制插值长度是防止把缺失当真实趋势。net_load是净负荷它比原始负荷更能反映火电需要承担的份额是电价预测里最有效的单特征之一。3.2 时间特征与滞后特征的构造电价有强日周期和周周期还有明显的滞后依赖。构造这些特征时要注意预测 D 日电价时D-1 日同时刻电价可用但 D 日同时刻不可用否则就是数据泄漏。df[hour] df.index.hour df[weekday] df.index.weekday df[is_weekend] (df[weekday] 5).astype(int) # 滞后特征只用预测时点之前已知的值 df[price_lag24] df[price].shift(24) # 昨日同时刻 df[price_lag168] df[price].shift(168) # 上周同时刻 df[net_load_lag24] df[net_load].shift(24) # 滚动统计shift(1) 保证不含当前时刻 df[price_roll_mean7] df[price].shift(1).rolling(24*7).mean() df df.dropna()shift(24)对应日周期shift(168)对应周周期。滚动均值前先shift(1)是硬性要求否则当前时刻的真实价格会混进特征线下指标好看、上线直接崩。这一步是新手最常踩的坑。3.3 异常值与负电价的处理策略电价数据里会有采集故障导致的极端值也会有真实的负电价。两者要区别对待前者该修后者该留。注意不要用简单的 3σ 规则一刀切负电价和尖峰都是真实市场信号删掉它们等于把模型最该学的部分扔了。常见做法是设定物理上下限比如 -500 到 5000 元/MWh超出范围的视为采集错误并置为缺失范围内的极端值保留。对负电价可以加一个指示特征is_negative让模型自己学它的触发条件。4. 电价预测模型选型与调参实战4.1 基线模型从持久化到线性回归任何预测项目都该先有基线。电价预测最朴素的基线是“昨日同时刻价格”即price_lag24。如果复杂模型打不过它说明特征或流程有问题。from sklearn.linear_model import Ridge from sklearn.metrics import mean_absolute_error features [net_load, hour, is_weekend, price_lag24, price_lag168, net_load_lag24, price_roll_mean7] X, y df[features], df[price] split int(len(df) * 0.8) X_train, X_test X.iloc[:split], X.iloc[split:] y_train, y_test y.iloc[:split], y.iloc[split:] base_pred X_test[price_lag24] print(基线 MAE:, mean_absolute_error(y_test, base_pred)) model Ridge(alpha1.0) model.fit(X_train, y_train) print(Ridge MAE:, mean_absolute_error(y_test, model.predict(X_test)))alpha是 L2 正则强度电价特征之间相关性高适当加大 alpha 能抑制过拟合。先跑基线再跑 Ridge能快速判断特征是否有效。如果 Ridge 明显优于基线再上梯度提升或时序深度模型。4.2 梯度提升树的关键参数LightGBM 或 XGBoost 在表格型电价预测里通常是最强单模型。重点调这几个参数参数作用建议范围num_leaves单棵树复杂度31255电价数据噪声大不宜过大learning_rate学习步长0.010.1min_data_in_leaf叶节点最小样本20100防过拟合feature_fraction特征采样比例0.70.9lambda_l2L2 正则120厚尾数据建议偏大import lightgbm as lgb params { objective: regression_l1, # MAE 损失对尖峰更稳健 num_leaves: 63, learning_rate: 0.05, min_data_in_leaf: 50, feature_fraction: 0.8, lambda_l2: 10, verbose: -1, } dtrain lgb.Dataset(X_train, y_train) dvalid lgb.Dataset(X_test, y_test, referencedtrain) bst lgb.train(params, dtrain, num_boost_round1000, valid_sets[dvalid], callbacks[lgb.early_stopping(50)])objective选regression_l1而不是默认的 L2是因为电价厚尾平方损失会被极端值主导。early_stopping(50)在验证集 50 轮不提升时停止避免无效迭代。lambda_l2给到 10 是应对特征共线性和噪声。4.3 用分位数损失捕捉价格区间点预测不够用交易和调度还需要区间。把 objective 换成quantile分别训练 0.1、0.5、0.9 三个分位数模型就能得到预测区间。for q in [0.1, 0.5, 0.9]: p dict(params) p[objective] quantile p[alpha] q m lgb.train(p, dtrain, num_boost_round800, valid_sets[dvalid], callbacks[lgb.early_stopping(50)]) df[fpred_q{int(q*100)}] m.predict(X_test)alpha就是目标分位数。0.1 和 0.9 两条线构成 80% 预测区间比单点预测更能反映尖峰风险。注意分位数模型要独立训练不能靠点预测加减固定倍数得到因为电价分布不对称。5. 误差归因与上线后的滚动修正5.1 按价格区间和时段拆解误差整体 MAE 会掩盖问题。把测试集按真实价格分档看模型在哪一档最差。result pd.DataFrame({y: y_test, pred: model.predict(X_test)}) result[bucket] pd.cut(result[y], bins[-1e9, 0, 300, 600, 1000, 1e9], labels[负价, 低价, 中价, 高价, 尖峰]) print(result.groupby(bucket).apply( lambda g: mean_absolute_error(g[y], g[pred])))如果尖峰档误差远大于其他档说明模型对极端供需没学到需要补充备用容量、检修、天气突变等特征或者对尖峰单独建分类器先判断“是否尖峰”再回归幅度。5.2 滚动重训与在线校正电价的市场规则和机组结构会变模型不能一训了之。常见做法是每周用最近 36 个月数据重训同时保留一个在线偏差校正项。# 用最近 7 天误差的均值做在线校正 recent_error (y_test - model.predict(X_test)).tail(24*7).mean() corrected model.predict(X_test) recent_error print(校正后 MAE:, mean_absolute_error(y_test, corrected))recent_error是近期系统性偏差加回去能修正模型漂移。但要注意如果近期出现一次极端事件这个均值会被污染建议用中位数或加 winsorize 截尾。重训频率和校正窗口要根据市场规则变化速度来定规则稳定时可以拉长到月度。5.3 把预测接进交易决策时的注意事项预测值本身不是终点它要进入报量报价或调度优化。这时要关注的是预测误差的代价不对称低估尖峰可能错过收益高估则可能被考核。实务中会把分位数预测直接喂给优化模型用 0.9 分位做保守报价、0.1 分位做激进报价而不是只用点预测。这一步把电价预测从“算得准”推进到“用得对”也是电力市场概论里电价理论最终要落到的位置。本文还有配套的精品资源点击获取
返回列表