Python ile Enerji Analizi (barissanli.com/python)

Baslangic
Python'a Giris - Petrol fiyat modeli
Gelecek/Futures fiyatları indirme
Kisa kodlama: Monte Carlo ile Pi hesabi
Oil price analysis(English)
Kayitzinciri(blockchain) Proof of work
Petrol fiyat analizi
Monte Carlo ile Petrol fiyat tahmini
Enerji depolama simulasyonu
Turkiye araba projeksiyonu
Lecture7_türkce

Doğalgaz ve Petrol de Future/Gelecek Fiyatlarına Erişim ve Bölgesel Gaz Fiyat Farkları

barissanli.com/python

barissanli2@gmail.com

Geliştirme platformu: Jupyter

Bilkent'de verdiğim EEPS 520 - Data Analysis in Energy Markets dersinde gerçek verisetleri üzerinden birçok analiz yapmaya çalışıyoruz. Bu veri setlerinin bir kısmına erişim ücretsiz. Bu seride bu ücretsiz veri setlerine Python ile erişim konusuna değineceğiz.

Amaç:

Değişik bölgelerdeki gaz fiyatları ve LNG fiyatlarının karşılaştırılması, bunların gelecek fiyatlarının gösterilmesi ana amaçtır.

Fiyat setleri

CMEGroup web sitesi üzerinden JSON ile Henry Hub(ABD), TTF (AB/Hollanda), NBP (İngiltere), JKM-LNG (Asya) ve API2 Kömür fiyatları (Kuzeybatı Avrupa) fiyatları kıyaslanacaktır. Ayrıca Brent fiyatları da bu karşılaştırmada yer alacaktır

Fiyat setlerinin özellikleri

a) Henry Hub : ABD'nin doğal gaz referans fiyatı, şu anda dünyadaki en likit gaz oluşum noktalarından biri, Birim $/mmbtu .... Bu fiyat OxfordEnergy'nin LNG sıkılığı (LNG tightness) endeksinde de kullanılmaktadır.

b) TTF: (Title Transfer Facility) Hollanda'da oluşan bu fiyat 2015'ten bu yana NBP'yi geçerek en likit ve Avrupa referans fiyatını oluşturmaktadır. Birimi €/MWh olduğundan bunu $/mmbtu'ya çevirmek gerekecektir

c) NBP: (National Balancing Point) (£/therms) İngiltere'de oluşan bu fiyatı kullanmıyorum ama ilgilisi kullansın diye bıraktım. Bu fiyatın da tekrar $/mmbtu'ya dönüştürülmesi gerekir

d) JKM : (Japan-Korean Marker) : Asya bölgesi için LNG fiyatları olarak da görülebilir

e) Coal price ($/ton) : Kömür de değişik bölgelere göre farklı fiyatlar olmasına rağmen bizim için daha anlamlı olan API2 CIF ARA (Argus-McCloskey)'i kullandım

f) Brent fiyat ($/varil) Brent fiyat olarak da hacmi en yüksek olan kontrat tipini aldık

Ne yapıyoruz

  1. Kütüphaneleri yüklüyoruz
  2. Web adreslerini (JSON) için tanımlıyoruz
  3. JSON çağrıları ile tüm dataları indirirken son uzlaşma ("priorSettle") ve son ay ("expirationMonth")'ı alıyoruz
  4. Sonra bu JSON çağrılarının bir kısmını (5er yıllık-6 aylık kısmını) sayıya (float'a) çeviriyoruz.
  5. Daha sonra aylar ve verileri dataframe 'e çeviriyoruz
  6. Grafikle ve hesapla

Önce kütüphaneleri yükle

Sırasıyla veri analizi için matplotlib, pandas ve numpy 'yi sonra da JSON internet verileri için requests i yüklüyoruz

In [1]:
%pylab inline
import pandas as pd
Populating the interactive namespace from numpy and matplotlib
In [2]:
import requests
from numpy import array

Veri adresleri

Bu veri adreslerini internet tarayıcınıza doğrudan da yazarak çıktıları görebilirsiniz. Okumada kolaylık olsun diye, hangi adres hangi verinin aşağıda tanımlandı

In [3]:
hh="https://www.cmegroup.com/CmeWS/mvc/Quotes/Future/444/G"
ttf="https://www.cmegroup.com/CmeWS/mvc/Quotes/Future/8378/G"
nbp="https://www.cmegroup.com/CmeWS/mvc/Quotes/Future/8376/G"
jkm="https://www.cmegroup.com/CmeWS/mvc/Quotes/Future/7049/G"
coal="https://www.cmegroup.com/CmeWS/mvc/Quotes/Future/5951/G"
brent="https://www.cmegroup.com/CmeWS/mvc/Quotes/Future/424/G"

Verileri indirelim

Şimdi sırası ile tüm JSON taleplerimizi yaparak, verileri indirelim. Ben tüm veriden iki eleman "priorSettle" ve "expirationMonth" seçtim ama çok daha anlamlı başka veri elemanları da var.

In [4]:
#HenryHub
r = requests.get(hh).json()
hh_price = [(item['expirationMonth'], item['priorSettle']) for item in r['quotes']]

Canı sıkılanlar için burada veri çıktısının nasıl olduğunu da görebilirler. Baştaki # i kaldırın yeter.

In [5]:
#hh_price
In [6]:
#TTF 
r = requests.get(ttf).json()
ttf_price = [(item['expirationMonth'], item['priorSettle']) for item in r['quotes']]
In [7]:
#JKM 
r = requests.get(jkm).json()
jkm_price = [(item['expirationMonth'], item['priorSettle']) for item in r['quotes']]
In [8]:
#Coal
r = requests.get(coal).json()
coal_price = [(item['expirationMonth'], item['priorSettle']) for item in r['quotes']]
In [9]:
#Brent
r = requests.get(brent).json()
brent_price = [(item['expirationMonth'], item['priorSettle']) for item in r['quotes']]

Normalde aşağıdaki adımlar tek bir hamlede yapılmasına rağmen ben burada iki ayrı adımda yaptım. Veriyi önce diziye daha sonra da noktalı sayı tipine dönüştürdüm. Bu sırada €/MWh ve $/ton dönüşümleri de yapılmakta

In [10]:
hh_data=array(hh_price)
ttf_data=array(ttf_price)
jkm_data=array(jkm_price)
coal_data=array(coal_price)
brent_data=array(brent_price)
In [11]:
hh_prices=hh_data[0:61,1].astype(float)
ttf_prices=ttf_data[0:61,1].astype(float)/(3.421*1.17)    # Orjinal veri €/MWh, $/mmbtu'ya çeviriyoruz
jkm_prices=jkm_data[0:61,1].astype(float)
coal_prices=coal_data[0:61,1].astype(float)/23.8          # Orjinal veri $/ton, $/mmbtu'ya çeviriyoruz
brent_prices=brent_data[0:61,1].astype(float)*0.11         # Brent fiyatının da %11'ini alalım, böyle bir LNG fiyatı da olabilir

Şimdi dikkat

Burada verilerin hepsini tek bir veri çerçevesi- DataFrame'e atıyoruz. Ama sorun şu ki farklı kontratlar farklı tarihlerden başlıyor olabilir. Mesela kömürde bu ay kontratı olabiliyor ama Brent'te iki ay sonrasından başlayabilir. Bunun için tek tek verilerin ilk aylarına bakın... Bunlara dikkat edin

Ve prices yani fiyatlar adında veri çerçevemiz burada

In [12]:
prices=pd.DataFrame(list(zip(hh_data[0:61,0],hh_prices,ttf_prices, jkm_prices,coal_prices,brent_prices)),columns=["Date","HH","TTF","JKM","Coal","Brent"])

İsteyen tüm bu verileri Excel formatı ile de saklayabilir.

In [13]:
prices.to_excel("baris.xls")

Şimdi grafikleme zamanı. Bence anlamsız bir grafik yerine daha derli toplu bir grafik iyidir. Doğrudan

  • plot(prices.Data,prices.HH)

yazsanız da olur. Ama aşağıdaki çerçeve, boyut ve x eksen etiketlerinin döndürülmesi ile çizim daha anlamlı.

In [14]:
figure(figsize(30,10))
xticks(rotation=90)
grid("on")

plot(prices.Date,prices.HH)
plot(prices.Date,prices.Coal)
Out[14]:
[<matplotlib.lines.Line2D at 0x7fc1898e0198>]

Hepsini çizdirme

Şimdi tüm verileri çizdirebiliriz. Bu sefer plot yaparken label parametresi ile isimleri de verebiliriz. Bu sayede en sondaki legend komutu ile hangi grafiğin hangi veriye ait olduğunu görebiliriz.

In [15]:
#some style
figure(figsize(30,10))
grid("on");
xticks(rotation=90);
title("Gas and Coal prices in mmbtu (Future Prices) ")


# now plot data
plot(prices.Date,prices.HH,label="Henry Hub")
plot(prices.TTF ,label="TTF");
plot(prices.JKM, label="JKM");
plot(prices.Coal, label="Coal-API2");

# put the legend
legend(loc="upper left");

Örnekler

Aşağıda birçok parametre için nasıl bir çizim yapabileceğinize dair örnekler var

In [16]:
xticks(rotation=90)
grid("on")
title("title of the graph")
#your plot

#plot(prices.Date,prices.JKM)
#plot(prices.Date,prices.Coal)
plot(prices.Date,prices.HH*1.15+0.75, label="HH*1.15+0.75")
#plot(prices.Date,prices.TTF,label="TTF")
#plot(prices.Date,prices.JKM-prices.HH,label="JKM-HH difference")
legend(loc="upper right")
Out[16]:
<matplotlib.legend.Legend at 0x7fc1879f1630>