Λογότυπο Zephyrnet

Python in Finance: Ροή δεδομένων σε πραγματικό χρόνο μέσα στο Jupyter Notebook – KDnuggets

Ημερομηνία:

Python in Finance: Ροή δεδομένων σε πραγματικό χρόνο μέσα στο σημειωματάριο Jupyter
 

Σε αυτό το ιστολόγιο, θα μάθετε να απεικονίζετε ζωντανές ροές δεδομένων σε πραγματικό χρόνο, όλα με την άνεση του αγαπημένου σας εργαλείου, του σημειωματάριου Jupyter. 

Στα περισσότερα έργα, τα δυναμικά γραφήματα στα Notebooks Jupyter χρειάζονται μη αυτόματες ενημερώσεις. για παράδειγμα, μπορεί να σας ζητήσει να πατήσετε επαναφόρτωση για να ανακτήσετε νέα δεδομένα για να ενημερώσετε τα γραφήματα. Αυτό δεν λειτουργεί καλά για κανένα κλάδο με γρήγορο ρυθμό, συμπεριλαμβανομένου του χρηματοοικονομικού. Σκεφτείτε το ενδεχόμενο να χάσετε σημαντικές ενδείξεις αγοράς ή ειδοποιήσεις απάτης, επειδή ο χρήστης σας δεν χτύπησε τη φόρτωση σε εκείνη την περίπτωση.

Εδώ, θα σας δείξουμε πώς να μετακινηθείτε από τις μη αυτόματες ενημερώσεις σε μια μέθοδο ροής ή σε πραγματικό χρόνο στο Jupyter Notebook, κάνοντας τα έργα σας πιο αποτελεσματικά και αντιδραστικά.

Τι καλύπτεται:

  • Οπτικοποίηση σε πραγματικό χρόνο: Θα μάθετε πώς να ζωντανεύετε τα δεδομένα, παρακολουθώντας τα να εξελίσσονται δευτερόλεπτο, μπροστά στα μάτια σας.
  • Κυριαρχία σημειωματάριου Jupyter: Εκμεταλλευτείτε την πλήρη ισχύ του Jupyter Notebook, όχι μόνο για στατική ανάλυση δεδομένων αλλά και για δυναμικά δεδομένα ροής.
  • Python σε περίπτωση χρήσης Quant Finance: Βουτήξτε σε μια πρακτική οικονομική εφαρμογή, εφαρμόζοντας μια ευρέως χρησιμοποιούμενη στη χρηματοδότηση με δεδομένα πραγματικού κόσμου.
  • Επεξεργασία δεδομένων ροής: Κατανοήστε τα θεμέλια και τα οφέλη της επεξεργασίας δεδομένων σε πραγματικό χρόνο, μια δεξιότητα που γίνεται ολοένα και πιο σημαντική στον σημερινό κόσμο των δεδομένων με γρήγορο ρυθμό.

Μέχρι το τέλος αυτού του ιστολογίου, θα ξέρετε πώς να δημιουργήσετε παρόμοιες απεικονίσεις σε πραγματικό χρόνο, όπως αυτή που ακολουθεί, στο Σημειωματάριο Jupyter.

 

Python in Finance: Ροή δεδομένων σε πραγματικό χρόνο μέσα στο σημειωματάριο Jupyter

Στην καρδιά του έργου μας βρίσκεται η έννοια της επεξεργασίας ροής. 

Με απλά λόγια, η επεξεργασία ροής αφορά το χειρισμό και την ανάλυση δεδομένων σε πραγματικό χρόνο καθώς δημιουργούνται. Σκεφτείτε το όπως οι Χάρτες Google κατά τη διάρκεια μιας ώρας αιχμής, όπου βλέπετε ζωντανά ενημερώσεις κυκλοφορίας, επιτρέποντας άμεσες και αποτελεσματικές αλλαγές διαδρομής.

Είναι ενδιαφέρον, σύμφωνα με τον CIO της Goldman Sachs σε αυτό το Forbes το podcast, η μετάβαση προς την επεξεργασία δεδομένων ροής ή σε πραγματικό χρόνο είναι μία από τις σημαντικές τάσεις προς τις οποίες οδεύουμε. 

Πρόκειται για το συνδυασμό της ισχύος της επεξεργασίας δεδομένων σε πραγματικό χρόνο με ένα διαδραστικό και οικείο περιβάλλον των φορητών υπολογιστών Jupyter. 

Εκτός αυτού, τα σημειωματάρια Jupyter παίζουν καλά με περιβάλλοντα με κοντέινερ. Επομένως, τα έργα μας δεν είναι κολλημένα μόνο σε τοπικά μηχανήματα. μπορούμε να τα μεταφέρουμε οπουδήποτε – να τα εκτελούμε ομαλά σε οτιδήποτε, από φορητό υπολογιστή συναδέλφου έως διακομιστή cloud.

Στα οικονομικά, κάθε δευτερόλεπτο μετράει, είτε για ανίχνευση απάτης είτε για διαπραγμάτευση, και γι' αυτό η επεξεργασία δεδομένων ροής έχει γίνει απαραίτητη. Τα φώτα της δημοσιότητας εδώ είναι αναμμένα Bollinger Bands, ένα εργαλείο χρήσιμο για χρηματοοικονομικές συναλλαγές. Αυτό το εργαλείο περιλαμβάνει:

  • The Middle Band: Αυτός είναι ένας κινητός μέσος όρος 20 περιόδων, ο οποίος υπολογίζει τη μέση τιμή της μετοχής τις τελευταίες 20 περιόδους (όπως 20 λεπτά για ανάλυση υψηλής συχνότητας), δίνοντας ένα στιγμιότυπο των πρόσφατων τάσεων των τιμών.
  • Εξωτερικές ζώνες: Εντοπίζονται 2 τυπικές αποκλίσεις πάνω και κάτω από τη μεσαία ζώνη, υποδεικνύουν αστάθεια της αγοράς – οι ευρύτερες ζώνες υποδηλώνουν μεγαλύτερη μεταβλητότητα και οι στενότερες ζώνες λιγότερο.

 

Python in Finance: Ροή δεδομένων σε πραγματικό χρόνο μέσα στο σημειωματάριο Jupyter
 

Στο Bollinger Bands, οι πιθανώς υπεραγορασμένες συνθήκες σηματοδοτούνται όταν η κινούμενη μέση τιμή αγγίζει ή υπερβαίνει την ανώτερη ζώνη (ένα σημάδι πώλησης, που συχνά επισημαίνεται με κόκκινο) και οι συνθήκες υπερπώλησης υποδεικνύονται όταν η τιμή πέφτει κάτω από την κάτω ζώνη (ένα υπόδειξη αγοράς , συνήθως σημειώνεται με πράσινο χρώμα).

Οι έμποροι Algo συνήθως συνδυάζουν τις ζώνες Bollinger με άλλους τεχνικούς δείκτες. 

Εδώ, κάναμε μια ουσιαστική προσαρμογή κατά τη δημιουργία των ζωνών Bollinger μας ενσωματώνοντας όγκους συναλλαγών. Παραδοσιακά, τα Bollinger Bands δεν λαμβάνουν υπόψη τον όγκο συναλλαγών και υπολογίζονται αποκλειστικά με βάση τα δεδομένα τιμών.

Έτσι, έχουμε υποδείξει Ζώνες Bollinger σε απόσταση VWAP ± 2 × VWSTD όπου: 

  • VWAP: Α Μέση σταθμισμένη τιμή 1 λεπτού για μια πιο ευαίσθητη στον όγκο προοπτική.
  • VWSTD: Αντιπροσωπεύει ένα εστιασμένο, Τυπική απόκλιση 20 λεπτών, δηλαδή, ένα μέτρο της αστάθειας της αγοράς.

Τεχνική εφαρμογή:

  • Χρησιμοποιούμε χρονικά συρόμενα παράθυρα ('pw.temporal.sliding') για ανάλυση δεδομένων σε τμήματα 20 λεπτών, παρόμοια με τη μετακίνηση ενός μεγεθυντικού φακού πάνω από τα δεδομένα σε πραγματικό χρόνο.
  • Απασχολούμε μειωτήρες ('pw.reducers'), τα οποία επεξεργάζονται δεδομένα σε κάθε παράθυρο για να δώσουν ένα συγκεκριμένο αποτέλεσμα για κάθε παράθυρο, δηλαδή τις τυπικές αποκλίσεις σε αυτήν την περίπτωση.
  • Polygon.io: Πάροχος δεδομένων αγοράς σε πραγματικό χρόνο και ιστορικά στοιχεία. Αν και σίγουρα μπορείτε να χρησιμοποιήσετε το API του για ζωντανά δεδομένα, έχουμε αποθηκεύσει εκ των προτέρων ορισμένα δεδομένα σε ένα αρχείο CSV για αυτήν την επίδειξη, καθιστώντας την εύκολη παρακολούθηση χωρίς να χρειάζεται κλειδί API.
  • Διαδρομή: Ένα πλαίσιο Pythonic ανοιχτού κώδικα για γρήγορη επεξεργασία δεδομένων. Χειρίζεται τόσο μαζικά (στατικά) όσο και δεδομένα ροής (σε πραγματικό χρόνο). 
  • Bokeh: Ιδανικό για τη δημιουργία δυναμικών απεικονίσεων, το Bokeh ζωντανεύει τα δεδομένα ροής μας με ελκυστικά, διαδραστικά γραφήματα.
  • Πίνακας: Βελτιώνει το έργο μας με δυνατότητες του πίνακα εργαλείων σε πραγματικό χρόνο, δουλεύοντας παράλληλα με την Bokeh για να ενημερώνουμε τις απεικονίσεις μας καθώς έρχονται νέες ροές δεδομένων.

Αυτό περιλαμβάνει έξι βήματα:

  1. Κάνοντας εγκατάσταση pip για σχετικά πλαίσια και εισαγωγή σχετικών βιβλιοθηκών.
  2. Ανάκτηση δειγμάτων δεδομένων
  3. Ρύθμιση της πηγής δεδομένων για υπολογισμό
  4. Υπολογισμός των απαραίτητων στατιστικών για τις μπάντες Bollinger
  5. Δημιουργία πίνακα ελέγχου με χρήση Bokeh και Panel
  6. Πατώντας την εντολή εκτέλεσης

1. Εισαγωγές και εγκατάσταση

Αρχικά, ας εγκαταστήσουμε γρήγορα τα απαραίτητα εξαρτήματα.

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

 

Ξεκινήστε εισάγοντας τις απαραίτητες βιβλιοθήκες. Αυτές οι βιβλιοθήκες θα βοηθήσουν στην επεξεργασία δεδομένων, την οπτικοποίηση και τη δημιουργία διαδραστικών πινάκων εργαλείων.

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

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

2. Λήψη Δειγμάτων Δεδομένων

Στη συνέχεια, πραγματοποιήστε λήψη του δείγματος δεδομένων από το GitHub. Αυτό το βήμα είναι ζωτικής σημασίας για την πρόσβαση στα δεδομένα μας για οπτικοποίηση. Εδώ, έχουμε ανακτήσει τις τιμές των μετοχών της Apple Inc (AAPL).

# 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

 

Σημείωση: Αυτό το σεμινάριο αξιοποιεί μια δημοσιευμένη βιτρίνα εδώ

3. Ρύθμιση πηγής δεδομένων

Δημιουργήστε μια πηγή δεδομένων ροής χρησιμοποιώντας το αρχείο CSV. Αυτό προσομοιώνει μια ζωντανή ροή δεδομένων, προσφέροντας έναν πρακτικό τρόπο εργασίας με δεδομένα σε πραγματικό χρόνο χωρίς να απαιτείται κλειδί API κατά την κατασκευή του έργου για πρώτη φορά. 

# 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"))

 

Σημείωση: Δεν πραγματοποιείται επεξεργασία δεδομένων αμέσως, αλλά στο τέλος όταν πατήσουμε την εντολή εκτέλεσης.

4. Υπολογισμός των απαραίτητων στατιστικών για τις ζώνες Bollinger

Εδώ, θα δημιουργήσουμε εν συντομία τον αλγόριθμο συναλλαγών που συζητήσαμε παραπάνω. Έχουμε μια εικονική ροή τιμών μετοχών της Apple Inc.. Τώρα, για να φτιάξω μπάντες Bollinger, 

  1. Θα υπολογίσουμε τη σταθμισμένη τυπική απόκλιση 20 λεπτών (VWSTD)
  2. Ο σταθμισμένος μέσος όρος τιμών 1 λεπτού (VWAP)
  3. Ενώστε τα δύο παραπάνω.
# 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)

 

Μπορείτε να δείτε το σημειωματάριο εδώ για βαθύτερη κατανόηση των υπολογισμών. 

5. Δημιουργία πίνακα ελέγχου

Ήρθε η ώρα να ζωντανέψουμε την ανάλυσή μας με μια πλοκή Bokeh και οπτικοποίηση πίνακα πίνακα. 

# 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

 

Όταν εκτελείτε αυτό το κελί, δημιουργούνται δοχεία κράτησης θέσης στο σημειωματάριό σας για την γραφική παράσταση και τον πίνακα. Θα γεμίσουν με ζωντανά δεδομένα μόλις ξεκινήσει ο υπολογισμός. 

6. Εκτέλεση του Υπολογισμού

Όλες οι προετοιμασίες έχουν ολοκληρωθεί και ήρθε η ώρα να λειτουργήσει η μηχανή επεξεργασίας δεδομένων.

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

 

Καθώς ο πίνακας εργαλείων ενημερώνεται σε πραγματικό χρόνο, θα δείτε πώς τα Bollinger Bands ενεργοποιούν ενέργειες – πράσινους δείκτες για αγορά και κόκκινους για πώληση, συχνά σε ελαφρώς υψηλότερη τιμή. 

Σημείωση: Θα πρέπει να εκτελέσετε με μη αυτόματο τρόπο το pw.run() αφού το γραφικό στοιχείο αρχικοποιηθεί και είναι ορατό. Μπορείτε να βρείτε περισσότερες λεπτομέρειες σε αυτό το τεύχος του GitHub εδώ.

Σε αυτό το ιστολόγιο, κατανοούμε τα Bollinger Bands και σας μεταφέρουμε σε ένα ταξίδι οπτικοποίησης οικονομικών δεδομένων σε πραγματικό χρόνο στο Jupyter Notebook. Δείξαμε πώς να μετατρέψουμε τις ζωντανές ροές δεδομένων σε αξιόπιστες πληροφορίες χρησιμοποιώντας Bollinger Bands και ένα μείγμα εργαλείων Pythonic ανοιχτού κώδικα.

Το σεμινάριο παρέχει ένα πρακτικό παράδειγμα ανάλυσης οικονομικών δεδομένων σε πραγματικό χρόνο, αξιοποιώντας τον ανοιχτό κώδικα για μια ολοκληρωμένη λύση από την ανάκτηση δεδομένων έως τον διαδραστικό πίνακα ελέγχου. Μπορείτε να δημιουργήσετε παρόμοια έργα από:

  • Κάνετε αυτό για ένα απόθεμα της επιλογής σας, λαμβάνοντας ζωντανές τιμές μετοχών από API όπως το Yahoo Finance, το Polygon, το Kraken κ.λπ.
  • Κάνοντας αυτό για μια ομάδα από τις αγαπημένες σας μετοχές, ETF κ.λπ. 
  • Μόχλευση κάποιου άλλου εργαλείου συναλλαγών εκτός από το Bollinger Bands.

Ενσωματώνοντας αυτά τα όργανα με δεδομένα σε πραγματικό χρόνο σε ένα Notebook Jupyter, δεν αναλύετε απλώς την αγορά αλλά τη βιώνετε καθώς εξελίσσεται. 

Καλή ροή!
 
 

Μουντίτ Σριβαστάβα εργάζεται στην Pathway. Πριν από αυτό, ήταν ιδρυτικό μέλος της AI Planet και είναι ενεργός δημιουργός κοινότητας στον τομέα των LLM και της ML σε πραγματικό χρόνο.

spot_img

Τελευταία Νοημοσύνη

spot_img