Python ile Enerji Analizi (barissanli.com/python)

Baslangic
Python'a Giris - Petrol fiyat modeli
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
20200419-petrolfiyatlari-montecarlo

Monte Carlo ile Petrol fiyat tahmini

Barış Sanlı , barissanli.com

Petrol fiyatlarını sayısal yöntemlerle tahmin etmek mümkün değil ama bazı dönemsel hareketlerin mekaniğini bilmek faydalı olabilir. Aşağıdaki kod dizisinde, öncelikle 2020'nin ilk çeyreğinin neden farklı bir dönem olduğuna bakıyoruz, daha sonra tarihsel dönemleri örnek alırsak petrol fiyatlarının gidebileceği yönleri görmeye çalışıyoruz.

Yapay zeka ile tabii ki 5-6 satırda bir tahmin yapılabilir. Ama biraz daha mantık setini anlamak için böyle bir model faydalı olabilir.

Bölüm 1 - İstatistiksel Bakış

Önce gerekli kütüphanelerimizi yükleyelim.. Alttaki kod ile de grafikleri daha büyük görmek için gerekli olan dizilimi görmekteyiz

In [1]:
%pylab inline
import pandas as pd
import seaborn as sb
Populating the interactive namespace from numpy and matplotlib
In [2]:
plt.rcParams['figure.figsize'] = [10, 7]  #grafikleri daha büyütmek için

Verilerimizi her Çarşamba güncellenen ABD Enerji Bakanlığı spot Brent fiyatlarından alacağız. Bu veriler Bloomberg-Reuters'de gördüğünüz verilerden farklı, çünkü spot fiyatlar. TV ekranlarında gördüğünüz ise genelde gelecek ay, yani teslimi 30-40 gün içinde yapılacak ürünler.

In [3]:
link='https://www.eia.gov/dnav/pet/hist_xls/RBRTEd.xls'

Şimdi verimizi yükleyelim, "Data 1" çalışma sayfasını seçip, verinin başladığı satırdan veriyi okuyalım

In [4]:
data = pd.read_excel(link,'Data 1', skiprows=(0,1))

İlk çeyrek verileri 1,2,3.ay verileri olduğundan, 2020 yılının ilk 3 ayının verilerini tüm veri setinden ayıralım

In [5]:
data_s=data[(data["Date"].dt.year==2020) & (data["Date"].dt.month<4) ] #2020 ilk çeyrek

Şimdi de bu verimizin histogram-yani istatistiksel dağılımını çıkaralım

In [6]:
hist(data_s["Europe Brent Spot Price FOB (Dollars per Barrel)"].pct_change().dropna(), bins=20);

Peki 2020 daha önceki yıllardan ne kadar farklıydı. Şimdi de 2020 öncesi yılların ilk çeyrek verilerini çıkaralım

In [7]:
data_yil=data[(data["Date"].dt.year<2020) & (data["Date"].dt.month<4) ]   #2020'den önceki yılların ilk çeyrekleri

Şimdi 2020 yılı ilk çeyrek ve 2020 yılı öncesindeki yılların ilk çeyrek değişim oranlarını çizdirelim

In [8]:
sb.distplot(data_yil["Europe Brent Spot Price FOB (Dollars per Barrel)"].pct_change().dropna(), hist=False, rug=False,hist_kws={"range": [0,1]})
sb.distplot(data_s["Europe Brent Spot Price FOB (Dollars per Barrel)"].pct_change().dropna(), hist=False, rug=False, hist_kws={"range": [0,1]})
#sb.title("2020 yılı ve daha önceki yıllarda ilk çeyrek petrol fiyatı değişim oranı")
plt.show()

Bölüm 2 - Fiyat seviyelerine göre artış oranı mı yüzdesi mi?

Mesela petrol fiyatları daha düşük iken, petrol artışları % olarak daha büyük olabiliyor şimdi bunu incelemeye çalışalım. Önce yeni bir sütun açarak yüzde değişim oranlarını yerleştirelim

In [9]:
data["pct"]=data["Europe Brent Spot Price FOB (Dollars per Barrel)"].pct_change()

Fiyat seviyelerine göre fiyat değişim % oranlarına, yarı saydam noktalar bütünü olarak bakalım

In [10]:
scatter(data["Europe Brent Spot Price FOB (Dollars per Barrel)"],data.pct,alpha=0.1)
Out[10]:
<matplotlib.collections.PathCollection at 0x7fd7c17b1fd0>

Şimdi ise yukarıdaki grafikte daha dar bir alana göz atalım

In [11]:
scatter(data["Europe Brent Spot Price FOB (Dollars per Barrel)"],data.pct,alpha=0.5)
ylim(-0.03,0.03)
Out[11]:
(-0.03, 0.03)

Yukarıda dikkat ettiminiz mi bilmiyorum ama özellikle belirli fiyat seviyelerinde bir kümelenme var. Mesela 20$,40-80$ ve 110$

Veri satırımızda % değişimler için pct sütununu açmıştık. Şimdi de mutlak farklar için "dif" sütununu açalım

In [12]:
data["dif"]=data["Europe Brent Spot Price FOB (Dollars per Barrel)"].diff()

Değişik fiyat seviylerindeki oynamanın tam sayı değerlerini kıyasladığımızda da benzer bir kesikli gruplama görüyoruz

In [13]:
scatter(data["Europe Brent Spot Price FOB (Dollars per Barrel)"],data["dif"],alpha=0.2)
Out[13]:
<matplotlib.collections.PathCollection at 0x7fd7c1701e80>

Bir öncekindeki gibi biraz daha yakından bakalım

In [14]:
scatter(data["Europe Brent Spot Price FOB (Dollars per Barrel)"],data["dif"],alpha=0.2)
ylim(-3,3)
Out[14]:
(-3, 3)

Bölüm 3 - Monte Carlo ile 2020 ilk dönemindeki değişimi tahmin

2020 yılının ilk 3 ayının verileri data_s değişkenindeydi. Şimdi bu dönemdeki yüzde değişimleri (pct_change) ile hesaplayarak, sayı olmayan sonuçları çıkaralım (dropna). Hesaplanan verileri de bir listeye çevirerek (.values) ile lst değişkenine alalım.

In [15]:
#ilk çeyrekte fiyat değişim oranı
lst=data_s["Europe Brent Spot Price FOB (Dollars per Barrel)"].pct_change().dropna().values

Ben bir kaç seferde aşağıdaki kodu yazdığımdan kısaca ne yaptığını özetleyeyim

  • Önce bir başlangıç petrol fiyatı ile başlar
  • Daha önceden 2020 1.çeyrekteki fiyat değişimlerini lst değişkenine atmıştık. Bu değişimlerden rastgele oranları alarak arka arkaya petrol fiyatı ile çarpar
  • days ile ileri doğru 90 gün için
  • numsim ile 300 defa tekrarlayarak
  • En yüksek değerleri pmax, en düşük değerleri pmin, ortalamaları da pmid'e alır
  • Ardından da grafiği çizdiriri
In [16]:
pricematrix=[]
startprice=67.7
days=90
numsim=300
for ax in np.arange(numsim):
 sprice=startprice
 price=[] 
 lsta=random.choice(lst,size=days)
 for ai in np.arange(days):
    sprice=sprice*(1+lsta[ai])
    price.append(sprice)
 pricematrix.append(price[:])

pmid=[]
pmin=[]
pmax=[]
npm=np.array(pricematrix)
for ax in np.arange(days):
 pmax.append(np.amax(npm[0:numsim,ax]))
 pmin.append(np.amin(npm[0:numsim,ax]))
 pmid.append(np.average(npm[0:numsim,ax]))


for ax in np.arange(numsim):
 plot(npm[ax,:], alpha=0.1*ax/numsim, color="red");
 

plot(pmax, color="#AA0000")
plot(pmin, color="#AA0000")
plot(pmid, color="#220000", linewidth=5)
Out[16]:
[<matplotlib.lines.Line2D at 0x7fd7c6375550>]