What you’ll learn
- Build automated Trading Bots with Python and Amazon Web Services (AWS)
- Create powerful and unique Trading Strategies based on Technical Indicators and Machine Learning / Deep Learning.
- Rigorous Testing of Strategies: Backtesting, Forward Testing and live Testing with paper money.
- Fully automate and schedule your Trades on a virtual Server in the AWS Cloud.
- Truly Data-driven Trading and Investing.
- Python Coding and Object Oriented Programming (OOP) in a way that everybody understands it.
- Coding with Numpy, Pandas, Matplotlib, scikit-learn, Keras and Tensorflow.
- Understand Day Trading A-Z: Spread, Pips, Margin, Leverage, Bid and Ask Price, Order Types, Charts & more.
- Day Trading with Brokers OANDA & FXCM.
- Stream high-frequency real-time Data.
- Understand, analyze, control and limit Trading Costs.
- Use powerful Broker APIs and connect with Python.
Getting Started
What is Algorithmic Trading / Course Overview
How to get the best out of this course
Did you know…? (what Data can tell us about Day Trading)
Student FAQ
*** LEGAL DISCLAIMER (MUST READ!) ***
+++ PART 1: Day Trading, Online Brokers and APIs +++
Our very first Trade
Long Term Investing vs. (Algorithmic) Day Trading
Overview & the Brokers OANDA and FXCM
Day Trading with OANDA A-Z: a Deep Dive
OANDA at a first glance
How to create an Account
FOREX / Currency Exchange Rates explained
Our second Trade – EUR/USD FOREX Trading
How to calculate Profit & Loss of a Trade
Trading Costs and Performance Attribution
Margin and Leverage
Margin Closeout and more
Introduction to Charting
Our third Trade A-Z – Going Short EUR/USD
Netting vs. Hedging
Market, Limit and Stop Orders
Take-Profit and Stop-Loss Orders
A more general Example
Trading Challenge
FOREX Day Trading with FXCM
FXCM at a first glance
How to create an Account
Example Trade: Buying EUR/USD
Trade Analysis
Charting
Closing Positions vs. Hedging Positions
Order Types at a glance
Trading Challenge
Installing Python and Jupyter Notebooks
Introduction
Download and Install Anaconda
How to open Jupyter Notebooks
How to work with Jupyter Notebooks
Tips for Python Beginners
Trading with Python and OANDA/FXCM – an Introduction
Overview
OANDA: Commands to install required packages
OANDA: How to install the OANDA API / Wrapper
OANDA: Getting the API Key & other Preparations
OANDA: Connecting to the API/Server
OANDA: How to load Historical Price Data (Part 1)
OANDA: How to load Historical Price Data (Part 2)
OANDA: Streaming high-frequency real-time Data
OANDA: How to place Orders and execute Trades
Trading Challenge
FXCM: Commands to install required packages
FXCM: How to install the FXCM API Wrapper
FXCM: Getting the Access Token & other Preparations
FXCM: Connecting to the API/Server
FXCM: How to load Historical Price Data (Part 1)
FXCM: How to load Historical Price Data (Part 2)
FXCM: Streaming high-frequency real-time Data
FXCM: How to place Orders and execute Trades
Trading Challenge
Conclusion and Outlook
Conclusion and Outlook
+++ PART 2: Pandas for Financial Data Analysis and Introduction to OOP +++
Introduction and Downloads Part 2
Introduction to Time Series Data in Pandas
Importing Time Series Data from csv-files
Converting strings to datetime objects with pd.to_datetime()
Indexing and Slicing Time Series
Downsampling Time Series with resample()
Coding Exercise 1
Financial Data Analysis with Pandas – an Introduction
Getting Ready (Installing required library)
Importing Stock Price Data from Yahoo Finance
Initial Inspection and Visualization
Normalizing Time Series to a Base Value (100)
The shift() method
The methods diff() and pct_change()
Measuring Stock Performance with MEAN Returns and STD of Returns
Financial Time Series – Return and Risk
Financial Time Series – Covariance and Correlation
Coding Exercise 2
Simple Returns vs. Log Returns
Importing Financial Data from Excel
Simple Moving Averages (SMA) with rolling()
Momentum Trading Strategies with SMAs
Exponentially-weighted Moving Averages (EWMA)
Merging / Aligning Financial Time Series (hands-on)
Advanced Topics
Helpful DatetimeIndex Attributes and Methods
Filling NA Values with bfill, ffill and interpolation
Timezones and Converting (Part 1)
Timezones and Converting (Part 2)
Object Oriented Programming (OOP): Creating a Financial Analysis Class
Introduction to OOP and examples for Classes
The Financial Analysis Class live in action (Part 1)
The Financial Analysis Class live in action (Part 2)
The special method __init__()
The method get_data()
The method log_returns()
String representation and the special method __repr__()
The methods plot_prices() and plot_returns()
Encapsulation and protected Attributes
The method set_ticker()
Adding more methods and performance metrics
Inheritance
Inheritance and the super() Function
Adding meaningful Docstrings
Creating and Importing Python Modules (.py)
Coding Exercise 3: Create your own Class
+++ PART 3: Defining and Testing Trading Strategies +++
Introduction to Part 3
Trading Strategies – an Overview
Downloads for Part 3
Getting the Data
A simple Buy and Hold “Strategy”
Performance Metrics
Defining and Backtesting SMA Strategies
SMA Crossover Strategies – Overview
Defining an SMA Crossover Strategy
Vectorized Strategy Backtesting
Finding the optimal SMA Strategy
Generalization with OOP: An SMA Backtesting Class in action
OOP: the special method __init__()
OOP: the method get_data()
OOP: the method set_parameters()
OOP: the method test_strategy()
OOP: the method plot_results()
OOP: the method update_and_run()
OOP: the method optimize_parameters()
OOP: Docstrings and String Representation
Defining and Backtesting simple Momentum/Contrarian Strategies
Simple Contrarian/Momentum Strategies – Overview
Getting the Data
Excursus: Your FAQs answered
Defining a simple Contrarian Strategy
Vectorized Strategy Backtesting
Changing the Window Parameter
Trades and Trading Costs (Part 1)
Trades and Trading Costs (Part 2)
Generalization with OOP: A Contrarian Backtesting Class in action
OOP Challenge: Create the Contrarian Backtesting Class (incl. Solution)
Defining and Backtesting Mean-Reversion Strategies (Bollinger)
Mean-Reversion Strategies – Overview
Getting the Data
Defining a Bollinger Bands Mean-Reversion Strategy (Part 1)
Defining a Bollinger Bands Mean-Reversion Strategy (Part 2)
Vectorized Strategy Backtesting
Finding the optimal Strategy
Generalization with OOP: A Bollinger Bands Backtesting Class in action
OOP Challenge: Create the Bollinger Bands Backtesting Class (incl. Solution)
Trading Strategies powered by Machine Learning – Regression
Machine Learning – an Overview
Linear Regression with scikit-learn – a simple Introduction
Making Predictions with Linear Regression
Overfitting
Underfitting
Getting the Data
A simple Linear Model to predict Financial Returns (Part 1)
A simple Linear Model to predict Financial Returns (Part 2)
A Multiple Regression Model to predict Financial Returns
In-Sample Backtesting and the Look-ahead-bias
Out-Sample Forward Testing
Trading Strategies powered by Machine Learning – Classification
Logistic Regression with scikit-learn – a simple Introduction (Part 1)
Logistic Regression with scikit-learn – a simple Introduction (Part 2)
Getting and Preparing the Data
Predicting Market Direction with Logistic Regression
In-Sample Backtesting and the Look-ahead-bias
Out-Sample Forward Testing
Generalization with OOP: A Classification Backtesting Class in action
The Classification Backtesting Class explained (Part 1)
The Classification Backtesting Class explained (Part 2)
Advanced Backtesting Techniques
Introduction to Iterative Backtesting (“event-driven”)
A first Intuition on Iterative Backtesting (Part 1)
A first Intuition on Iterative Backtesting (Part 2)
Creating an Iterative Base Class (Part 1)
Creating an Iterative Base Class (Part 2)
Creating an Iterative Base Class (Part 3)
Creating an Iterative Base Class (Part 4)
Creating an Iterative Base Class (Part 5)
Creating an Iterative Base Class (Part 6)
Creating an Iterative Base Class (Part 7)
Creating an Iterative Base Class (Part 8)
Adding the Iterative Backtest Child Class for SMA (Part 1)
Adding the Iterative Backtest Child Class for SMA (Part 2)
Using Modules and adding Docstrings
OOP Challenge: Add Contrarian and Bollinger Strategies
+++ PART 4: Real-time Implementation and Automation of Strategies +++
Introduction and Overview
Downloads for Part 4
Implementation and Automation with OANDA
Recap: Historical Data, real-time Data and Orders
How to collect and store real-time tick data
Storing and resampling real-time tick data (Part 1)
Storing and resampling real-time tick data (Part 2)
How to implement a Contrarian Strategy in Real-Time (Part 1)
How to implement a Contrarian Strategy in Real-Time (Part 2)
How to implement a Contrarian Strategy in Real-Time (Part 3)
Updating the Wrapper Package (Part 1)
Updating the Wrapper Package (Part 2)
How to implement a Contrarian Strategy in Real-Time (Part 4)
How to implement a Contrarian Strategy in Real-Time (Part 5)
How to implement a Contrarian Strategy in Real-Time (Part 6)
Importing a Module vs. Running a Script
Improving Efficiency
Working with historical data and real-time tick data (Part 1)
Working with historical data and real-time tick data (Part 2)
Implementation and Automation with FXCM
Recap: Historical Data, real-time Data and Orders
Collecting, storing and resampling real-time tick data (Part 1)
Collecting, storing and resampling real-time tick data (Part 2)
How to implement a Contrarian Strategy in Real-Time (Part 1)
How to implement a Contrarian Strategy in Real-Time (Part 2)
How to implement a Contrarian Strategy in Real-Time (Part 3)
How to implement a Contrarian Strategy in Real-Time (Part 4)
Running a Python Script
Improving Efficiency
Working with historical data and real-time tick data (Part 1)
Working with historical data and real-time tick data (Part 2)
Working with historical data and real-time tick data (Part 3)
Cloud Deployment (AWS) | Scheduling Trading Sessions | Full Automation
Introduction and Motivation
Demonstration: AWS EC2 for Algorithmic Trading live in action
Amazon Web Services (AWS) – Overview and how to create a Free Trial Account
How to create an EC2 Instance
How to connect to your EC2 Instance
Getting the Instance Ready for Algorithmic Trading
How to run Python Scripts in a Windows Command Prompt
How to start Trading sessions with Batch (.bat) Files
How to schedule Trading sessions with the Task Scheduler
How to stop Trading Sessions (OANDA)
How to stop Trading Sessions (FXCM)
+++ PART 5: Expert Tips & Tricks, Case Studies and more +++
Overview
Downloads for PART 5
Trading Hours, Spreads and Granularity – control and limit Trading Costs!
Introduction and Preparing the Data
The best time to trade (Part 1)
The best time to trade (Part 2)
Spreads during the busy hours
The Impact of Granularity
Conclusions
Working with two or many Strategies (Combination)
Introduction
Strategy 1: SMA
Strategy 2: Mean Reversion
Combining both Strategies – Alternative 1
Taking into account busy Trading Hours
Strategy Backtesting
Combining both Strategies – Alternative 2
Strategy Optimization
A Machine Learning-powered Strategy A-Z (DNN)
Project Overview
Installation of Tensorflow & Keras
Getting and Preparing the Data
Adding Labels/Features
Adding lags
Splitting into Train and Test Set
Feature Scaling/Engineering
Creating and Fitting the DNN Model
Prediction & Out-Sample Forward Testing
Saving Model and Parameters
Troubleshooting Saving and Loading the DNN Model
Loading and applying model and parameters
OANDA Implementation (Part 1)
OANDA Implementation (Part 2)
+++ APPENDIX: Python Crash Course +++
Overview
Appendix 1: Python (& Finance) Basics
Section Downloads
Intro to the Time Value of Money (TVM) Concept (Theory)
Calculate Future Values (FV) with Python / Compounding
Calculate Present Values (FV) with Python / Discounting
Interest Rates and Returns (Theory)
Calculate Interest Rates and Returns with Python
Introduction to Variables
Excursus: How to add inline comments
Variables and Memory (Theory)
More on Variables and Memory
Variables – Dos, Don´ts and Conventions
The print() Function
Coding Exercise 1
TVM Problems with many Cashflows
Intro to Python Lists
Zero-based Indexing and negative Indexing in Python (Theory)
Indexing Lists
For Loops – Iterating over Lists
The range Object – another Iterable
Calculate FV and PV for many Cashflows
The Net Present Value – NPV (Theory)
Calculate an Investment Project´s NPV
Coding Exercise 2
Data Types in Action
The Data Type Hierarchy (Theory)
Excursus: Dynamic Typing in Python
Build-in Functions
Integers
Floats
How to round Floats (and Integers) with round()
More on Lists
Lists and Element-wise Operations
Slicing Lists
Slicing Cheat Sheet
Changing Elements in Lists
Sorting and Reversing Lists
Adding and removing Elements from/to Lists
Mutable vs. immutable Objects (Part 1)
Mutable vs. immutable Objects (Part 2)
Coding Exercise 3
Tuples
Dictionaries
Intro to Strings
String Replacement
Booleans
Operators (Theory)
Comparison, Logical and Membership Operators in Action
Coding Exercise 4
Conditional Statements
Keywords pass, continue and break
Calculate a Project´s Payback Period
Introduction to while loops
Coding Exercise 5
Appendix 2: User-defined Functions (required for OOP)
Section Downloads
Defining your first user-defined Function
What´s the difference between Positional Arguments vs. Keyword Arguments?
How to work with Default Arguments
The Default Argument None
How to unpack Iterables
Sequences as arguments and *args
How to return many results
Scope – easily explained
Coding Exercise 6
Appendix 3: Numpy, Pandas, Matplotlib and Seaborn Crash Course
Downloads for this Section
Modules, Packages and Libraries – No need to reinvent the Wheel
Numpy Arrays
Indexing and Slicing Numpy Arrays
Vectorized Operations with Numpy Arrays
Changing Elements in Numpy Arrays & Mutability
View vs. copy – potential Pitfalls when slicing Numpy Arrays
Numpy Array Methods and Attributes
Numpy Universal Functions
Boolean Arrays and Conditional Filtering
Advanced Filtering & Bitwise Operators
Determining a Project´s Payback Period with np.where()
Creating Numpy Arrays from Scratch
Coding Exercise 7
How to work with nested Lists
2-dimensional Numpy Arrays
How to slice 2-dim Numpy Arrays (Part 1)
How to slice 2-dim Numpy Arrays (Part 2)
Recap: Changing Elements in a Numpy Array / slice
How to perform row-wise and column-wise Operations
Coding Exercise 8
Intro to Tabular Data / Pandas
Create your very first Pandas DataFrame (from csv)
Pandas Display Options and the methods head() & tail()
First Data Inspection
Coding Exercise 9
Selecting Columns
Selecting one Column with the “dot notation”
Zero-based Indexing and Negative Indexing
Selecting Rows with iloc (position-based indexing)
Slicing Rows and Columns with iloc (position-based indexing)
Position-based Indexing Cheat Sheets
Selecting Rows with loc (label-based indexing)
Slicing Rows and Columns with loc (label-based indexing)
Label-based Indexing Cheat Sheets
Summary, Best Practices and Outlook
Coding Exercise 10
First Steps with Pandas Series
Analyzing Numerical Series with unique(), nunique() and value_counts()
Analyzing non-numerical Series with unique(), nunique(), value_counts()
The copy() method
Sorting of Series and Introduction to the inplace – parameter
First Steps with Pandas Index Objects
Changing Row Index with set_index() and reset_index()
Changing Column Labels
Renaming Index & Column Labels with rename()
Filtering DataFrames (one Condition)
Filtering DataFrames by many Conditions (AND)
Filtering DataFrames by many Conditions (OR)
Advanced Filtering with between(), isin() and ~
Intro to NA Values / missing Values
Handling NA Values / missing Values
Exporting DataFrames to csv
Summary Statistics and Accumulations
Visualization with Matplotlib (Intro)
Customization of Plots
Histogramms (Part 1)
Histogramms (Part 2)
Scatterplots
First Steps with Seaborn
Categorical Seaborn Plots
Seaborn Regression Plots
Seaborn Heatmaps
Removing Columns
Introduction to GroupBy Operations
Understanding the GroupBy Object
Splitting with many Keys
split-apply-combine
What´s next?
Get your special BONUS here!