一、赛题背景
此次比赛主要针对 “电力现货市场”(可以类比证券交易市场), 泛指短时间内的电能量交易市场。
市场中有大量发电机组(供给者,会发电并卖出电力)按照交易规则,在指定的平台上采取集中竞价的方式确定电能的交易量和价格。这些电能会被输送给个体户、商业用户等,从而利用市场机制实现资源优化配置。
在最理想的情况下,市场完全竞争(市场参与者众多,以至于没有任何一方能够影响价格,不存在控制价格的可能性) ,没有任何博弈行为。每个发电机组都诚实报价,市场出清价格稳定可靠,达到最优效率。
但现实中,电力现货市场有以下特点:
- 寡头竞争(几家电力公司独大,对价格有显著影响)
- 不完全信息(不同机组信息不互通,存在打信息差牟利的可能)
- 非合作博弈(机组之间各谋其利,追求各自的利益最大化)
- 参与者有限理性(受限于经济知识和对市场的了解,机组不一定能做出最优决策)
从而不同机组之间有复杂的博弈行为 , 这就让市场出清价格难以估计。
因此,本次比赛要求针对电力现货市场价格和市场博弈主体(549个发电机组)的信息,用ABM方法建模这些机组在报价上的博弈行为,使最终模拟的市场出清报价接近现实中的市场出清价格。
二、赛题数据
electricity price.csv:电力市场的市场出清价格,市场需求等信息。训练集范围为2021年12月1日到2023年7月1日,共计55392个点;测试集范围为2023年7月1日到2024年4月18日,共计28228个点
- Day/Time:交易时间,中国电力现货市场15分钟结算一次,一天共96个交易点
- demand:区域内电力总负荷(总需求),单位为MW
- clearing price (CNY/MWh):市场出清电价,单位为元/MW·h
| day | time | demand | clearing price (CNY/MWh) |
|---|---|---|---|
| 2021/12/1 | 0:15 | 40334.18 | 350.8 |
| 2021/12/1 | 0:30 | 40523.15 | 350.8 |
| 2021/12/1 | 0:45 | 40374.74 | 350.8 |
unit.csv:存放市场供给者(各发电机组)的参数信息
机组数据包含549个不同的火电机组
- unit ID:每个机组唯一的ID
- Capacity(MW):机组的额定容量(额定功率),越高机组的发电能力越强
- utilization hour (h) :电厂的年平均运行小时数,需要注意多个机组可能共同属于一个电厂,有相同的值
- coal consumption (g coal/KWh):每发一度电需要耗费多少煤炭,为成本参数
- power consumption rate:电厂单位时间内耗电量与发电量的百分比,例如单位时间耗电量为500度电,发电量为10000度电,利用率就是500/10000=5%。
| unit ID | Capacity (MW) | Utilization Hour (h) | Coal Consumption (g coal/KWh) | Power Consumption Rate (%) |
|---|---|---|---|---|
| 1 | 110 | 2069.12 | 266.07 | 6.91 |
| 2 | 160 | 5509.22 | 292.7 | 6.91 |
| 3 | 160 | 3562.79 | 293.35 | 6.91 |
比赛任务
比赛本质是一个回归(预测目标为连续值,例如根据年龄预测身高)问题,需要预测2023年7月1日到2024年4月18日每15分钟的市场出清价格,虽然可以纯粹依靠时间序列模型完成,但比赛方也提到期待选手使用ABM模型建模获取市场出清价格, 因此可以在两方面进行尝试上分(ps:如果感觉ABM较难,可以专注于时间序列挖掘哦) 。
最终评价指标为MSE(均方误差)和RMSE(均方根误差)的均值(事实上这和只用RMSE或者MSE是一样的),值越小越好,公式如下:
其中:
- 为真实市场出清价格
- 为预测的市场出清价格
- 为样本数量,这里是测试集的大小28228
前面介绍完了所有跟赛题相关的内容信息,接下来我们来用两种方法开始研究它。
1.时间序列挖掘
通过EDA进一步查看数据可以发现,出清价格在一小时中是保持不变的也就是实际上交易时间是1小时而不是15分钟,但总负荷会在一小时中变化。
接下来我们从单变量数值关系入手:
-
数据的集聚趋势
- 均值:
df[feature].mean() - 中位数
df[feature].median() - 最大值
df[feature].max() - 最小值
df[feature].min() - 众数
df[feature].mode()
- 均值:
-
数据的变异程度
- 标准差
df[feature].std() - 极差
df[feature].apply(lambda x: x.max() - x.min()) - 四分位数
df[feature].quantile([0.25, 0.5, 0.75]) - 变异系数
df[feature].std()/df[feature].mean() - 偏度和峰度
df[feature].skew(),df[feature].kurtosis()
- 标准差
-
变化率:
df[feature].pct_change()计算公式为
从总负荷和出清价格的数值分布来看,可以发现以下几个特点:
- 总负荷基本服从正态分布,符合现实中的耗电规律
- 出清价格中有大量的异常负价格
- 1-100之间的低价格较多,表明这些时候火电
- 有一定的异常高价(800以上)
不难发现不同年份下,一天不同小时的总负荷和电价,数据中用电存在两个高峰期和一个低谷期
- 早高峰:一般在6-9点
- 晚高峰:一般在16-21点
- 低谷期:10-15点
这似乎很反常,理论上10-15点都在进行大量的工业和商业活动,为什么反而电价和总负荷会更低呢,这里需要了解一个概念: “鸭子曲线”
鸭子曲线:由于火电和光伏发电互为替代品,当一天太阳出来后,太阳能逐渐开始替代火电,并在14点达到最大,进而导致火电受光伏发电竞争而降价。而在傍晚时太阳落山,光伏机组迅速减小发电,此时火电开始集中发电,价格迅速上升,形成了一天中典型的“两高峰,一低谷”的态势。
对比下图中加利福尼亚的数据和目前的数据,可以发现二者的形式几乎一致,这样我们又增加了几个先验信息:
- 考虑其他新能源(尤其是光伏)的影响对预测价格意义重大
- 光伏受天气、季节等因素影响,说明还需要借助外部天气数据辅助预测。
- 随着时间推移和中国碳中和的发展,光伏必定会在更大程度上替代火电,因此可以猜测2024年的火电价格会进一步下降。
还可以进一步用透视表和热力图来分析不同月份下的电价变化趋势,从中我们可以发现几个趋势
- 从1月到到5月,出清电价峰谷不断扩大,价格持续走低
- 6-8月出清电价开始回升,并在8月达到顶峰
- 9-12月出清电价开始迅速下降,但在11-12月略有回暖
可以根据地理知识做出猜测:
- 从冬至到夏至,日出时间不断提早,光伏发电更早抢占火电市场空间,导致火电更早在早高峰期间跌价。同时1-5月是大风期,风电也进一步驱使火电降价。
- 6-8月为小风期,风电减弱。同时雨带迁移到北方,光伏受天气影响发电量大幅减少,火电迎来高价区(尤其是8月降水最多,火电价格最高)
- 9-12月为大风期,风电加强。日出开始推迟,火电在低谷期的价格逐渐回升。
这启发我们除了构造月份特征,还能构造不同时期的指示变量特征(如1-5月、6-8月)
负电价与高电价形成原因分析
先前提到,数据中有大量负电价和一部分的异常高价,在这里我们探究其形成原因,并思考如何预测这种模式。
负电价
从不同小时下负电价的出现次数来看,低谷期的负电价较为明显,可能是受市场竞争导致电价中标失败,只能亏本售出。
通过按负电价出现频数排序,可以发现最典型的一次集中的负电价发生在2022年的五一假期中,连续出现了7次的负电价。
猜测是因为火电厂发电需要人为监控(例如开关机,设置出力,而风电和光伏放着自己发电就好),假期期间大多数员工放假,从而导致火力发电量下降,出现负电价。
我们还可以进一步探究假期对电价的影响,例如2022年的大年三十是1月31日,由于调休,1月28日-1月30日上班,1月31日-2月6日放假。果然在春节假期中也出现了大量的负电价。
这说明节假日是判断负电价的重要特征
小测试:尝试画出2023年春节放假期间,1月21日-1月27日中的电价波动,并对比2023年的1月28日-2月6日电价情况,这是否更加证明假期特征的重要性?
高电价
和负电价相反,高电价主要集中在日落后,此时光伏发电下降,火电有较大的竞价空间。
通过对比明显高价的2022年8月3日-8月6日之间的数据,可以发现其在总需求上并不突出,甚至比后续日期中总需求更高的时间段价格还高,表明其受到了外部因素的影响
双变量分析
本题中特征均为连续型变量,因此我们可以采用画散点图,计算相关系数的方法来观察两个变量的关系。
相关系数
Python计算相关系数代码如下,其会得到一个相关系数矩阵
ar_1=np.array([3,5,1,12])
ar_2=np.array([1,2,3,4])
np.corrcoef(ar_1,ar_2)
>>> array([[1. , 0.62026387],
[0.62026387, 1. ]])
如果是使用pandas的dataframe,可以直接df[[feature1,feature2]].corr()求feature1和feature2的相关系数矩阵。
在本案例中,demand和price的相关系数为0.34,可以看出二者有较高的线性相关性
并且我们还能发现,在高负荷下,价格变动趋缓
总结
综合以上,我们可以总结出几点:
- 气象状况对出清价格有较大影响
- 节假日对出清价格有较大影响,易于出现负值
- 总负荷与出清价格线性关系很高,但总体呈现分段线性的特征
- 不同月份/小时下的出清价格受市场竞争影响较大
- 碳中和不断发展,火电价格有总体下降的趋势