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
예제 #2
0
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
예제 #5
0
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
예제 #6
0
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)