この記事は「【リアルタイム電力予測】需要・価格・電源最適化ダッシュボード構築記」シリーズの七日目です
Day1はこちら | 全体構成を見る
今日から電力価格予測に入っていきます!まずは「電力価格とは何か?」を整理し、実際に市場データを取得していきます。
電力価格とは?
まず、電力価格とは?と皆さん思うかと思いますが、今回予測する対象はご家庭の電気料金ではございません。
電力についても、株式と同じように 市場 があり、ここでオークション形式で電気が取引されています。つまり、電力価格とは、事業者同士が電気を売買する卸電力市場 で決まる取引価格 のことを指しています。

(出典:HTBエナジー コラム 電気代プラン節約)
市場の役割を担っているのが JEPX(日本卸電力取引所)です。ここでは、発電事業所(●●電力等)が発電した電力を、小売電力事業者(●●でんき、●●エナジーのように電気プランを顧客に小売りしている会社)が購入するプラットフォームになっています。
この取引市場では、以下の市場の種類があります。
- 一日前市場(スポット市場)
- 当日市場(時間前市場)
- 先渡市場
- ベースロード市場
- 非化石価値取引市場
- 分散型・グリーン売電市場
今回はこのうち 一日前市場(スポット市場) の価格を予測していきます。1日を30分ごとに分割した合計48コマを1コマごとに取引しており、取引は前日に行われます。
参加者は他の人の入札状況を知らずに自分の入札を行い、一斉に評価され需要と供給の交点である市場価格が決定されます。

(出典:日本卸電力取引所取引ガイド 取引の種類)
なお、当日に予期せぬトラブルや需給の急増によって発生する電力不足に対応するために、当日の1時間前まで取引できる市場が、当日市場(時間前市場)です。
ここでは、株式市場と同様に売り注文と買い注文が一致した時点で売買が成立します。
電力価格を動かす要因
電力需要は、主にカレンダーと気温の変化が大きな影響を与えていました。
電力価格はどうでしょうか?
| 要因 | 説明 |
|---|---|
| 燃料価格(石炭・石油・ガス) | 燃料費が上昇すると、火力発電の限界費用が上がり市場価格が上がる |
| 需給バランス | 供給過多=価格下落、不足=価格上昇 |
| 天候 | 晴天でPV発電が増えると価格が下がりやすい |
| 時間帯 | 夜間は需要増で価格が上がりやすい |
| 季節 | 夏冬は需要ピークで高値になりやすい |
上記のように複数の要素が絡み合って決まります。
電力価格データの取得
では、実際にJEPXから電力価格を取得していきます。
JEPX 市場価格

CSV をダウンロードします。この CSV は GUI 上のフィルタとは異なり、選択項目に関係なく、その年の全データが収録されている点に注意です・
プライスの種類
システムプライスとそれ以外のエリアプライスに分かれます。
システムプライス
前日渡しスポット市場における1日24時間を30分単位(合計48個)に分け、JEPXで日本全国の売り手と買い手の入札情報を合成し、需要と供給が折り合う交点の価格です。
エリアプライス
電力市場として区分される地域は、各地域の大手電力会社が管轄する沖縄電力管轄を除いた9地域です。各地域の価格差は隣接するエリア同士が連系線によって融通し合う電力量差異により生じるため計算を分けて行う必要があります。これにより算出された約定価格のことをエリアプライスと言います。
今回の予測は 東京のエリアプライス です。
見ていただくと、日中の価格の下がり方で地域ごとの違いが出ています。
特に九州エリアの下がりやすいのは、太陽光発電比率が高く火力発電の稼働が抑えられるためです。太陽光発電は太陽の自然エネルギーで発電するため、燃料コストがかからず、安い電力を提供できます。
まとめると、
- システムプライス=全国共通の約定価格(実際に売買が成立する価格)
- エリアプライス=系統制約を反映した地域別の最終価格
データ整形
CSVの読み込みと整形
price_csv = glob.glob("../data/jepx/spot_summary*.csv")
price_csv = sorted(price_csv)
col_name = ["受渡日", "時刻コード", "売り入札量(kWh)", "買い入札量(kWh)", "約定総量(kWh)",
"システムプライス(円/kWh)", "エリアプライス北海道(円/kWh)", "エリアプライス東北(円/kWh)", "エリアプライス東京(円/kWh)",
"エリアプライス中部(円/kWh)", "エリアプライス北陸(円/kWh)", "エリアプライス関西(円/kWh)", "エリアプライス中国(円/kWh)",
"エリアプライス四国(円/kWh)", "エリアプライス九州(円/kWh)", "売りブロック入札総量(kWh)", "売りブロック約定総量(kWh)",
"買いブロック入札総量(kWh)", "買いブロック約定総量(kWh)"]
data_list = []
# 各ファイルを読み込んで結合
for file in price_csv:
# 13~39行目をスキップ
df = pd.read_csv(
file, encoding="SHIFT_JIS", engine="python"
)
print(df.shape)
# データフレームをリストに追加
data_list.append(df)
# 全てのデータフレームを結合
price_df = pd.concat(data_list, ignore_index=True)
price_df.columns = col_name
必要列の抽出
use_col = ["受渡日", "時刻コード", "売り入札量(kWh)", "買い入札量(kWh)", "約定総量(kWh)", "エリアプライス東京(円/kWh)"]
price_df_cl = price_df[use_col]
price_df_cl.rename(columns={"受渡日":"date", "時刻コード":"period",
"売り入札量(kWh)": "offer_volume", "買い入札量(kWh)":"bid_volume",
"約定総量(kWh)":"contract_total_kwh", "エリアプライス東京(円/kWh)":"tokyo_price_jpy_per_kwh",
},
inplace=True)
price_df_cl["date"] = pd.to_datetime(price_df_cl["date"])
時刻コード(0–47)→ タイムスタンプへの変換
JEPX の period は次のルールで定義されていました。
- 0 → 0:00–0:30
- 1 → 0:30–1:00
- 2 → 1:00–1:30
price_df_cl["time_str"] = price_df_cl["period"].apply(lambda x: f"{(x // 2) % 24:02d}:{'30' if x % 2 == 1 else '00'}")
price_df_cl["timestamp"] = pd.to_datetime(price_df_cl["date"].astype(str) + " " + price_df_cl["time_str"])
price_df_cl.drop(columns=["date", "period"], inplace=True)
# 電力価格データの datetime 列を30分前にシフト
price_df_cl["timestamp"] = price_df_cl["timestamp"] - pd.Timedelta(minutes=30)
period=0 は 0:00–0:30 の価格 だが、公式CSVは「0:30」として記録されているので、時系列モデルに投入する際はその価格が始まった時刻(0:00)に合わせたいため、30分戻しています。
電力価格データの可視化
簡単に可視化してみます。
fig = px.box(price_df_cl, x="year", y="tokyo_price_jpy_per_kwh", title="年ごとの箱ひげ図")
fig.show()
2022年に価格が急激に上がっており、他の箱ひげ図がつぶれてしまっています。
拡大:

100円以下に絞ってみると、年ごとにそれほど分布の差がないことが分かります。ただ近年は分布が広がりつつあります。
全期間の推移:

急激な上昇をしている期間が見受けられます。
毎日の日周期はもちろんのこと、外部要因によって大きく価格が上昇することから予測の難しさを感じます。
月ごとの推移:

長期的なトレンドがあるかをどうかについて確かめるために年別に月ごと推移を描画しました。
2021年1月の急激な上昇と、2022年は全体的に高くなっていることが分かります。
燃料価格データの取得
電力価格は火力発電の限界費用と密接に関係しているため、燃料価格は強い説明変数となります。
燃料としては以下の3つを特徴量とします。
石炭
取得元:World Bank
こちらの Pink Sheet Data 列の Monthly prices をダウンロードしました。

こちらをダウンロードすると、1960年1月以降の月別価格が含まれています。
石油
取得元:EIA Europe Brent Spot Price FOB
Dailyでダウンロードしていきました。
抽出が細かいところがあるので、APIでダウンロードすることをお勧めします。
こちらの自動取得コードも18日目に記載します。
ガス
こちらの自動取得コードも18日目に記載します。
為替データ(USD/JPY)
取得元:Frankfurter
燃料はほぼ外国から輸入しており、すべてドル建てのため円換算が必要です。
明日
明日は取得した上記の特徴量を可視化してモデルにどのように入れるかを考えていきたいと思います!![]()





