Моделирование примера стратегии Zipline и рычаг, кажется, всплеск выше 1 - PullRequest
0 голосов
/ 08 ноября 2018

Я моделирую пример торговой стратегии в документации с моими собственными данными. Здесь я использую цены ETH. Я не уверен, что могу выложить файл здесь.

Проблема, которую я вижу, заключается в том, что я ожидаю, что кредитное плечо будет либо 0, либо 1 (или чуть ниже, если осталось какое-либо изменение). Если Скользящее среднее пересекается, я покупаю 100% своего портфеля или продаю 100%, в зависимости от направления пересечения. Это пример стратегии, используемой в документации Zipline.

У меня проблема в том, что когда я использую

    record(leverage = context.account.leverage)

и затем изобразите это, я обнаружил, что рычаг ненадолго перепрыгнул выше 1. Я не уверен, почему это происходит.

Вот код:

%load_ext zipline
from zipline.api import order_target, order_target_percent, get_open_orders, get_datetime, record, symbol
import zipline
import matplotlib.pyplot as plt
from datetime import datetime
from collections import OrderedDict
import pandas as pd
import pytz
import matplotlib.pyplot as plt
from matplotlib import style

data = OrderedDict()
tickers = ['ETH']

#Takes in ETH data, cleans, resamples, and creates panel
for ticker in tickers:
    data[ticker] = pd.read_csv("{}USD_Bitfinex.csv".format(ticker), index_col=0, parse_dates=['Date'])
    data[ticker]['open'] = data[ticker]['Last'].shift(-1)
    data[ticker] = data[ticker][['open', 'High', 'Low', 'Last', 'Volume']]
    data[ticker].columns = ('open', 'high', 'low', 'close', 'volume')
    data[ticker].sort_index(inplace=True)
    data[ticker].drop(data[ticker].index[0], inplace=True)
    data[ticker] = data[ticker].resample('1h').pad()
    print(type(data[ticker].index))
    print(data[ticker])

panel = pd.Panel(data)
panel.minor_axis = ['open', 'high', 'low', 'close', 'volume']
panel.major_axis = panel.major_axis.tz_localize(pytz.utc)

def initialize(context):
    context.i = 0

    context.asset = symbol('ETH')

def print_open_orders(context, data):
    if get_open_orders():  
        for security, orders in get_open_orders().iteritems():  
            for oo in orders:  
                print("%.5s : OPEN ORDER %s [amt=%d,filled=%d,left=%d]" % (str(get_datetime().time()), str(oo.created), oo.amount, oo.filled, oo.amount - oo.filled))
    else:
        print("%.5s : NO OPEN ORDERS" % (str(get_datetime().time())))

def handle_data(context, data):
    # Skip first 300 days to get full windows
    context.i += 1
    if context.i < 28:
        return

    # Compute averages
    # data.history() has to be called with the same params
    # from above and returns a pandas dataframe.
    short_mavg = data.history(context.asset, 'price', bar_count=7, frequency="1d").mean()
    long_mavg = data.history(context.asset, 'price', bar_count=28, frequency="1d").mean()

    print_open_orders(context, data)

    # Trading logic
    if short_mavg > long_mavg:
        # order_target orders as many shares as needed to
        # achieve the desired number of shares.
        order_target_percent(context.asset, 1)
        print('Buying')
    elif short_mavg < long_mavg:
        order_target_percent(context.asset, 0)
        print('Selling')


    # Save values for later inspection
    record(AAPL=data.current(context.asset, 'price'),
           short_mavg=short_mavg,
           long_mavg=long_mavg)

    record(leverage = context.account.leverage)
    record(cash = context.portfolio.cash)

perf = zipline.run_algorithm(start=datetime(2017, 1, 5, 0, 0, 0, 0, pytz.utc),
                      end=datetime(2018, 3, 1, 0, 0, 0, 0, pytz.utc),
                      initialize=initialize,
                      capital_base=100000,
                      handle_data=handle_data,
                             data=panel)

Теперь, когда я строю кредитное плечо

perf.leverage.plot()
plt.title('Portfolio Leverage')

plt.show()

Я получаю такой график:

enter image description here

Я не могу понять спайки выше 1. Есть идеи?

...