一、赛题背景与数据集说明
电力现货市场:
- 类似于证券交易市场,按需实时交易电能。
- 市场参与者包括供给方、会集并出售电力方等。
- 目标是实现资源最优配置,市场价格由供需关系决定。
数据集说明:
electricity price.csv
:包含市场出清价格、需求等信息。unit.csv
:包含发电机组的参数信息。
示例数据:
-
electricity price.csv
:day
:交易日期time
:交易时间demand
:电力需求总量clearing price (CNY/MWh)
:市场出清价格
-
unit.csv
:unit ID
:机组编号Capacity (MW)
:机组的额定容量Utilization Hour (h)
:电厂年平均运行小时数Coal Consumption (g coal/KWh)
:每发一度电需要消耗的煤量Power Consumption Rate (%)
:电厂单位时间内的电量与发电量的百分比
二、市场出清价格(Market Clearing Price)形成机制
出清价格形成:
- 所有发电机组根据自己实际出的电价和电量,从低到高排序,依次从低价开始成交。
- 当总需求被满足时,最后一个达成交易的机组报价为市场出清价格。
出清价格示例:
- 市场总需求为3000MW,四个机组报价和容量如下:
- 机组1:报价100元,容量500MW
- 机组2:报价150元,容量2000MW
- 机组3:报价200元,容量2000MW
- 机组4:报价250元,容量2500MW
- 最后一个达成交易的机组是机组4,报价250元即为市场出清价格。
价格帽:
- 为了保证市场稳定,电力现货市场存在价格帽限制:
- 报价上限:3000元/MWh
- 报价下限:-80元/MWh
- 出清价格上限:1500元/MWh
- 出清价格下限:-100元/MWh
三、代码解析
安装和导入必要的库:
python
!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
读取数据:
python
base_path = Path("data") # 确保数据都放在同级的data目录下
electricity_price = pd.read_csv(base_path / "electricity price.csv")
unit = pd.read_csv(base_path / "unit.csv")
处理数据:
- 准备示例提交数据
sample_submit
:
python
sample_submit = electricity_price[electricity_price["clearing price (CNY/MWh)"].isna()].drop(columns="demand")
sample_submit.to_csv(base_path / "sample_submit.csv", index=False)
- 合并
day
和time
列为timestamp
列,并处理24:00:00的情况:
python
electricity_price["timestamp"] = pd.to_datetime(
electricity_price["day"] + " " + electricity_price["time"].str.replace("24: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)
electricity_price = electricity_price[["timestamp", "demand", "clearing price (CNY/MWh)"]]
- 按照耗煤量排序,并计算累积容量:
python
sorted_unit = unit.sort_values("coal consumption (g coal/KWh)")
sorted_unit['cumulative_capacity'] = sorted_unit['Capacity(MW)'].cumsum()
- 根据需求找到满足总需求的机组报价:
python
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)
模型训练和预测:
- 使用线性回归模型进行训练:
python
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)
- 进行预测并保存结果:
python
y_pred = model.predict(prices[train_length:])
y_pred = y_pred.flatten()
sample_submit["clearing price (CNY/MWh)"] = y_pred
sample_submit.to_csv("submit.csv", index=False)
四、简要介绍ABM (Agent-Based Modeling)
ABM简介:
- 基于个体建模,模拟系统复杂行为的工具。
- 通过模拟个体(代理)的行为和相互作用,研究系统整体的动态变化。
ABM应用案例:
- 生命游戏(Game of Life)
- 新冠传播模拟
- 政府企业博弈模型
- 马群模型
五、边际成本定价策略
边际成本:
- 定义为生产额外一单位产品(电)的成本增加。
- 机组的报价不能低于其边际成本。
边际成本定价策略:
- 机组根据自身的边际成本进行报价,保证电力市场价格的合理性和稳定性。