Python for Finance - Αλγοριθμικός οδηγός συναλλαγών για αρχάριους

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

Οι μαθηματικοί αλγόριθμοι επιφέρουν καινοτομία και ταχύτητα. Μπορούν να μας βοηθήσουν να αποκτήσουμε ανταγωνιστικό πλεονέκτημα στην αγορά.

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

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

Αυτό το σεμινάριο χρησιμεύει ως οδηγός για αρχάριους για ποσοτικές συναλλαγές με την Python. Θα βρείτε αυτήν την ανάρτηση πολύ χρήσιμη εάν:

  1. Ένας φοιτητής ή κάποιος που στοχεύει να γίνει ποσοτικός αναλυτής (quant) σε ένα ταμείο ή τράπεζα.
  2. Κάποιος που σχεδιάζει να ξεκινήσει τη δική του επιχείρηση ποσοτικών συναλλαγών.

Θα εξετάσουμε τα ακόλουθα θέματα σε αυτήν την ανάρτηση:

  • Βασικά στοιχεία των μετοχών και των συναλλαγών
  • Εξαγωγή δεδομένων από το Quandl API
  • Διερευνητική ανάλυση δεδομένων σχετικά με τα δεδομένα τιμολόγησης μετοχών
  • Κινούμενοι μέσοι όροι
  • Διαμόρφωση στρατηγικής συναλλαγών με την Python
  • Οπτικοποίηση της απόδοσης της στρατηγικής

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

Τι είναι τα αποθέματα; Τι είναι το Χρηματιστήριο;

Αποθέματα

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

Ένας οργανισμός ή εταιρεία εκδίδει αποθέματα για να συγκεντρώσει περισσότερα κεφάλαια / κεφάλαια προκειμένου να κλιμακώσει και να συμμετάσχει σε περισσότερα έργα. Αυτά τα αποθέματα είναι στη συνέχεια διαθέσιμα στο κοινό και πωλούνται και αγοράζονται.

Στρατηγική διαπραγμάτευσης και διαπραγμάτευσης μετοχών

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

Ανάλογα με την απόδοση και τις ενέργειες της εταιρείας, οι τιμές των μετοχών ενδέχεται να κινούνται πάνω-κάτω, αλλά η μεταβολή των τιμών των μετοχών δεν περιορίζεται στην απόδοση της εταιρείας.

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

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

Έτσι, οι περισσότεροι έμποροι ακολουθούν ένα σχέδιο και μοντέλο για συναλλαγές. Αυτό είναι γνωστό ως εμπορική στρατηγική.

Οι ποσοτικοί έμποροι στα hedge funds και στις επενδυτικές τράπεζες σχεδιάζουν και αναπτύσσουν αυτές τις στρατηγικές και τα πλαίσια συναλλαγών για να τα δοκιμάσουν. Απαιτεί βαθιά εμπειρία προγραμματισμού και κατανόηση των γλωσσών που απαιτούνται για τη δημιουργία της δικής σας στρατηγικής.

Η Python είναι μια από τις πιο δημοφιλείς γλώσσες προγραμματισμού που χρησιμοποιούνται, μεταξύ των C ++, Java, R και MATLAB. Υιοθετείται ευρέως σε όλους τους τομείς, ειδικά στην επιστήμη δεδομένων, λόγω της εύκολης σύνταξης, της τεράστιας κοινότητας και της υποστήριξης τρίτων.

Θα χρειαστείτε εξοικείωση με την Python και τα στατιστικά στοιχεία για να αξιοποιήσετε στο έπακρο αυτό το σεμινάριο. Φροντίστε να συνεχίσετε το Python και να δείτε τις βασικές στατιστικές.

Εξαγωγή δεδομένων από το Quandl API

Για να εξαγάγουμε δεδομένα τιμολόγησης μετοχών, θα χρησιμοποιήσουμε το API Quandl. Αλλά πριν από αυτό, ας ρυθμίσουμε το εργασιακό περιβάλλον. Δείτε πώς:

  1. Στο τερματικό σας, δημιουργήστε έναν νέο κατάλογο για το έργο (ονομάστε το όπως θέλετε):
mkdir 
  1. Βεβαιωθείτε ότι έχετε εγκαταστήσει το Python 3 και το virtualenv στον υπολογιστή σας.
  2. Δημιουργήστε ένα νέο Python 3 virtualenv χρησιμοποιώντας virtualenv και ενεργοποιήστε το χρησιμοποιώντας source /bin/activate.
  3. Τώρα, εγκαταστήστε το jupyter-notebook χρησιμοποιώντας το pip και πληκτρολογήστε pip install jupyter-notebookτο τερματικό.
  4. Ομοίως, εγκαταστήστε το pandas, quandlκαι numpyτα πακέτα.
  5. Εκτελέστε το jupyter-notebookαπό το τερματικό.

Τώρα, το σημειωματάριό σας θα πρέπει να λειτουργεί σε localhost όπως το παρακάτω στιγμιότυπο οθόνης:

Μπορείτε να δημιουργήσετε το πρώτο σας σημειωματάριο κάνοντας κλικ στο Newαναπτυσσόμενο μενού στα δεξιά. Βεβαιωθείτε ότι έχετε δημιουργήσει έναν λογαριασμό στο Quandl. Ακολουθήστε τα βήματα που αναφέρονται εδώ για να δημιουργήσετε το κλειδί API σας.

Μόλις είστε έτοιμοι, ας βουτήξουμε κατευθείαν:

# importing required packages
import pandas as pd import quandl as q

Το Pandas θα είναι το πιο αυστηρά χρησιμοποιούμενο πακέτο σε αυτό το σεμινάριο, καθώς θα κάνουμε πολλούς χειρισμούς και σχεδίαση δεδομένων.

Μετά την εισαγωγή των πακέτων, θα υποβάλουμε αιτήματα στο Quandl API χρησιμοποιώντας το πακέτο Quandl:

# set the API key q.ApiConfig.api_key = "”
#send a get request to query Microsoft's end of day stock prices from 1st #Jan, 2010 to 1st Jan, 2019 msft_data = q.get("EOD/MSFT", start_date="2010-01-01", end_date="2019-01-01")
# look at the first 5 rows of the dataframe msft_data.head()

Here we have Microsoft’s EOD stock pricing data for the last 9 years. All you had to do was call the get method from the Quandl package and supply the stock symbol, MSFT, and the timeframe for the data you need.

This was really simple, right? Let’s move ahead to understand and explore this data further.

Exploratory Data Analysis on Stock Pricing Data

With the data in our hands, the first thing we should do is understand what it represents and what kind of information it encapsulates.

Printing the DataFrame’s info, we can see all that it contains:

As seen in the screenshot above, the DataFrame contains DatetimeIndex, which means we’re dealing with time-series data.

An index can be thought of as a data structure that helps us modify or reference the data. Time-series data is a sequence of snapshots of prices taken at consecutive, equally spaced intervals of time.

In trading, EOD stock pricing data captures the movement of certain parameters about a stock, such as the stock price, over a specified period of time with data points recorded at regular intervals.

Important Terminology

Looking at other columns, let’s try to understand what each column represents:

  • Open/Close — Captures the opening/closing price of the stock
  • Adj_Open/Adj_Close — An adjusted opening/closing price is a stock’s price on any given day of trading that has been revised to include any dividend distributions, stock splits, and other corporate actions that occurred at any time before the next day’s open.
  • Volume — It records the number of shares that are being traded on any given day of trading.
  • High/Low — It tracks the highest and the lowest price of the stock during a particular day of trading.

These are the important columns that we will focus on at this point in time.

We can learn about the summary statistics of the data, which shows us the number of rows, mean, max, standard deviations, and so on. Try running the following line of code in the Ipython cell:

msft_data.describe()

resample()

Pandas’ resample() method is used to facilitate control and flexibility on the frequency conversion of the time series data. We can specify the time intervals to resample the data to monthly, quarterly, or yearly, and perform the required operation over it.

msft_data.resample('M').mean()

This is an interesting way to analyze stock performance in different timeframes.

Calculating returns

Η οικονομική απόδοση είναι απλά τα χρήματα που γίνονται ή χάνονται σε μια επένδυση. Η απόδοση μπορεί να εκφραστεί ονομαστικά ως η αλλαγή στο ποσό μιας επένδυσης με την πάροδο του χρόνου. Μπορεί να υπολογιστεί ως το ποσοστό που προκύπτει από τη σχέση κέρδους προς επένδυση.

Έχουμε στη διάθεσή μας το pct_change () για το σκοπό αυτό. Δείτε πώς μπορείτε να υπολογίσετε τις επιστροφές:

# Import numpy package import numpy as np
# assign `Adj Close` to `daily_close` daily_close = msft_data[['Adj_Close']]
# returns as fractional change daily_return = daily_close.pct_change()
# replacing NA values with 0 daily_return.fillna(0, inplace=True)
print(daily_return)

Αυτό θα εκτυπώσει τις αποδόσεις που δημιουργεί το απόθεμα σε καθημερινή βάση. Ο πολλαπλασιασμός του αριθμού με 100 θα σας δώσει την ποσοστιαία αλλαγή.

Ο τύπος που χρησιμοποιείται στο pct_change () είναι:

Επιστροφή = {(Τιμή σε t) - (Τιμή σε t-1)} / {Τιμή σε t-1}

Τώρα, για να υπολογίσετε τις μηνιαίες επιστροφές, το μόνο που χρειάζεται να κάνετε είναι:

mdata = msft_data.resample('M').apply(lambda x: x[-1]) monthly_return = mdata.pct_change()

Μετά τη δειγματοληψία των δεδομένων σε μήνες (για εργάσιμες ημέρες), μπορούμε να πάρουμε την τελευταία ημέρα συναλλαγών του μήνα χρησιμοποιώντας τη apply()συνάρτηση

apply() takes in a function and applies it to each and every row of the Pandas series. The lambda function is an anonymous function in Python which can be defined without a name, and only takes expressions in the following format:

Lambda: expression

For example, lambda x: x * 2 is a lambda function. Here, x is the argument and x * 2 is the expression that gets evaluated and returned.

Moving Averages in Trading

The concept of moving averages is going to build the base for our momentum-based trading strategy.

In finance, analysts often have to evaluate statistical metrics continually over a sliding window of time, which is called moving window calculations.

Let’s see how we can calculate the rolling mean over a window of 50 days, and slide the window by 1 day.

rolling()

This is the magical function which does the tricks for us:

# assigning adjusted closing prices to adj_pricesadj_price = msft_data['Adj_Close']
# calculate the moving average mav = adj_price.rolling(window=50).mean()
# print the resultprint(mav[-10:])

You’ll see the rolling mean over a window of 50 days (approx. 2 months). Moving averages help smooth out any fluctuations or spikes in the data, and give you a smoother curve for the performance of the company.

We can plot and see the difference:

# import the matplotlib package to see the plot import matplotlib.pyplot as plt adj_price.plot()

You can now plot the rolling mean():

mav.plot()

And you can see the difference for yourself, how the spikes in the data are consumed to give a general sentiment around the performance of the stock.

Formulating a Trading Strategy

Here comes the final and most interesting part: designing and making the trading strategy. This will be a step-by-step guide to developing a momentum-based Simple Moving Average Crossover (SMAC) strategy.

Momentum-based strategies are based on a technical indicator that capitalizes on the continuance of the market trend. We purchase securities that show an upwards trend and short-sell securities which show a downward trend.

The SMAC strategy is a well-known schematic momentum strategy. It is a long-only strategy. Momentum, here, is the total return of stock including the dividends over the last n months. This period of n months is called the lookback period.

There are 3 main types of lookback periods: short term, intermediate-term, and long term. We need to define 2 different lookback periods of a particular time series.

A buy signal is generated when the shorter lookback rolling mean (or moving average) overshoots the longer lookback moving average. A sell signal occurs when the shorter lookback moving average dips below the longer moving average.

Now, let’s see how the code for this strategy will look:

# step1: initialize the short and long lookback periods short_lb = 50long_lb = 120
# step2: initialize a new DataFrame called signal_df with a signal column signal_df = pd.DataFrame(index=msft_data.index)signal_df['signal'] = 0.0
# step3: create a short simple moving average over the short lookback period signal_df['short_mav'] = msft_data['Adj_Close'].rolling(window=short_lb, min_periods=1, center=False).mean()
# step4: create long simple moving average over the long lookback period signal_df['long_mav'] = msft_data['Adj_Close'].rolling(window=long_lb, min_periods=1, center=False).mean()
# step5: generate the signals based on the conditional statement signal_df['signal'][short_lb:] = np.where(signal_df['short_mav'][short_lb:] > signal_df['long_mav'][short_lb:], 1.0, 0.0) 
# step6: create the trading orders based on the positions column signal_df['positions'] = signal_df['signal'].diff()signal_df[signal_df['positions'] == -1.0]

Let’s see what’s happening here. We have created 2 lookback periods. The short lookback period short_lb is 50 days, and the longer lookback period for the long moving average is defined as a long_lb of 120 days.

We have created a new DataFrame which is designed to capture the signals. These signals are being generated whenever the short moving average crosses the long moving average using the np.where. It assigns 1.0 for true and 0.0 if the condition comes out to be false.

The positions columns in the DataFrame tells us if there is a buy signal or a sell signal, or to stay put. We're basically calculating the difference in the signals column from the previous row using diff.

And there we have our strategy implemented in just 6 steps using Pandas. Easy, wasn't it?

Now, let’s try to visualize this using Matplotlib. All we need to do is initialize a plot figure, add the adjusted closing prices, short, and long moving averages to the plot, and then plot the buy and sell signals using the positions column in the signal_df above:

# initialize the plot using plt fig = plt.figure()
# Add a subplot and label for y-axis plt1 = fig.add_subplot(111, ylabel="Price in $")
msft_data['Adj_Close'].plot(ax=plt1,, lw=2.)
# plot the short and long lookback moving averages signal_df[['short_mav', 'long_mav']].plot(ax=plt1, lw=2., figsize=(12,8))
# plotting the sell signals plt1.plot(signal_df.loc[signal_df.positions == -1.0].index, signal_df.short_mav[signal_df.positions == -1.0],'v', markersize=10,)
# plotting the buy signals plt1.plot(signal_df.loc[signal_df.positions == 1.0].index, signal_df.short_mav[signal_df.positions == 1.0], '^', markersize=10,) # Show the plotplt.show()

Running the above cell in the Jupyter notebook would yield a plot like the one below:

Now, you can clearly see that whenever the blue line (short moving average) goes up and beyond the orange line (long moving average), there is a pink upward marker indicating a buy signal.

A sell signal is denoted by a black downward marker where there’s a fall of the short_mav below long_mav.

Visualize the Performance of the Strategy on Quantopian

Quantopian is a Zipline-powered platform that has manifold use cases. You can write your own algorithms, access free data, backtest your strategy, contribute to the community, and collaborate with Quantopian if you need capital.

We have written an algorithm to backtest our SMA strategy, and here are the results:

Here is an explanation of the above metrics:

  • Total return: The total percentage return of the portfolio from the start to the end of the backtest.
  • Specific return: The difference between the portfolio’s total returns and common returns.
  • Common return: Returns that are attributable to common risk factors. There are 11 sector and 5 style risk factors that make up these returns. The Sector Exposure and Style Exposure charts in the Risk section provide more detail on these factors.
  • Sharpe: The 6-month rolling Sharpe ratio. It is a measure of risk-adjusted investment. It is calculated by dividing the portfolio’s excess returns over the risk-free rate by the portfolio’s standard deviation.
  • Max Drawdown: The largest drop of all the peak-to-trough movement in the portfolio’s history.
  • Volatility: Standard deviation of the portfolio’s returns.

Pat yourself on the back as you have successfully implemented your quantitative trading strategy!

Where to go From Here?

Now that your algorithm is ready, you’ll need to backtest the results and assess the metrics mapping the risk involved in the strategy and the stock. Again, you can use BlueShift and Quantopian to learn more about backtesting and trading strategies.

Further Resources

Quantra is a brainchild of QuantInsti. With a range of free and paid courses by experts in the field, Quantra offers a thorough guide on a bunch of basic and advanced trading strategies.

  • Data Science Course — They have rolled out an introductory course on Data Science that helps you build a strong foundation for projects in Data Science.
  • Trading Courses for Beginners — From momentum trading to machine and deep learning-based trading strategies, researchers in the trading world like Dr. Ernest P. Chan are the authors of these niche courses.

Free Resources

To learn more about trading algorithms, check out these blogs:

  • Quantstart — they cover a wide range of backtesting algorithms, beginner guides, and more.
  • Investopedia — everything you want to know about investment and finance.
  • Quantivity — detailed mathematical explanations of algorithms and their pros and cons.

Warren Buffet says he reads about 500 pages a day, which should tell you that reading is essential in order to succeed in the field of finance.

Embark upon this journey of trading and you can lead a life full of excitement, passion, and mathematics.

Data Science with Harshit

With this channel, I am planning to roll out a couple of series covering the entire data science space. Here is why you should be subscribing to the channel:

  • Αυτές οι σειρές θα καλύπτουν όλα τα απαιτούμενα / απαιτούμενα σεμινάρια ποιότητας για καθένα από τα θέματα και τα υποθέματα όπως τα βασικά Python για την Επιστήμη των Δεδομένων.
  • Επεξήγησε τα Μαθηματικά και τις παραλλαγές του γιατί κάνουμε αυτό που κάνουμε στο ML και την Deep Learning.
  • Podcasts με Επιστήμονες και Μηχανικούς Δεδομένων σε Google, Microsoft, Amazon κ.λπ. και διευθύνοντες σύμβουλους μεγάλων εταιρειών που βασίζονται σε δεδομένα.
  • Έργα και οδηγίες για την εφαρμογή των θεμάτων που έχουν μάθει μέχρι στιγμής. Μάθετε σχετικά με τις νέες πιστοποιήσεις, το Bootcamp και τους πόρους για να σπάσετε αυτές τις πιστοποιήσεις, όπως αυτή η εξέταση πιστοποιητικών προγραμματιστών TensorFlow από την Google.

Στη συνέχεια, μπορείτε να συνδεθείτε μαζί μου στο Twitter ή στο LinkedIn.