Doğalgaz ve Petrol de Future/Gelecek Fiyatlarına Erişim ve Bölgesel Gaz Fiyat Farkları¶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¶
Ö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
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
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]:
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]:
|