Моделирование примера стратегии Zipline и рычаг, кажется, всплеск выше 1
Я моделирую пример торговой стратегии в документации с моими собственными данными. Здесь я использую цены 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()
Я получаю диаграмму, как это:
Я не могу понять шипы выше 1. Есть идеи?