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

赛题背景

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

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

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

        这些因素导致市场出清价格难以预测。因此,本次比赛要求利用Agent-Based Modeling (ABM) 方法对电力现货市场中的机组报价行为进行建模,模拟市场出清报价,使之接近实际市场的出清价格。

数据介绍

        本次比赛的数据包括两个主要文件:

  1. 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。
  2. 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库来处理数据和进行建模,包括:

  • 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) 模拟多样化的市场行为,以及使用机器学习方法进行高级预测。

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

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

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

谢谢大家的支持!

  • 57
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

会飞的Anthony

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值