def bind_simulator(**sim_kwargs) -> Callable: """ Create a simulator that uses white noise for the preference matrix """ symbols: List[str] = data_io.get_all_symbols() prices: pd.DataFrame = data_io.load_eod_matrix(symbols) _bollinger: Callable = signals.create_bollinger_band_signal bollinger_n = 20 returns = metrics.calculate_return_series(prices) sharpe_n = 20 def bootstrap_rolling_sharpe_ratio(return_series: pd.Series) -> pd.Series: _series = return_series.iloc[1:] _series = _series.sample(n=return_series.shape[0], replace=True) _series.iloc[:1] = [np.nan] _series = pd.Series(_series.values, index=return_series.index) _windowed_series = _series.rolling(sharpe_n) return _windowed_series.mean() / _windowed_series.std() _sharpe: Callable = bootstrap_rolling_sharpe_ratio def _simulate(bootstrap_test_id: int) -> Performance: signal = prices.apply(_bollinger, args=(bollinger_n,), axis=0) preference = returns.apply(_sharpe, axis=0) simulator = simulation.SimpleSimulator(**sim_kwargs) simulator.simulate(prices, signal, preference) return simulator.portfolio_history.get_performance_metric_data() return _simulate
def bind_simulator(**sim_kwargs) -> Callable: """ Create a simulator that uses white noise for the preference matrix """ symbols: List[str] = data_io.get_all_symbols() prices: pd.DataFrame = data_io.load_eod_matrix(symbols) _bollinger: Callable = signals.create_bollinger_band_signal # Bollinger n is constant throughout bollinger_n = 20 def _simulate(white_noise_test_id: int) -> Performance: signal = prices.apply(_bollinger, args=(bollinger_n, ), axis=0) # Build a pile of noise in the same shape as the price data _noise = np.random.normal(loc=0, scale=1, size=prices.shape) _cols = prices.columns _index = prices.index preference = pd.DataFrame(_noise, columns=_cols, index=_index) simulator = simulation.SimpleSimulator(**sim_kwargs) simulator.simulate(prices, signal, preference) return simulator.portfolio_history.get_performance_metric_data() return _simulate
def simulate_portfolio(): bollinger_n = 20 sharpe_n = 100 # Load in data symbols: List[str] = data_io.get_all_symbols() prices: pd.DataFrame = data_io.load_eod_matrix(symbols) # Use the Bollinger Band outer band crossover as a signal _bollinger = signals.create_bollinger_band_signal signal = prices.apply(_bollinger, args=(bollinger_n, ), axis=0) # Use a rolling sharpe ratio approximation as a preference matrix _sharpe = metrics.calculate_rolling_sharpe_ratio preference = prices.apply(_sharpe, args=(sharpe_n, ), axis=0) # Run the simulator simulator = simulation.SimpleSimulator( initial_cash=10000, max_active_positions=5, percent_slippage=0.0005, trade_fee=1, ) simulator.simulate(prices, signal, preference) # Print results simulator.portfolio_history.print_position_summaries() simulator.print_initial_parameters() simulator.portfolio_history.print_summary() simulator.portfolio_history.plot() simulator.portfolio_history.plot_benchmark_comparison()
def load_data() -> Tuple[List[str], pd.DataFrame, pd.DataFrame]: """ Load the data as is will be used in the alternative data model """ symbols: List[str] = data_io.get_all_symbols() alt_data = data_io.load_alternative_data_matrix(symbols) eod_data = data_io.load_eod_matrix(symbols) eod_data = eod_data[eod_data.index >= alt_data.index.min()] return symbols, eod_data, alt_data
def bind_simulator(**sim_kwargs) -> Callable: """ Create a function with all static simulation data bound to it, where the arguments are simulation parameters """ symbols: List[str] = data_io.get_all_symbols() prices: pd.DataFrame = data_io.load_eod_matrix(symbols) _bollinger: Callable = signals.create_bollinger_band_signal _sharpe: Callable = metrics.calculate_rolling_sharpe_ratio def _simulate(bollinger_n: int, sharpe_n: int) -> Performance: signal = prices.apply(_bollinger, args=(bollinger_n, ), axis=0) preference = prices.apply(_sharpe, args=(sharpe_n, ), axis=0) simulator = simulation.SimpleSimulator(**sim_kwargs) simulator.simulate(prices, signal, preference) return simulator.portfolio_history.get_performance_metric_data() return _simulate
from pypm import data_io import numpy as np import pandas as pd from typing import List # Load in everything symbols: List[str] = data_io.get_all_symbols() eod_data: pd.DataFrame = data_io.load_eod_matrix(symbols) alt_data: pd.DataFrame = data_io.load_alternative_data_matrix(symbols) # Our eod_data goes back 10 years, but our alt_data goes back 5 years eod_data = eod_data[eod_data.index >= alt_data.index.min()] assert np.all(eod_data.index == alt_data.index) assert np.all(eod_data.columns == alt_data.columns)