Datawhale AI夏令营-基于电力现货市场的时间序列挖掘+ABM构建学习

708 阅读10分钟

一、赛题背景

此次比赛主要针对 “电力现货市场”(可以类比证券交易市场), 泛指短时间内的电能量交易市场。

市场中有大量发电机组(供给者,会发电并卖出电力)按照交易规则,在指定的平台上采取集中竞价的方式确定电能的交易量和价格。这些电能会被输送给个体户、商业用户等,从而利用市场机制实现资源优化配置。

在最理想的情况下,市场完全竞争(市场参与者众多,以至于没有任何一方能够影响价格,不存在控制价格的可能性) ,没有任何博弈行为。每个发电机组都诚实报价,市场出清价格稳定可靠,达到最优效率。

但现实中,电力现货市场有以下特点:

  • 寡头竞争(几家电力公司独大,对价格有显著影响)
  • 不完全信息(不同机组信息不互通,存在打信息差牟利的可能)
  • 非合作博弈(机组之间各谋其利,追求各自的利益最大化)
  • 参与者有限理性(受限于经济知识和对市场的了解,机组不一定能做出最优决策)

从而不同机组之间有复杂的博弈行为 这就让市场出清价格难以估计。

因此,本次比赛要求针对电力现货市场价格和市场博弈主体(549个发电机组)的信息,用ABM方法建模这些机组在报价上的博弈行为,使最终模拟的市场出清报价接近现实中的市场出清价格

二、赛题数据

electricity price.csv:电力市场的市场出清价格,市场需求等信息。训练集范围为2021年12月1日到2023年7月1日,共计55392个点;测试集范围为2023年7月1日到2024年4月18日,共计28228个点

  1. Day/Time:交易时间,中国电力现货市场15分钟结算一次,一天共96个交易点
  2. demand:区域内电力总负荷(总需求),单位为MW
  3. clearing price (CNY/MWh):市场出清电价,单位为元/MW·h
daytimedemandclearing price (CNY/MWh)
2021/12/10:1540334.18350.8
2021/12/10:3040523.15350.8
2021/12/10:4540374.74350.8

unit.csv:存放市场供给者(各发电机组)的参数信息

机组数据包含549个不同的火电机组

  1. unit ID:每个机组唯一的ID
  2. Capacity(MW):机组的额定容量(额定功率),越高机组的发电能力越强
  3. utilization hour (h) :电厂的年平均运行小时数,需要注意多个机组可能共同属于一个电厂,有相同的值
  4. coal consumption (g coal/KWh):每发一度电需要耗费多少煤炭,为成本参数
  5. power consumption rate:电厂单位时间内耗电量与发电量的百分比,例如单位时间耗电量为500度电,发电量为10000度电,利用率就是500/10000=5%。
unit IDCapacity (MW)Utilization Hour (h)Coal Consumption (g coal/KWh)Power Consumption Rate (%)
11102069.12266.076.91
21605509.22292.76.91
31603562.79293.356.91

比赛任务

比赛本质是一个回归(预测目标为连续值,例如根据年龄预测身高)问题,需要预测2023年7月1日到2024年4月18日每15分钟的市场出清价格,虽然可以纯粹依靠时间序列模型完成,但比赛方也提到期待选手使用ABM模型建模获取市场出清价格, 因此可以在两方面进行尝试上分(ps:如果感觉ABM较难,可以专注于时间序列挖掘哦)

最终评价指标为MSE(均方误差)和RMSE(均方根误差)的均值(事实上这和只用RMSE或者MSE是一样的),值越小越好,公式如下:

MSE=i=1n(yiy^i)2n\text{MSE}=\frac{\sum_{i=1}^{n} (y_i - \hat{y}_i)^2}{n}

Final Metric=MSE+MSE2\text{Final Metric}=\frac{\text{MSE}+\sqrt{\text{MSE}}}{2 }

其中:

  • yiy_i 为真实市场出清价格
  • y^i\hat y_i为预测的市场出清价格
  • nn为样本数量,这里是测试集的大小28228

前面介绍完了所有跟赛题相关的内容信息,接下来我们来用两种方法开始研究它。

1.时间序列挖掘

通过EDA进一步查看数据可以发现,出清价格在一小时中是保持不变的也就是实际上交易时间是1小时而不是15分钟,但总负荷会在一小时中变化。

image.png

接下来我们从单变量数值关系入手:

  • 数据的集聚趋势

    • 均值: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() 计算公式为 x2x1x1\dfrac{x_2-x_1}{x_1}

从总负荷和出清价格的数值分布来看,可以发现以下几个特点:

  • 总负荷基本服从正态分布,符合现实中的耗电规律
  • 出清价格中有大量的异常负价格
  • 1-100之间的低价格较多,表明这些时候火电
  • 有一定的异常高价(800以上)

image.png

image.png 不难发现不同年份下,一天不同小时的总负荷和电价,数据中用电存在两个高峰期和一个低谷期

  • 早高峰:一般在6-9点
  • 晚高峰:一般在16-21点
  • 低谷期:10-15点

这似乎很反常,理论上10-15点都在进行大量的工业和商业活动,为什么反而电价和总负荷会更低呢,这里需要了解一个概念: “鸭子曲线”

image.png

鸭子曲线:由于火电和光伏发电互为替代品,当一天太阳出来后,太阳能逐渐开始替代火电,并在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,可以看出二者有较高的线性相关性

并且我们还能发现,在高负荷下,价格变动趋缓

总结

综合以上,我们可以总结出几点:

  1. 气象状况对出清价格有较大影响
  2. 节假日对出清价格有较大影响,易于出现负值
  3. 总负荷与出清价格线性关系很高,但总体呈现分段线性的特征
  4. 不同月份/小时下的出清价格受市场竞争影响较大
  5. 碳中和不断发展,火电价格有总体下降的趋势