Zephyrnet Logosu

Finansta Python: Jupyter Notebook'ta Gerçek Zamanlı Veri Akışı – KDnuggets

Tarih:

Finansta Python: Jupyter Notebook'ta Gerçek Zamanlı Veri Akışı
 

Bu blogda, canlı veri akışlarını gerçek zamanlı olarak görselleştirmeyi, en sevdiğiniz araç olan Jupyter Notebook'un rahatlığında öğreneceksiniz. 

Çoğu projede Jupyter Notebook'lardaki dinamik grafiklerin manuel olarak güncellenmesi gerekir; örneğin, grafikleri güncellemek amacıyla yeni verileri getirmek için yeniden yüklemeye basmanız gerekebilir. Bu, finans da dahil olmak üzere hızlı tempolu herhangi bir sektör için pek işe yaramıyor. Kullanıcınız bu durumda yeniden yükleme tuşuna basmadığı için önemli satın alma göstergelerini veya dolandırıcılık uyarılarını kaçırmayı düşünün.

Burada size Jupyter Notebook'ta manuel güncellemelerden akış veya gerçek zamanlı yönteme nasıl geçeceğinizi göstererek projelerinizi daha verimli ve reaktif hale getireceğinizi göstereceğiz.

Neler kapsanıyor:

  • Gerçek Zamanlı Görselleştirme: Verileri nasıl hayata geçireceğinizi, gözlerinizin önünde saniye saniye gelişmesini izleyerek öğreneceksiniz.
  • Jüpyter Dizüstü Bilgisayar Ustalığı: Yalnızca statik veri analizi için değil, dinamik, akışlı veriler için de Jupyter Notebook'un tüm gücünden yararlanın.
  • Quant Finance Kullanım Örneği'nde Python: Finansta yaygın olarak kullanılan bir uygulamayı gerçek dünya verileriyle uygulayan pratik bir finansal uygulamaya dalın.
  • Akış Veri İşleme: Günümüzün hızlı veri dünyasında giderek daha önemli hale gelen bir beceri olan verileri gerçek zamanlı olarak işlemenin temellerini ve faydalarını anlayın.

Bu blogun sonunda Jupyter Notebook'unuzda aşağıdakine benzer gerçek zamanlı görselleştirmeleri nasıl oluşturacağınızı öğreneceksiniz.

 

Finansta Python: Jupyter Notebook'ta Gerçek Zamanlı Veri Akışı

Projemizin kalbinde akış işleme kavramı yatıyor. 

Basitçe söylemek gerekirse akış işleme, verileri oluşturulduğu anda gerçek zamanlı olarak işlemek ve analiz etmekle ilgilidir. Bunu, trafiğin yoğun olduğu saatlerde canlı olarak trafik güncellemelerini gördüğünüz, anında ve etkili rota değişikliklerine olanak tanıyan Google Haritalar gibi düşünün.

İlginç bir şekilde, Goldman Sachs'ın CIO'suna göre bu Forbes dergisinde podcast, akışa veya gerçek zamanlı veri işlemeye doğru ilerlemek, yöneldiğimiz önemli trendlerden biridir. 

Bu, gerçek zamanlı veri işlemenin gücünü Jupyter Notebook'ların etkileşimli ve tanıdık ortamıyla birleştirmeyle ilgilidir. 

Bunun yanı sıra, Jupyter Notebook'lar konteynerleştirilmiş ortamlarla iyi çalışır. Dolayısıyla projelerimiz sadece yerel makinelere bağlı kalmıyor; onları her yere götürebiliriz; onları bir iş arkadaşımızın dizüstü bilgisayarından bulut sunucusuna kadar her yerde sorunsuzca çalıştırabiliriz.

Finansta, ister dolandırıcılık tespiti ister ticaret olsun, her saniye önemlidir ve bu nedenle akış verilerinin işlenmesi önemli hale gelmiştir. Buradaki spot ışığı açık Bollinger Bantları, finansal ticaret için yararlı bir araç. Bu araç şunları içerir:

  • Orta Bant: Bu, son 20 dönem boyunca (yüksek frekanslı analiz için 20 dakika gibi) ortalama hisse senedi fiyatını hesaplayan ve son fiyat eğilimlerinin anlık görüntüsünü veren 20 dönemlik hareketli bir ortalamadır.
  • Dış Bantlar: Orta bandın 2 standart sapma üstünde ve altında yer alan bu göstergeler piyasa volatilitesini gösterir; daha geniş bantlar daha fazla volatiliteyi, daha dar bantlar ise daha az volatiliteyi gösterir.

 

Finansta Python: Jupyter Notebook'ta Gerçek Zamanlı Veri Akışı
 

Bollinger Bantlarında, hareketli ortalama fiyatı üst banda dokunduğunda veya bu bandı aştığında potansiyel olarak aşırı alım koşulları sinyali verilir (satış işareti, genellikle kırmızıyla işaretlenir) ve aşırı satış koşulları, fiyat alt bandın altına düştüğünde (satın alma işareti) gösterilir. , genellikle yeşil renkle işaretlenmiştir).

Algo yatırımcıları genellikle Bollinger Bantlarını diğer teknik göstergelerle eşleştirir. 

Burada işlem hacimlerini entegre ederek Bollinger Bantlarımızı oluştururken önemli bir ince ayar yaptık. Geleneksel olarak Bollinger Bantları işlem hacmini dikkate almaz ve yalnızca fiyat verilerine göre hesaplanır.

Böylece, Bollinger Bantlarını VWAP ± 2 × VWSTD mesafesinde belirttik; burada: 

  • VWAP: Bir 1 dakikalık hacim ağırlıklı ortalama fiyat Hacme daha duyarlı bir bakış açısı için.
  • VWSTD: Odaklanmış, 20 dakikalık standart sapmayani piyasa oynaklığının bir ölçüsü.

Teknik uygulama:

  • Zamansal olarak kullanıyoruz sürgülü pencereler ("pw.temporal.sliding"), verileri 20 dakikalık bölümler halinde analiz etmek için kullanılır; bu, gerçek zamanlı olarak bir büyüteci veriler üzerinde hareket ettirmeye benzer.
  • İşe alıyoruz redüktörler ("pw.reducers"), her pencere için belirli bir sonuç, yani bu durumda standart sapmalar elde etmek için her pencere içindeki verileri işler.
  • Polygon.io: Gerçek zamanlı ve geçmiş piyasa verilerinin sağlayıcısı. API'sini canlı veriler için kesinlikle kullanabilseniz de, bu demo için bazı verileri önceden bir CSV dosyasına kaydettik, böylece bir API anahtarına ihtiyaç duymadan takip etmeyi kolaylaştırdık.
  • Yol: Hızlı veri işleme için açık kaynaklı bir Pythonic çerçeve. Hem toplu (statik) hem de akışlı (gerçek zamanlı) verileri işler. 
  • Bokeh: Dinamik görselleştirmeler oluşturmak için ideal olan Bokeh, ilgi çekici, etkileşimli grafiklerle akış verilerimize hayat veriyor.
  • Panel: Yeni veri akışları geldikçe görselleştirmelerimizi güncellemek için Bokeh ile birlikte çalışarak projemizi gerçek zamanlı kontrol paneli özellikleriyle geliştirir.

Bu altı adımı içerir:

  1. İlgili çerçeveler için pip kurulumunun yapılması ve ilgili kütüphanelerin içe aktarılması.
  2. Örnek veriler getiriliyor
  3. Hesaplama için veri kaynağını ayarlama
  4. Bollinger Bantları için gerekli istatistiklerin hesaplanması
  5. Bokeh ve Panel Kullanarak Kontrol Paneli Oluşturma
  6. Çalıştır komutuna basmak

1. İçe Aktarma ve Kurulum

Öncelikle gerekli bileşenleri hızlı bir şekilde kuralım.

%%capture --no-display
!pip install pathway

 

Gerekli kütüphaneleri içe aktararak başlayın. Bu kütüphaneler veri işlemeye, görselleştirmeye ve etkileşimli kontrol panelleri oluşturmaya yardımcı olacaktır.

# Importing libraries for data processing, visualization, and dashboard creation

import datetime
import bokeh.models
import bokeh.plotting
import panel
import pathway as pw

2. Örnek Verilerin Alınması

Daha sonra örnek verileri GitHub'dan indirin. Bu adım, görselleştirme amacıyla verilerimize erişmek için çok önemlidir. Burada Apple Inc (AAPL) hisse senedi fiyatlarını getirdik.

# Command to download the sample APPLE INC stock prices extracted via Polygon API and stored in a CSV for ease of review of this notebook.

%%capture --no-display
!wget -nc https://gist.githubusercontent.com/janchorowski/e351af72ecd8d206a34763a428826ab7/raw/ticker.csv

 

Not: Bu eğitimde yayınlanan bir vitrinden yararlanılıyor okuyun

3. Veri Kaynağı Kurulumu

CSV dosyasını kullanarak bir akış veri kaynağı oluşturun. Bu, canlı veri akışını simüle ederek projeyi ilk kez oluştururken API anahtarı gerektirmeden gerçek zamanlı verilerle çalışmanın pratik bir yolunu sunar. 

# Creating a streaming data source from a CSV file

fname = "ticker.csv"
schema = pw.schema_from_csv(fname)
data = pw.demo.replay_csv(fname, schema=schema, input_rate=1000)

# Uncommenting the line below will override the data table defined above and switch the data source to static mode, which is helpful for initial testing
# data = pw.io.csv.read(fname, schema=schema, mode="static")

# Parsing the timestamps in the data

data = data.with_columns(t=data.t.dt.utc_from_timestamp(unit="ms"))

 

Not: Hemen hiçbir veri işleme gerçekleşmez, ancak sonunda run komutuna bastığımızda gerçekleşir.

4. Bollinger Bantları için gerekli istatistiklerin hesaplanması

Burada yukarıda tartıştığımız ticaret algoritmasını kısaca oluşturacağız. Elimizde Apple Inc. hisse senedi fiyatlarının kukla bir akışı var. Şimdi Bollinger Bantlarını oluşturmak için, 

  1. Ağırlıklı 20 dakikalık standart sapmayı (VWSTD) hesaplayacağız
  2. Fiyatların 1 dakikalık ağırlıklı ortalama ortalaması (VWAP)
  3. Yukarıdaki ikisine katılın.
# Calculating the 20-minute rolling statistics for Bollinger Bands


minute_20_stats = (
    data.windowby(
        pw.this.t,
        window=pw.temporal.sliding(
            hop=datetime.timedelta(minutes=1),
            duration=datetime.timedelta(minutes=20),
        ),
        behavior=pw.temporal.exactly_once_behavior(),
        instance=pw.this.ticker,
    )
    .reduce(
        ticker=pw.this._pw_instance,
        t=pw.this._pw_window_end,
        volume=pw.reducers.sum(pw.this.volume),
        transact_total=pw.reducers.sum(pw.this.volume * pw.this.vwap),
        transact_total2=pw.reducers.sum(pw.this.volume * pw.this.vwap**2),
    )
    .with_columns(vwap=pw.this.transact_total / pw.this.volume)
    .with_columns(
        vwstd=(pw.this.transact_total2 / pw.this.volume - pw.this.vwap**2)
        ** 0.5
    )
    .with_columns(
        bollinger_upper=pw.this.vwap + 2 * pw.this.vwstd,
        bollinger_lower=pw.this.vwap - 2 * pw.this.vwstd,
    )
)
# Computing the 1-minute rolling statistics

minute_1_stats = (
    data.windowby(
        pw.this.t,
        window=pw.temporal.tumbling(datetime.timedelta(minutes=1)),
        behavior=pw.temporal.exactly_once_behavior(),
        instance=pw.this.ticker,
    )
    .reduce(
        ticker=pw.this._pw_instance,
        t=pw.this._pw_window_end,
        volume=pw.reducers.sum(pw.this.volume),
        transact_total=pw.reducers.sum(pw.this.volume * pw.this.vwap),
    )
    .with_columns(vwap=pw.this.transact_total / pw.this.volume)
)
# Joining the 1-minute and 20-minute statistics for comprehensive analysis

joint_stats = (
    minute_1_stats.join(
        minute_20_stats,
        pw.left.t == pw.right.t,
        pw.left.ticker == pw.right.ticker,
    )
    .select(
        *pw.left,
        bollinger_lower=pw.right.bollinger_lower,
        bollinger_upper=pw.right.bollinger_upper
    )
    .with_columns(
        is_alert=(pw.this.volume > 10000)
        & (
            (pw.this.vwap > pw.this.bollinger_upper)
            | (pw.this.vwap  pw.this.bollinger_lower)
        )
    )
    .with_columns(
        action=pw.if_else(
            pw.this.is_alert,
            pw.if_else(
                pw.this.vwap > pw.this.bollinger_upper, "sell", "buy"
            ),
            "hold",
        )
    )
)
alerts = joint_stats.filter(pw.this.is_alert)

 

Not defterine göz atabilirsin okuyun Hesaplamaların daha derinlemesine anlaşılması için. 

5. Kontrol Paneli Oluşturma

Bokeh grafiği ve Panel tablosu görselleştirmesiyle analizimizi hayata geçirmenin zamanı geldi. 

# Function to create the statistics plot


def stats_plotter(src):
    actions = ["buy", "sell", "hold"]
    color_map = bokeh.models.CategoricalColorMapper(
        factors=actions, palette=("#00ff00", "#ff0000", "#00000000")
    )

    fig = bokeh.plotting.figure(
        height=400,
        width=600,
        title="20 minutes Bollinger bands with last 1 minute average",
        x_axis_type="datetime",
        y_range=(188.5, 191),
    )
    fig.line("t", "vwap", source=src)
    band = bokeh.models.Band(
        base="t",
        lower="bollinger_lower",
        upper="bollinger_upper",
        source=src,
        fill_alpha=0.3,
        fill_color="gray",
        line_color="black",
    )
    fig.scatter(
        "t",
        "vwap",
        color={"field": "action", "transform": color_map},
        size=10,
        marker="circle",
        source=src,
    )
    fig.add_layout(band)
    return fig


# Combining the plot and table in a Panel Row

viz = panel.Row(
    joint_stats.plot(stats_plotter, sorting_col="t"),
    alerts.select(
        pw.this.ticker, pw.this.t, pw.this.vwap, pw.this.action
    ).show(include_id=False, sorters=[{"field": "t", "dir": "desc"}]),
)
viz

 

Bu hücreyi çalıştırdığınızda not defterinizde çizim ve tablo için yer tutucu kaplar oluşturulur. Hesaplama başladıktan sonra canlı verilerle doldurulacaklar. 

6. Hesaplamayı Çalıştırma

Tüm hazırlıklar tamamlandı ve sıra veri işleme motorunu çalıştırmaya geldi.

# Command to start the Pathway data processing engine
%%capture --no-display
pw.run()

 

Kontrol paneli gerçek zamanlı olarak güncellendiğinde, Bollinger Bantlarının eylemleri nasıl tetiklediğini göreceksiniz (çoğunlukla biraz daha yüksek bir fiyatla, yeşil işaretleyiciler alış için ve kırmızı işaretleyiciler satış için). 

Not: Widget başlatıldıktan ve görünür hale geldikten sonra pw.run() işlevini manuel olarak çalıştırmalısınız. Bu GitHub sayısında daha fazla ayrıntı bulabilirsiniz okuyun.

Bu blogda Bollinger Bantlarını anlıyoruz ve sizi Jupyter Notebook'ta gerçek zamanlı finansal verileri görselleştirme yolculuğuna çıkarıyoruz. Bollinger Bantlarını ve açık kaynaklı Pythonic araçlarının bir karışımını kullanarak canlı veri akışlarını eyleme geçirilebilir içgörülere nasıl dönüştürebileceğimizi gösterdik.

Eğitimde, veri alımından etkileşimli kontrol paneline kadar uçtan uca bir çözüm için açık kaynaktan yararlanılarak gerçek zamanlı finansal veri analizinin pratik bir örneği sunulmaktadır. Aşağıdakileri yaparak benzer projeler oluşturabilirsiniz:

  • Bunu, Yahoo Finance, Polygon, Kraken vb. API'lerden canlı hisse senedi fiyatları alarak seçtiğiniz bir hisse senedi için yapabilirsiniz.
  • Bunu favori hisse senetleriniz, ETF'leriniz vb.'den oluşan bir grup için yapmak. 
  • Bollinger Bantları dışında başka bir ticaret aracından yararlanmak.

Bu araçları bir Jupyter Notebook'ta gerçek zamanlı verilerle entegre ederek, yalnızca piyasayı analiz etmekle kalmaz, aynı zamanda onu ortaya çıktıkça deneyimlersiniz. 

Mutlu akış!
 
 

Mudit Srivastava Pathway'da çalışıyor Bundan önce, AI Planet'in kurucu üyesiydi ve Yüksek Lisans ve Gerçek Zamanlı ML alanında aktif bir topluluk oluşturucudur.

spot_img

En Son İstihbarat

spot_img