赛题背景
需要解决问题:
简单概括一下就是做一个能够预测在有多种因素影响下电力现货市场的市场清出报价。
本质上是一个回归问题。
给出的数据:
-
电力市场的市场出清价格,市场需求等信息:
-
Day/Time:交易时间,中国电力现货市场15分钟结算一次,一天共96个交易点
-
demand:区域内电力总负荷(总需求),单位为MW
-
clearing price (CNY/MWh):市场出清电价,单位为元/MW·h
-
-
存放市场供给者(各发电机组)的参数信息:
-
unit ID:每个机组唯一的ID
-
Capacity(MW):机组的额定容量(额定功率),越高机组的发电能力越强
-
utilization hour (h) :电厂的年平均运行小时数,需要注意多个机组可能共同属于一个电厂,有相同的值
-
coal consumption (g coal/KWh):每发一度电需要耗费多少煤炭,为成本参数
-
power consumption rate:电厂单位时间内耗电量与发电量的百分比
-
概念解析:
出清价格:
-
所有发电机组申报自己卖出的电价和电量
-
市场根据机组报价,从低到高排序,依次从低价开始成交
-
当成交的容量和大于等于总需求时,达到市场出清(供需平衡),这时候最后一个达成交易的机组报价为市场出清价格
博弈从何而来?
定价格低了:原本可以卖更多的钱
定价高了:要是太高了就超过清出价格了,就一个也卖不出,最后只能亏本卖出。
价格帽:
保证电力公司不坐地起价:
报价上线和下线以及出清价格上线下线
边际定价:
生产额外一单位产品(这里是一度电)带来的成本增加
赛题baseline部分代码理解
总步骤:
导入库->读取数据->数据预处理->找出边际定价->预测
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)"]]
electricity_price["timestamp"] = pd.to_datetime(electricity_price["day"] + " " + electricity_price["time"].str.replace("24:00:00", "00:00"))
:这一行将day
和time
两列的数据合并成一个新的时间戳列timestamp
。
以上代码将24:00:00变成了00:00:00,是因为pandas里面的库并不支持解读24:00:00
利用方法是创建一个mask的布尔类型变量,来判断是否需要转换同时判断是否需要日期+1
sorted_unit = unit.sort_values("coal consumption (g coal/KWh)") # 按照一度电的耗煤量(近似为边际成本)降序排序
sorted_unit.head()
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)
print(len(prices))
prices[:5]
这边采用根据按照一度电的耗煤量(近似为边际成本),来进行边际成本的计算,市场清出的机制,需要引入一个cumulative_capacity作为变量来计算累计发电容量,这样就可以通过for循环算出每个时刻的边际成本,然后再将边际成本作为出清价格,添加在Dataframe中
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)
y_pred = model.predict(prices[train_length:])
y_pred = y_pred.flatten() # 2维矩阵转为1维
y_pred[:5]
这段代码使用线性回归模型(LinearRegression
)来预测电力市场的出清价格。
-
prices = np.array(prices).reshape(-1, 1)
:将之前计算的出清价格列表prices
转换为NumPy数组,并重塑为一列的二维数组,这是为了适应机器学习模型的输入格式。 -
X = prices[:train_length]
和y = electricity_price["clearing price (CNY/MWh)"].iloc[:train_length].values.reshape(-1, 1)
:定义训练集的特征X
和目标变量y
。X
是训练集的出清价格,而y
是实际的出清价格(从electricity_price
DataFrame中选取)。 -
y_pred = y_pred.flatten()
:将预测结果从二维数组转换为一维数组,这是因为predict()
方法默认返回二维数组,即使预测结果只有一列。
目前不足
-
边际成本并不能直接反映现实市场中的情况
-
边际成本还被其他因素影响
优化策略
-
尝试ABM方法
-
利用外部数据(天气、煤价)
-
研究交易规则、竞品影响
-
思考总开机时间、机组发电效率等