Demo Algo

Copyright (c) 2016 Bernoullio


This demo algo illustrates the basic structure of an algorithm.

This includes:

  • Basic imports
  • Algo definitions (initialize, handle_data, analyze)
  • Further performance analyzes

Bernoullio Lab is built on Jupyter. It also extends the open-source trading engine Zipline.

Visit the respective documentations for further reference.


In [4]:
import warnings
warnings.filterwarnings("ignore")

import toolbox
import zipline
%load_ext zipline


The zipline extension is already loaded. To reload it, use:
  %reload_ext zipline

In [6]:
%%zipline --start 2016-6-1 --end 2016-7-28 --bundle bid_ask_stream --data-frequency minute -o performance.pickle

import talib
from zipline.api import record, history, symbol
import logging
from toolbox.broker import SimuBroker

logging.basicConfig(level=logging.DEBUG)

perf_data = None

# initialize algorithm
def initialize(context):
    context.broker = SimuBroker(context)
    context.blotter = context.broker.blotter
    context.sym = symbol("EURUSD")
    context.i = 0
    
def handle_data(context, data):
    # Skip first 4500 minutes to get full windows
    context.i += 1
    if context.i < 4500:
        return

    # Compute averages
    # history() has to be called with the same params
    # from above and returns a pandas dataframe.
    short_mavg = data.history(context.sym, 'price', 1500, '1m').mean()
    long_mavg = data.history(context.sym, 'price', 4500, '1m').mean()

    # Trading logic
    if short_mavg > long_mavg:
        context.broker.create_order(context.sym, 5000)
    elif short_mavg < long_mavg:
        context.broker.create_order(context.sym, -5000)

    # Save values for later inspection
    record(EURUSD=data.current(context.sym, "price"),
           short_mavg=short_mavg,
           long_mavg=long_mavg)

import matplotlib.pyplot as plt

def analyze(context, perf):
    # Do additional things to the last context and perf DataFrame
    pass


Out[6]:
EURUSD algo_volatility algorithm_period_return alpha benchmark_period_return benchmark_volatility beta capital_used ending_cash ending_exposure ... short_mavg short_value shorts_count sortino starting_cash starting_exposure starting_value trading_days transactions treasury_period_return
2016-06-01 20:00:00 NaN NaN 0.000000 NaN 0.001135 NaN NaN 0.000000e+00 1.000000e+07 0.000000e+00 ... NaN 0.000000e+00 0 NaN 1.000000e+07 0.000000e+00 0.000000e+00 1 [] 0.0185
2016-06-02 20:00:00 NaN 0.000000 0.000000 0.000000 0.003963 0.018966 0.000000 0.000000e+00 1.000000e+07 0.000000e+00 ... NaN 0.000000e+00 0 NaN 1.000000e+07 0.000000e+00 0.000000e+00 2 [] 0.0181
2016-06-03 20:00:00 NaN 0.000000 0.000000 0.000000 0.001040 0.046796 0.000000 0.000000e+00 1.000000e+07 0.000000e+00 ... NaN 0.000000e+00 0 NaN 1.000000e+07 0.000000e+00 0.000000e+00 3 [] 0.0171
2016-06-06 20:00:00 NaN 0.000000 0.000000 0.000000 0.005942 0.052564 0.000000 0.000000e+00 1.000000e+07 0.000000e+00 ... NaN 0.000000e+00 0 NaN 1.000000e+07 0.000000e+00 0.000000e+00 4 [] 0.0173
2016-06-07 20:00:00 NaN 0.000000 0.000000 0.000000 0.007239 0.045543 0.000000 0.000000e+00 1.000000e+07 0.000000e+00 ... NaN 0.000000e+00 0 NaN 1.000000e+07 0.000000e+00 0.000000e+00 5 [] 0.0172
2016-06-08 20:00:00 NaN 0.000000 0.000000 0.000000 0.010573 0.042486 0.000000 0.000000e+00 1.000000e+07 0.000000e+00 ... NaN 0.000000e+00 0 NaN 1.000000e+07 0.000000e+00 0.000000e+00 6 [] 0.0171
2016-06-09 20:00:00 NaN 0.000000 0.000000 0.000000 0.008837 0.044034 0.000000 0.000000e+00 1.000000e+07 0.000000e+00 ... NaN 0.000000e+00 0 NaN 1.000000e+07 0.000000e+00 0.000000e+00 7 [] 0.0168
2016-06-10 20:00:00 NaN 0.000000 0.000000 0.000000 -0.000420 0.071363 0.000000 0.000000e+00 1.000000e+07 0.000000e+00 ... NaN 0.000000e+00 0 NaN 1.000000e+07 0.000000e+00 0.000000e+00 8 [] 0.0164
2016-06-13 20:00:00 NaN 0.000000 0.000000 0.000000 -0.008531 0.079249 0.000000 0.000000e+00 1.000000e+07 0.000000e+00 ... NaN 0.000000e+00 0 NaN 1.000000e+07 0.000000e+00 0.000000e+00 9 [] 0.0162
2016-06-14 20:00:00 NaN 0.000000 0.000000 0.000000 -0.010315 0.074841 0.000000 0.000000e+00 1.000000e+07 0.000000e+00 ... NaN 0.000000e+00 0 NaN 1.000000e+07 0.000000e+00 0.000000e+00 10 [] 0.0162
2016-06-15 20:00:00 NaN 0.000000 0.000000 0.000000 -0.012137 0.071107 0.000000 0.000000e+00 1.000000e+07 0.000000e+00 ... NaN 0.000000e+00 0 NaN 1.000000e+07 0.000000e+00 0.000000e+00 11 [] 0.0160
2016-06-16 20:00:00 112362.0 0.034863 -0.007608 -0.185380 -0.009042 0.070519 -0.136001 1.972316e+08 2.072316e+08 -1.973077e+08 ... 112321.313333 -1.973077e+08 1 -4.582576 1.000000e+07 0.000000e+00 0.000000e+00 12 [{'sid': Equity(0 [EURUSD]), 'order_id': '8dd8... 0.0157
2016-06-17 20:00:00 112798.0 0.470222 -0.113958 -1.993680 -0.012270 0.068415 0.975132 3.798314e+08 5.870630e+08 -5.782025e+08 ... 112308.537333 -5.782025e+08 1 -4.703512 2.072316e+08 -1.973077e+08 -1.973077e+08 13 [{'sid': Equity(0 [EURUSD]), 'order_id': '8dd8... 0.0162
2016-06-20 20:00:00 113053.0 0.540004 -0.183558 -3.575547 -0.006533 0.071697 -0.828095 4.163070e+08 1.003370e+09 -9.952056e+08 ... 112591.849333 -9.952056e+08 1 -6.162852 5.870630e+08 -5.782025e+08 -5.782025e+08 14 [{'sid': Equity(0 [EURUSD]), 'order_id': '3523... 0.0167
2016-06-21 20:00:00 112483.0 2.870632 0.367500 8.503968 -0.003839 0.070300 6.623734 4.594235e+08 1.462793e+09 -1.449118e+09 ... 112659.238000 -1.449118e+09 1 14.832775 1.003370e+09 -9.952056e+08 -9.952056e+08 15 [{'sid': Equity(0 [EURUSD]), 'order_id': '972f... 0.0171
2016-06-22 20:00:00 112981.0 3.398514 -0.265469 1.049916 -0.005484 0.068145 8.937027 4.349499e+08 1.897743e+09 -1.890398e+09 ... 112887.807333 -1.890398e+09 1 0.154590 1.462793e+09 -1.449118e+09 -1.449118e+09 16 [{'sid': Equity(0 [EURUSD]), 'order_id': '972f... 0.0169
2016-06-23 20:00:00 113735.0 7.568544 NaN -20.615377 0.007807 0.084471 -44.928264 4.172563e+08 2.315000e+09 -2.320649e+09 ... 113093.630000 -2.320649e+09 1 -3.675534 1.897743e+09 -1.890398e+09 -1.890398e+09 17 [{'sid': Equity(0 [EURUSD]), 'order_id': '31fa... 0.0174
2016-06-24 20:00:00 111082.0 36.549936 NaN -89.142576 -0.028394 0.158920 181.089443 6.012405e+08 2.916240e+09 -2.867249e+09 ... 112619.695333 -2.867249e+09 1 -4.341455 2.315000e+09 -2.320649e+09 -2.320649e+09 18 [{'sid': Equity(0 [EURUSD]), 'order_id': 'ea70... 0.0157
2016-06-27 20:00:00 110172.0 35.747441 0.080157 -54.730704 -0.045976 0.165781 148.341097 5.828141e+08 3.499054e+09 -3.427010e+09 ... 111948.232667 -3.427010e+09 1 -4.051591 2.916240e+09 -2.867249e+09 -2.867249e+09 19 [{'sid': Equity(0 [EURUSD]), 'order_id': 'eece... 0.0146
2016-06-28 20:00:00 110798.0 34.809267 -0.228827 -96.668094 -0.029023 0.176562 126.265741 4.819432e+08 3.980997e+09 -3.929562e+09 ... 111278.877333 -3.929562e+09 1 -4.050436 3.499054e+09 -3.427010e+09 -3.427010e+09 20 [{'sid': Equity(0 [EURUSD]), 'order_id': '7eb1... 0.0146
2016-06-29 20:00:00 111057.0 33.953950 -0.365983 -121.725136 -0.012485 0.183570 113.491107 4.770275e+08 4.458025e+09 -4.415737e+09 ... 110736.346000 -4.415737e+09 1 -4.014724 3.980997e+09 -3.929562e+09 -3.929562e+09 21 [{'sid': Equity(0 [EURUSD]), 'order_id': 'd048... 0.0150
2016-06-30 20:00:00 110975.0 33.197512 -0.331203 -133.071228 0.000911 0.185392 108.784771 6.099767e+08 5.068002e+09 -5.023394e+09 ... 110651.441333 -5.023394e+09 1 -3.903571 4.458025e+09 -4.415737e+09 -4.415737e+09 22 [{'sid': Equity(0 [EURUSD]), 'order_id': 'fb40... 0.0149
2016-07-01 20:00:00 111322.0 32.439154 -0.562597 -133.397995 0.002861 0.181232 108.766401 4.800717e+08 5.548073e+09 -5.518899e+09 ... 110959.904667 -5.518899e+09 1 -3.931608 5.068002e+09 -5.023394e+09 -5.023394e+09 23 [{'sid': Equity(0 [EURUSD]), 'order_id': '5c01... 0.0146
2016-07-05 20:00:00 110701.0 32.150917 -0.082080 -108.631188 -0.004006 0.178708 103.278760 4.663175e+08 6.014391e+09 -5.953168e+09 ... 111047.892000 -5.953168e+09 1 -3.487661 5.548073e+09 -5.518899e+09 -5.518899e+09 24 [{'sid': Equity(0 [EURUSD]), 'order_id': '1971... 0.0137
2016-07-06 20:00:00 111010.0 31.477745 -0.347061 -112.747792 0.001326 0.175802 102.547993 5.146959e+08 6.529087e+09 -6.485537e+09 ... 110992.332667 -6.485537e+09 1 -3.508680 6.014391e+09 -5.953168e+09 -5.953168e+09 25 [{'sid': Equity(0 [EURUSD]), 'order_id': '3f1d... 0.0138
2016-07-07 20:00:00 110629.0 30.983593 -0.010625 -102.544594 0.000453 0.172277 102.209931 4.603970e+08 6.989484e+09 -6.923495e+09 ... 110934.020667 -6.923495e+09 1 -3.277859 6.529087e+09 -6.485537e+09 -6.485537e+09 26 [{'sid': Equity(0 [EURUSD]), 'order_id': '74c2... 0.0140
2016-07-08 20:00:00 110529.0 30.418662 0.078402 -111.671130 0.015713 0.175180 97.306680 4.515221e+08 7.441006e+09 -7.369079e+09 ... 110696.990667 -7.369079e+09 1 -3.188707 6.989484e+09 -6.923495e+09 -6.923495e+09 27 [{'sid': Equity(0 [EURUSD]), 'order_id': '4756... 0.0137
2016-07-11 20:00:00 110569.0 29.867712 0.036627 -111.028000 0.019175 0.172107 97.367926 3.676331e+08 7.808639e+09 -7.739498e+09 ... 110623.128667 -7.739498e+09 1 -3.143009 7.441006e+09 -7.369079e+09 -7.369079e+09 28 [{'sid': Equity(0 [EURUSD]), 'order_id': '4756... 0.0143
2016-07-12 20:00:00 110622.0 29.345101 -0.009502 -113.387061 0.026319 0.170014 96.827784 4.690067e+08 8.277646e+09 -8.211582e+09 ... 110593.070667 -8.211582e+09 1 -3.101615 7.808639e+09 -7.739498e+09 -7.739498e+09 29 [{'sid': Equity(0 [EURUSD]), 'order_id': '22a9... 0.0153
2016-07-13 20:00:00 110936.0 28.834728 -0.353602 -112.630145 0.026457 0.167074 96.805773 4.213600e+08 8.699006e+09 -8.655892e+09 ... 110709.652000 -8.655892e+09 1 -3.149639 8.277646e+09 -8.211582e+09 -8.211582e+09 30 [{'sid': Equity(0 [EURUSD]), 'order_id': '9be1... 0.0148
2016-07-14 20:00:00 111153.0 28.350266 -0.608130 -116.177663 0.031856 0.164730 96.213764 3.546445e+08 9.053650e+09 -9.027513e+09 ... 110886.407333 -9.027513e+09 1 -3.209650 8.699006e+09 -8.655892e+09 -8.655892e+09 31 [{'sid': Equity(0 [EURUSD]), 'order_id': '9be1... 0.0153
2016-07-15 20:00:00 110691.0 28.339126 -0.046325 -100.254014 0.030897 0.162148 95.029048 4.241168e+08 9.477767e+09 -9.414159e+09 ... 110909.794000 -9.414159e+09 1 -2.751677 9.053650e+09 -9.027513e+09 -9.027513e+09 32 [{'sid': Equity(0 [EURUSD]), 'order_id': '4881... 0.0160
2016-07-18 20:00:00 110725.0 27.901660 -0.092421 -99.327292 0.033353 0.159640 95.079954 6.862014e+08 1.016397e+10 -1.010343e+10 ... 110897.930000 -1.010343e+10 1 -2.723158 9.477767e+09 -9.414159e+09 -9.414159e+09 33 [{'sid': Equity(0 [EURUSD]), 'order_id': '4740... 0.0159
2016-07-19 20:00:00 110169.0 27.647526 0.666056 -88.952191 0.031870 0.157347 94.065829 6.948008e+08 1.085877e+10 -1.074765e+10 ... 110656.690000 -1.074765e+10 1 -2.452408 1.016397e+10 -1.010343e+10 -1.010343e+10 34 [{'sid': Equity(0 [EURUSD]), 'order_id': '35bf... 0.0156
2016-07-20 20:00:00 110149.0 27.247897 0.688196 -89.197811 0.036277 0.155269 94.030936 6.620718e+08 1.152084e+10 -1.140824e+10 ... 110384.810667 -1.140824e+10 1 -2.413508 1.085877e+10 -1.074765e+10 -1.074765e+10 35 [{'sid': Equity(0 [EURUSD]), 'order_id': 'efaa... 0.0159
2016-07-21 20:00:00 110198.0 26.861105 0.599730 -84.499077 0.032533 0.153534 93.140146 7.588795e+08 1.227972e+10 -1.217302e+10 ... 110245.129333 -1.217302e+10 1 -2.393758 1.152084e+10 -1.140824e+10 -1.140824e+10 36 [{'sid': Equity(0 [EURUSD]), 'order_id': '4fe7... 0.0157
2016-07-22 20:00:00 109739.0 26.553364 1.366474 -81.948689 0.037235 0.151681 93.558385 6.821353e+08 1.296186e+10 -1.280402e+10 ... 110013.908667 -1.280402e+10 1 -2.234519 1.227972e+10 -1.217302e+10 -1.217302e+10 37 [{'sid': Equity(0 [EURUSD]), 'order_id': 'e9f8... 0.0157
2016-07-25 20:00:00 109921.0 26.193157 1.044217 -78.695643 0.034111 0.149979 92.997004 2.921313e+08 1.325399e+10 -1.311764e+10 ... 109941.818667 -1.311764e+10 1 -2.240221 1.296186e+10 -1.280402e+10 -1.280402e+10 38 [{'sid': Equity(0 [EURUSD]), 'order_id': '4d7b... 0.0158
2016-07-26 20:00:00 109873.0 25.855209 1.130538 -76.585634 0.034445 0.148001 92.939177 3.314062e+08 1.358539e+10 -1.344329e+10 ... 109892.096667 -1.344329e+10 1 -2.200445 1.325399e+10 -1.311764e+10 -1.311764e+10 39 [{'sid': Equity(0 [EURUSD]), 'order_id': '9de5... 0.0157
2016-07-27 20:00:00 110527.0 25.537368 -0.098607 -77.625560 0.033205 0.146187 93.039702 4.552879e+08 1.404068e+10 -1.398056e+10 ... 109873.098000 -1.398056e+10 1 -2.315443 1.358539e+10 -1.344329e+10 -1.344329e+10 40 [{'sid': Equity(0 [EURUSD]), 'order_id': '9de5... 0.0152
2016-07-28 20:00:00 110763.0 25.224585 -0.541686 -79.655775 0.034865 0.144360 92.966294 3.524149e+08 1.439310e+10 -1.436253e+10 ... 110165.254000 -1.436253e+10 1 -2.407248 1.404068e+10 -1.398056e+10 -1.398056e+10 41 [{'sid': Equity(0 [EURUSD]), 'order_id': 'e562... 0.0152

41 rows × 41 columns


In [7]:
import pandas as pd
data = pd.read_pickle('performance.pickle') # read in perf DataFrame

# start mode to work cleanly with matplotlib figures
%pylab inline 

figsize(12, 12)

# Import our choice graphing library.
# Visit http://matplotlib.org/users/beginner.html for instructions on drawing beautiful graphs
import matplotlib.pyplot as plt

# plot portfolio value
ax1 = plt.subplot(211)
data.portfolio_value.plot(ax=ax1)
ax1.set_ylabel('Portfolio value')

# plot the long and short mavg
ax2 = plt.subplot(212, sharex=ax1)
data.long_mavg.plot(ax=ax2)
ax2.set_ylabel("long_mavg")

ax3 = plt.subplot(212, sharex=ax1)
data.short_mavg.plot(ax=ax3)
ax2.set_ylabel("short_mavg")


Populating the interactive namespace from numpy and matplotlib
Out[7]:
<matplotlib.text.Text at 0x7f6104330470>

In [ ]: