scubamut
6/24/2019 - 1:17 PM

BACKTEST RS_DM OR PMA

import pandas_datareader.data as pdr
import matplotlib.pyplot as plt
import pandas as pd
from datetime import datetime, timezone
import pytz
import talib
import itable
import ffn

from fintools import get_DataArray,compute_weights_RS_DM,compute_weights_PMA,\
                     Parameters, show_return_table, show_annual_returns, \
                     endpoints, backtest

start = datetime(2000, 1, 1, 0, 0, 0, 0, pytz.utc)
end = datetime.today().replace(tzinfo=timezone.utc)


# CHOOSE ONLY ONE

# ETFs

# strategies = {
#     'RS0001': { 'assets': ['CWB','HYG','MBB','IEF','HYD'],
#                'start':start, 'end':end,
#                'rs_lookback': 1, 'risk_lookback': 1, 'n_top': 2, 'frequency': 'M',
#               'cash_proxy': 'CASHX', 'risk_free': 0},
#     'RS0002': {'assets': ['HYD','QLTB','MBB'],
#                'start':start, 'end':end,
#                'rs_lookback': 3, 'risk_lookback': 2, 'n_top': 1, 'frequency': 'M',
#               'cash_proxy': 'CASHX', 'risk_free': 0},
#     'RS0003': {'assets': ['HYD','MBB','SHY'],
#                'start':start, 'end':end,
#                'rs_lookback': 1, 'risk_lookback': 1, 'n_top': 1, 'frequency': 'Q',
#               'cash_proxy': 'CASHX', 'risk_free': 0},
#     'DM0001': {'assets': ['CWB','VYM','HYG','VHT','TLT','MBB','HYD','IEF'],
#                'start':start, 'end':end,
#                'rs_lookback': 1, 'risk_lookback': 1, 'n_top': 3, 'frequency': 'M',
#               'cash_proxy': 'CASHX', 'risk_free': 'SHY'},
#     'DM0002': {'assets': ['CWB','TLT','HYG','VHT','VNQ'],
#                'start':start, 'end':end,
#                'rs_lookback': 1, 'risk_lookback': 1, 'n_top': 5, 'frequency': 'M',
#               'cash_proxy': 'MBB', 'risk_free': 'SHY'},
#     'PMA001': {'assets': ['CWB','MBB'],
#                'start':start, 'end':end,
#                'risk_lookback': 3, 'frequency': 'M', 'allocations': [0.6, 0.4],
#               'cash_proxy': 'TLT'},
#     'PMA002': {'assets': ['CWB','VYM','HYG'],
#                'start':start, 'end':end,
#                'risk_lookback': 3, 'frequency': 'M', 'allocations': [0.6, 0.2, 0.2],
#               'cash_proxy': 'TLT'},
#     'PMA003': {'assets': ['VCVSX', 'FAGIX', 'VGHCX'],
#                'start':start, 'end':end,
#                'risk_lookback': 2, 'frequency': 'M', 'allocations': [1./3., 1./3., 1./3.],
#               'cash_proxy': 'VUSTX'}
#     }

# FUNDS

strategies = {
    'RS0001': { 'assets': ['VCVSX','VWEHX','VFIIX','FGOVX','VWAHX'],
               'start':start, 'end':end,
               'rs_lookback': 1, 'risk_lookback': 1, 'n_top': 2, 'frequency': 'M',
              'cash_proxy': 'CASHX', 'risk_free': 0},
    # 'RS0002': {'assets': ['MMHYX','FAGIX','VFIIX'],
    #            'start':start, 'end':end,
    #            'rs_lookback': 3, 'risk_lookback': 2, 'n_top': 1, 'frequency': 'M',
    #           'cash_proxy': 'CASHX', 'risk_free': 0},
    # 'RS0003': {'assets': ['MMHYX','FAGIX','VFIIX'],
    #            'start':start, 'end':end,
    #            'rs_lookback': 1, 'risk_lookback': 1, 'n_top': 1, 'frequency': 'Q',
    #           'cash_proxy': 'CASHX', 'risk_free': 0},
    # 'DM0001': {'assets': ['VCVSX','VWINX','VWEHX','VGHCX','VUSTX','VFIIX','VWAHX','FGOVX','FFXSX'],
    #            'start':start, 'end':end,
    #            'rs_lookback': 1, 'risk_lookback': 1, 'n_top': 3, 'frequency': 'M',
    #           'cash_proxy': 'CASHX', 'risk_free': 'FFXSX'},
    # 'DM0002': {'assets': ['VCVSX','VUSTX','VWEHX','VFIIX','VGHCX','FRESX'],
    #            'start':start, 'end':end,
    #            'rs_lookback': 1, 'risk_lookback': 1, 'n_top': 5, 'frequency': 'M',
    #           'cash_proxy': 'VFIIX', 'risk_free': 'FFXSX'},
    # 'PMA001': {'assets': ['VCVSX', 'VFIIX'],
    #            'start':start, 'end':end,
    #            'risk_lookback': 3, 'frequency': 'M', 'allocations': [0.6, 0.4],
    #           'cash_proxy': 'VUSTX'},
    # 'PMA002': {'assets': ['VCVSX', 'VWINX', 'VWEHX'],
    #            'start':start, 'end':end,
    #            'risk_lookback': 3, 'frequency': 'M', 'allocations': [0.6, 0.2, 0.2],
    #           'cash_proxy': 'VUSTX'},
    # 'PMA003': {'assets': ['VCVSX', 'FAGIX', 'VGHCX'],
    #            'start':start, 'end':end,
    #            'risk_lookback': 2, 'frequency': 'M', 'allocations': [1./3., 1./3., 1./3.],
    #           'cash_proxy': 'VUSTX'}
    }

if len(strategies) == 1:
    name = [k for k in strategies.keys()][0]
    if 'PMA' in name:
        p_value, p_holdings, p_weights, prices = compute_weights_PMA(name, strategies[name])
    else:
        p_value, p_holdings, p_weights, prices = compute_weights_RS_DM(name, strategies[name])
    p_value.plot(figsize=(15, 10), grid=True)

else:
    print('***** ERROR : ', 'ONLY ONE STRATEGY ALLOWED')

ffn.calc_perf_stats(p_value).display()

# show_return_table(p_value)

# show_annual_returns(p_value)