社会科学市场博弈和价格预测之baseline(Datawhale AI 夏令营)

CSDN 2024-08-20 13:31:01 阅读 63

赛题背景

        在电力现货市场(可以类比为证券交易市场),大量发电机组(供给者)按照交易规则,在指定平台上通过集中竞价的方式确定电能的交易量和价格。这些电能会被输送给个体户、商业用户等,利用市场机制实现资源的优化配置。

        在理想状态下,市场完全竞争,没有任何一方能够影响价格,所有发电机组都诚实报价,市场出清价格稳定可靠,达到最优效率。然而,现实中的电力现货市场具有以下特点:

寡头竞争:几家电力公司对市场价格有显著影响。不完全信息:不同机组的信息不互通,存在信息差异带来的获利可能性。非合作博弈:机组之间各自为政,追求自身利益最大化。参与者有限理性:机组可能无法做出最优决策,受限于经济知识和对市场的了解。

        这些因素导致市场出清价格难以预测。因此,本次比赛要求利用Agent-Based Modeling (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):市场出清电价,单位为元/MWh。

unit.csv:包含549个火电机组的参数信息:

unit ID:每个机组的唯一ID。Capacity(MW):机组的额定容量,代表其发电能力。utilization hour (h) :电厂的年平均运行小时数。注意多个机组可能共同属于一个电厂,有相同的值。coal consumption (g coal/KWh):每发一度电所需耗费的煤炭量,为成本参数。power consumption rate:电厂单位时间内耗电量与发电量的百分比。

评价指标

比赛的主要任务是预测2023年7月1日至2024年4月18日每15分钟的市场出清价格。尽管可以单纯依赖时间序列模型完成预测,但比赛方鼓励使用ABM模型进行建模,以模拟市场出清价格。

最终的评价指标为MSE(均方误差)和RMSE(均方根误差)的均值,值越小越好。公式如下:

基础环境配置

        本次比赛需要使用一些常用的Python库来处理数据和进行建模,包括:

<code>numpy:用于矩阵运算。pandas:用于表格数据处理。pathlib:主要用于文件路径处理。sklearn:用于机器学习算法,这里主要使用了线性回归模型。

安装第三方库

        首先,我们需要安装所需的第三方库。可以选择在本地已经配置好的conda环境中安装,或者创建新的虚拟环境:

conda env list # 查看已有环境

conda create -n abm python=3.9 # 创建新的环境

conda activate abm # 激活环境

pip install numpy pandas scikit-learn matplotlib seaborn # 安装第三方库

        安装完成后,我们可以导入必要的库:

import numpy as np

import pandas as pd

from pathlib import Path

from sklearn.linear_model import LinearRegression

数据预处理

        首先,我们需要将daytime列合并成timestamp列,方便使用pandas的时间序列处理功能。接着,我们将市场数据的列顺序调整为timestampdemandclearing price (CNY/MWh)

base_path = Path("data") # 确保数据都放在同级的data目录下

# 读取市场数据

electricity_price = pd.read_csv(base_path / "electricity price.csv")

# 读取市场主体(各发电机组)数据

unit = pd.read_csv(base_path / "unit.csv")

# 将day和time列合并成timestamp列

electricity_price["timestamp"] = pd.to_datetime(

electricity_price["day"] + " " + electricity_price["time"].str.replace("24:00:00", "00:00")

)

# 处理24:00:00的情况,即表示第二天的00:00:00

mask = electricity_price['timestamp'].dt.time == pd.Timestamp('00:00:00').time()

electricity_price.loc[mask, 'timestamp'] += pd.Timedelta(days=1)

# 设置列的顺序,同时去除day和time列

electricity_price = electricity_price[["timestamp", "demand", "clearing price (CNY/MWh)"]]

使用ABM估计市场出清价格

        ABM(Agent-Based Modeling)是一种模拟系统复杂行为和动态的计算方法。通过定义系统中的个体(Agent)及其相互作用规则,可以观察到系统的宏观模式和现象。

        在本次任务中,市场主体是各个发电机组。我们将使用边际成本定价法作为基准线,即每个机组都以自身每生产一度电的成本进行报价。然后按报价从低到高排序,依次接受报价,直到累计功率超过总需求,确定市场出清价格。

sorted_unit = unit.sort_values("coal consumption (g coal/KWh)") # 按照一度电的耗煤量(近似为边际成本)降序排序

sorted_unit['cumulative_capacity'] = sorted_unit['Capacity(MW)'].cumsum()

prices = []

# 找到最后一个满足总需求的机组报价

for demand in electricity_price["demand"]:

price = sorted_unit[sorted_unit['cumulative_capacity'] >= demand]["coal consumption (g coal/KWh)"].iloc[0]

prices.append(price)

转换耗煤量为机组报价

        由于耗煤量和实际报价之间的关系不明确,我们使用线性回归模型拟合一个转换关系:

model = LinearRegression()

train_length = 55392

prices = np.array(prices).reshape(-1, 1)

X = prices[:train_length]

y = electricity_price["clearing price (CNY/MWh)"].iloc[:train_length].values.reshape(-1, 1)

model.fit(X, y)

model.coef_, model.intercept_ # 输出拟合的线性方程参数

结果保存

        最后,我们将预测的出清价格保存为submit.csv文件:

sample_submit["clearing price (CNY/MWh)"] = y_pred

sample_submit.to_csv("submit.csv", index=False)

结语

        通过以上步骤,我们完成了一个简单的基于边际成本定价的ABM模型,模拟了市场出清价格。通过假设市场为完全竞争市场,并采用边际成本定价法,我们能够对机组报价进行初步的估算。这种方法简单直观,有助于理解基础的市场机制和定价原理。

        尽管基线模型在复杂的电力市场中存在一定的简化假设,但它为我们提供了一个基本框架,帮助我们验证数据的有效性和处理流程的正确性。在这个基础上,我们可以进一步构建更为复杂和精确的模型,如利用Agent-Based Modeling (ABM) 模拟多样化的市场行为,以及使用机器学习方法进行高级预测。

        在电力市场中,了解和模拟机组的报价行为及其对市场价格的影响是关键的一步。通过基线模型的构建和分析,我们能够为更复杂的模型奠定坚实的理论和实践基础,并为后续研究提供有价值的参考。当然,这只是一个起点,后续我们可以进一步改进模型,考虑更多的市场因素和机组行为,以提高预测精度。

如果你觉得这篇博文对你有帮助,请点赞、收藏、关注我,并且可以打赏支持我!

欢迎关注我的后续博文,我将分享更多关于人工智能、自然语言处理和计算机视觉的精彩内容。

谢谢大家的支持!



声明

本文内容仅代表作者观点,或转载于其他网站,本站不以此文作为商业用途
如有涉及侵权,请联系本站进行删除
转载本站原创文章,请注明来源及作者。