zipline-trader icon indicating copy to clipboard operation
zipline-trader copied to clipboard

set_maximum_leverage

Open plamen1989 opened this issue 3 years ago • 0 comments

Dear community,

this is my very first posting on Github, so apologies upfront if I am not following the format you require.

I run a simple backtest (full code below) and would like to set the model's maximum leverage to 1. I read in the official documentation that there is a function set_max_leverage (max_leverage) but I am unsure how and where to integrate it into my code.

May I please ask you for advice?

Thank you very much in advance!

from zipline import run_algorithm
from zipline.api import order_target_percent, symbol, schedule_function,\
    date_rules, time_rules
from datetime import datetime
import pandas as pd
import pytz
import pyfolio as pf

def initialize(context):
    # Which stocks to trade
    dji = [
        "AAPL",
        "AXP",
        "BA",
        "CAT",
        "CSCO",
        "CVX",
        "DIS",
        "DWDP",
        "GS",
        "HD",
        "IBM",
        "INTC",
        "JNJ",
        "JPM",
        "KO",
        "MCD",
        "MMM",
        "MRK",
        "MSFT",
        "NKE",
        "PFE",
        "PG",
        "TRV",
        "UNH",
        "UTX",
        "V",
        "VZ",
        "WBA",
        "WMT",
        "XOM"
    ]
    
    # Make symbol list from tickers
    context.universe = [symbol(s) for s in dji]
    
    # History window
    context.history_window = 20
    
    # Size of our portfolio
    context.stocks_to_hold = 10
    
    # Schedule the daily trading routine for once per month
    schedule_function(handle_data, date_rules.month_start(),\
                      time_rules.market_close())

def month_perf(ts):
    perf = (ts[-1] / ts[0]) - 1
    return perf

def handle_data (context, data):
    # Get history for all the stocks
    hist = data.history (context.universe, "close", context.history_window, "1d")
    
    # This creates a table of percent returns, in order
    perf_table = hist.apply(month_perf).sort_values(ascending = False)
    
    # Make buy list of the top N stocks
    buy_list = perf_table[ : context.stocks_to_hold]
    
    # The rest will not be held
    the_rest = perf_table[context.stocks_to_hold : ]
    
    # Place target buy orders for top N stocks
    for stock, perf in buy_list.iteritems():
        stock_weight = 1 / context.stocks_to_hold
        
        # Place order
        if data.can_trade(stock):
            order_target_percent(stock, stock_weight)
            
    # Make sure we are flat the rest
    for stock, perf in the_rest.iteritems():
        
        # Place order
        if data.can_trade(stock):
            order_target_percent(stock, 0.0)
            
def analyze (context, perf):
    # Use PyFolio to generate a performance report
    returns, positions, transactions = pf.utils.extract_rets_pos_txn_from_zipline(perf)
    pf.create_returns_tear_sheet(returns, benchmark_rets = None)
    
# Set start and end date
start = pd.to_datetime("2003-1-1", utc = True)
end = pd.to_datetime("2017-12-31", utc = True)

# Fire off the backtest
result = run_algorithm(start = start, end = end, initialize = initialize, 
                       analyze = analyze, capital_base = 10000,
                       data_frequency = "daily", bundle = "quandl")  

plamen1989 avatar May 26 '21 20:05 plamen1989