from simple_back_test import *
import warnings
warnings.filterwarnings('ignore')
import pandas as pd
pd.core.common.is_list_like = pd.api.types.is_list_like
import numpy as np
from plotnine import *
import logging
logging.basicConfig(format='%(message)s', level=logging.DEBUG)
model_data = get_model_data()
stream_prices = (generate_prices_for(model_data,
artist_advance_fraction=0.8,
payment_per_stream=5e-3,
pop_5_slippage=0.15, # Penalises both predicted and actual streams
execution_slippage=0.1, # Penalises only actual streams (How does it take to sign up the artist)
clip_individual_returns=3)) # Clip extreme positive returns so they don't skew the results too much
min_price = 5e3
max_price = 10e3
stream_prices = stream_prices >> mask(X.open_price >= min_price, X.open_price <= max_price)
We create a series of tracks drawn from the existing ones but distributed over the desired period with a specific number per day (on average). Note that this is with replacement so each track will be used several times
duration_days = 365 # How long is the simulated backtest period?
new_streams_per_date = 3 # How many artists can we sign per day
randomly_generated_events = generate_random_draws(stream_prices,
new_streams_per_date=new_streams_per_date,
duration_days=duration_days)
ggplot(randomly_generated_events, aes('open_date')) + geom_bar()
capital = 500e3
ps= execute_backtest(randomly_generated_events, capital) >> arrange('Date')
ps['Portfolio_return'] = ps['Portfolio_worth'].pct_change()
ps['Cumulative_portfolio_return'] = ps['Portfolio_worth']/ps['Portfolio_worth'][0] - 1
display(ps.tail())
portfolio_summary_stats = calculate_portfolio_summary_stats(ps)
display(portfolio_summary_stats)
chart_portfolio_stats(ps)