示例#1
0
def comb_strat_settings_from_ml_prob(test_prob_dict, cut_num_dict, bt_fromdate, df_prc, shift_flag=False, comb_only=False, \
                                    trade_cost=0., ls_target_weight=0.5):
    weight_sig_data_dict = {}
    strats = []

    fsets = list(test_prob_dict.keys())

    weight_divisor = 1. / len(fsets)
    allidx = list(test_prob_dict[fsets[0]].index)
    codesToLoad = list(test_prob_dict[fsets[0]].columns)
    comb_sig = pd.DataFrame(0., index=allidx,
                            columns=codesToLoad).loc[bt_fromdate:]

    for fset in fsets:
        print(fset)
        sig_data = qcut_signal(test_prob_dict[fset], cut_num_dict[fset],
                               test_prob_dict[fset].index[0])
        sig_data = sig_data.pivot(index='tdate',
                                  columns='code',
                                  values='value')
        sig_data.index = pd.to_datetime(sig_data.index)
        long_sig = cut_num_dict[fset] * 1. - 1.
        short_sig = 0.

        # do below if you want to check lagging effect
        if shift_flag:
            sig_data = sig_data.reindex(df_prc.index).shift(1).dropna(
                axis=0, how='all')

        weight_sig_data_dict[fset] = sig_data.copy().apply(
            sig_to_weight,
            axis=1,
            args=(long_sig, short_sig, ls_target_weight)).loc[bt_fromdate:]

        if not comb_only:
            s = bt.Strategy(fset, [
                bt.algos.RunOnDate(*weight_sig_data_dict[fset].index),
                bt.algos.WeighTarget(weight_sig_data_dict[fset]),
                bt.algos.Rebalance()
            ])
            strats.append(bt.Backtest(s, df_prc.loc[weight_sig_data_dict[fset].index[0]:].fillna(method='ffill'), initial_capital=10.**9, \
                                      commissions=lambda q, p: abs(q*p)*trade_cost))

        tmp_sig_data = weight_sig_data_dict[fset].loc[
            bt_fromdate:] * weight_divisor
        comb_sig = comb_sig.add(tmp_sig_data.fillna(0.), fill_value=0.)

    weight_sig_data_dict[
        'comb'] = comb_sig  #[df_prc.loc[comb_sig.index, comb_sig.columns].notnull()]
    weight_sig_data_dict['comb'].fillna(0, inplace=True)

    s = bt.Strategy('comb', [
        bt.algos.RunOnDate(*weight_sig_data_dict['comb'].index),
        bt.algos.WeighTarget(weight_sig_data_dict['comb']),
        bt.algos.Rebalance()
    ])
    strats.append(bt.Backtest(s, df_prc.loc[weight_sig_data_dict['comb'].index[0]:].fillna(method='ffill').fillna(0), initial_capital=10.**9, \
                              commissions=lambda q, p: abs(q*p)*trade_cost))

    return strats, weight_sig_data_dict
示例#2
0
def test_run_period():
    target = mock.MagicMock()

    dts = pd.date_range('2010-01-01', periods=35)
    data = pd.DataFrame(index=dts, columns=['c1', 'c2'], data=100)

    algo = algos.RunPeriod()

    # adds the initial day
    backtest = bt.Backtest(
        bt.Strategy('', [algo]),
        data
    )
    target.data = backtest.data
    dts = target.data.index

    target.now = None
    assert not algo(target)

    # run on first date
    target.now = dts[0]
    assert not algo(target)

    # run on first supplied date
    target.now = dts[1]
    assert algo(target)

    # run on last date
    target.now = dts[len(dts) - 1]
    assert not algo(target)

    algo = algos.RunPeriod(
        run_on_first_date=False,
        run_on_end_of_period=True,
        run_on_last_date=True
    )

    # adds the initial day
    backtest = bt.Backtest(
        bt.Strategy('', [algo]),
        data
    )
    target.data = backtest.data
    dts = target.data.index

    # run on first date
    target.now = dts[0]
    assert not algo(target)

    # first supplied date
    target.now = dts[1]
    assert not algo(target)

    # run on last date
    target.now = dts[len(dts) - 1]
    assert algo(target)

    # date not in index
    target.now = datetime(2009, 2, 15)
    assert not algo(target)
def abovema_trainandtest(tickers,
                         sma=50,
                         start_train='06-01-2015',
                         end_train='05-31-2017',
                         start_test='06-01-2017',
                         end_test='05-31-2019',
                         name1='above_sma50_train',
                         name2='above_sma50_test'):
    #training test
    data_train = bt.get(tickers, start=start_train, end=end_train)
    sma_train = data_train.rolling(sma).mean()
    signal = data_train > sma_train
    s = bt.Strategy(name1, [
        bt.algos.SelectWhere(signal),
        bt.algos.WeighEqually(),
        bt.algos.Rebalance()
    ])

    #testing set
    data_test = bt.get(tickers, start=start_test, end=end_test)
    sma_test = data_test.rolling(sma).mean()
    signal2 = data_test > sma_test
    s2 = bt.Strategy(name2, [
        bt.algos.SelectWhere(signal2),
        bt.algos.WeighEqually(),
        bt.algos.Rebalance()
    ])
    return (bt.Backtest(s, data_train), bt.Backtest(s2, data_test))
示例#4
0
文件: test_algos.py 项目: stand2y/bt
def test_run_yearly():
    dts = pd.date_range('2010-01-01', periods=367)
    data = pd.DataFrame(index=dts, columns=['c1', 'c2'], data=100)

    target = mock.MagicMock()
    target.data = data

    algo = algos.RunYearly()
    # adds the initial day
    backtest = bt.Backtest(bt.Strategy('', [algo]), data)
    target.data = backtest.data

    # end of year
    target.now = dts[364]
    assert not algo(target)

    # new year
    target.now = dts[365]
    assert algo(target)

    algo = algos.RunYearly(run_on_first_date=False,
                           run_on_end_of_period=True,
                           run_on_last_date=True)
    # adds the initial day
    backtest = bt.Backtest(bt.Strategy('', [algo]), data)
    target.data = backtest.data

    # end of year
    target.now = dts[364]
    assert algo(target)

    # new year
    target.now = dts[365]
    assert not algo(target)
示例#5
0
def test_run_quarterly():
    dts = pd.date_range('2010-01-01', periods=367)
    data = pd.DataFrame(index=dts, columns=['c1', 'c2'], data=100)

    target = mock.MagicMock()
    target.data = data

    algo = algos.RunQuarterly()
    # adds the initial day
    backtest = bt.Backtest(
        bt.Strategy('', [algo]),
        data
    )
    target.data = backtest.data

    # end of quarter
    target.now = dts[89]
    assert not algo(target)

    # new quarter
    target.now = dts[90]
    assert algo(target)

    algo = algos.RunQuarterly(
        run_on_first_date=False,
        run_on_end_of_period=True,
        run_on_last_date=True
    )
    # adds the initial day
    backtest = bt.Backtest(
        bt.Strategy('', [algo]),
        data
    )
    target.data = backtest.data

    # end of quarter
    target.now = dts[89]
    assert algo(target)

    # new quarter
    target.now = dts[90]
    assert not algo(target)

    dts = pd.DatetimeIndex([datetime(2016, 1, 3), datetime(2017, 1, 8), datetime(2018, 1, 7)])
    data = pd.DataFrame(index=dts, columns=['c1', 'c2'], data=100)
    # adds the initial day
    backtest = bt.Backtest(
        bt.Strategy('', [algo]),
        data
    )
    target.data = backtest.data

    # check next year
    target.now = dts[1]
    assert algo(target)
示例#6
0
def test_select_randomly():

    s = bt.Strategy('s')

    dts = pd.date_range('2010-01-01', periods=3)
    data = pd.DataFrame(index=dts, columns=['c1', 'c2', 'c3'], data=100.)
    data['c1'][dts[0]] = np.nan
    data['c2'][dts[0]] = 95
    data['c3'][dts[0]] = -5

    s.setup(data)
    s.update(dts[0])

    algo = algos.SelectRandomly(n=1)
    assert algo(s)
    assert s.temp.pop('selected') == ['c2']

    random.seed(1000)
    algo = algos.SelectRandomly(n=1, include_negative=True)
    assert algo(s)
    assert s.temp.pop('selected') == ['c3']

    random.seed(1009)
    algo = algos.SelectRandomly(n=1, include_no_data=True)
    assert algo(s)
    assert s.temp.pop('selected') == ['c1']

    random.seed(1009)
    # If selected already set, it will further filter it
    s.temp['selected'] = ['c2']
    algo = algos.SelectRandomly(n=1, include_no_data=True)
    assert algo(s)
    assert s.temp.pop('selected') == ['c2']
示例#7
0
def test_rebalance_with_commissions():
    algo = algos.Rebalance()

    s = bt.Strategy('s')
    s.set_commissions(lambda q, p: 1)

    dts = pd.date_range('2010-01-01', periods=3)
    data = pd.DataFrame(index=dts, columns=['c1', 'c2'], data=100)

    s.setup(data)
    s.adjust(1000)
    s.update(dts[0])

    s.temp['weights'] = {'c1': 1}

    assert algo(s)
    assert s.value == 999
    assert s.capital == 99
    c1 = s['c1']
    assert c1.value == 900
    assert c1.position == 9
    assert c1.weight == 900 / 999.

    s.temp['weights'] = {'c2': 1}

    assert algo(s)
    assert s.value == 997
    assert s.capital == 97
    c2 = s['c2']
    assert c1.value == 0
    assert c1.position == 0
    assert c1.weight == 0
    assert c2.value == 900
    assert c2.position == 9
    assert c2.weight == 900. / 997
示例#8
0
def test_rebalance():
    algo = algos.Rebalance()

    s = bt.Strategy('s')

    dts = pd.date_range('2010-01-01', periods=3)
    data = pd.DataFrame(index=dts, columns=['c1', 'c2'], data=100)

    s.setup(data)
    s.adjust(1000)
    s.update(dts[0])

    s.temp['weights'] = {'c1': 1}
    assert algo(s)
    assert s.value == 1000
    assert s.capital == 0
    c1 = s['c1']
    assert c1.value == 1000
    assert c1.position == 10
    assert c1.weight == 1.

    s.temp['weights'] = {'c2': 1}

    assert algo(s)
    assert s.value == 1000
    assert s.capital == 0
    c2 = s['c2']
    assert c1.value == 0
    assert c1.position == 0
    assert c1.weight == 0
    assert c2.value == 1000
    assert c2.position == 10
    assert c2.weight == 1.
示例#9
0
def test_run_if_out_of_bounds():
    algo = algos.RunIfOutOfBounds(0.5)
    dts = pd.date_range('2010-01-01', periods=3)

    s = bt.Strategy('s')
    data = pd.DataFrame(index=dts, columns=['c1', 'c2'], data=100)
    s.setup(data)

    s.temp['selected'] = ['c1', 'c2']
    s.temp['weights'] = {'c1': .5, 'c2':.5}
    s.update(dts[0])
    s.children['c1'] = bt.core.SecurityBase('c1')
    s.children['c2'] = bt.core.SecurityBase('c2')

    s.children['c1']._weight = 0.5
    s.children['c2']._weight = 0.5
    assert not algo(s)
    
    s.children['c1']._weight = 0.25
    s.children['c2']._weight = 0.75
    assert not algo(s)
    
    s.children['c1']._weight = 0.24
    s.children['c2']._weight = 0.76
    assert algo(s)

    s.children['c1']._weight = 0.75
    s.children['c2']._weight = 0.25
    assert not algo(s)
    s.children['c1']._weight = 0.76
    s.children['c2']._weight = 0.24
    assert algo(s)
示例#10
0
def test_limit_weights():
    s = bt.Strategy('s')
    dts = pd.date_range('2010-01-01', periods=3)
    data = pd.DataFrame(index=dts, columns=['c1', 'c2'], data=100.)

    s.setup(data)
    s.temp['weights'] = {'c1': 0.6, 'c2':0.2, 'c3':0.2}

    algo = algos.LimitWeights(0.5)
    assert algo(s)
    w = s.temp['weights']
    assert w['c1'] == 0.5
    assert w['c2'] == 0.25
    assert w['c3'] == 0.25

    algo = algos.LimitWeights(0.3)
    assert algo(s)
    w = s.temp['weights']
    assert w == {}

    s.temp['weights'] = {'c1': 0.4, 'c2':0.3, 'c3':0.3}
    algo = algos.LimitWeights(0.5)
    assert algo(s)
    w = s.temp['weights']
    assert w['c1'] == 0.4
    assert w['c2'] == 0.3
    assert w['c3'] == 0.3
示例#11
0
def main():
    days = 5
    change = .02
    with open('ticker_sectors.data', 'rb') as f:
        tickerSectors = pickle.load(f)
    companies = tickerSectors[0]
    companyList = 'aos'
    for i in range(1, 10):
        companyList = companyList + ',' + companies[i].lower()
    print(companyList)
    data = bt.get(companyList, start='2014-01-01')
    print(data)
    weights = getPredictions(days, change)
    print(weights)
    s = bt.Strategy('s1', [
        bt.algos.RunWeekly(),
        bt.algos.SelectAll(),
        bt.algos.WeighTarget(weights),
        bt.algos.Rebalance()
    ])
    test = bt.Backtest(s, data)
    res = bt.run(test)
    res.plot()
    res.display()
    print("GOOD")
示例#12
0
def SMA(data):
    sma = data.rolling(50).mean()
    plot = bt.merge(data, sma).plot(figsize=(15, 5))
    plt.savefig("sma.png")
    
    # 建立策略
    s = bt.Strategy("above50sma",
        [SelectWhere(data > sma),
         bt.algos.WeighEqually(),
         bt.algos.Rebalance()
        ])
    # 建立回测
    t = bt.Backtest(s, data)
    # 执行回测
    res = bt.run(t)
    # 输出结果
    res.display()
    res.plot()
    plt.savefig("sma_result.png")
    
    # 多种策略的测试
    sma10 = above_sma(data, sma_per = 10, name = "sma10")
    sma20 = above_sma(data, sma_per = 10, name = "sma20")
    sma40 = above_sma(data, sma_per = 10, name = "sma40")
    base_line = baseTest(data)
    
    # 一起运行回测
    res2 = bt.run(sma10, sma20, sma40, base_line)
    # 输出结果
    res2.display()
    res2.plot()
    plt.savefig("sma.png")
    plt.savefig("multi_sma_result.png")
示例#13
0
def SMA_cross(data):
    sma50 = data.rolling(50).mean()
    sma200 = data.rolling(200).mean()
    
    tw = sma200.copy()
    tw[sma50 > sma200] = 1.0
    tw[sma50 <= sma200] = -1.0
    
    tw[sma200.isnull()] = 0.0
    
    tmp = bt.merge(tw, data, sma50, sma200)
    tmp.columns = ["tw", "price", "sma50", "sma200"]
    # tmp.columns = ['tw', 'price', 'sma50', 'sma200']
    ax = tmp.plot(figsize = (15, 5), secondary_y = ["tw"])
    plt.savefig("smacross.png")
    
    ma_cross = bt.Strategy("ma_cross",
    [WeighTarget(tw),
     bt.algos.Rebalance()
    ])
    t = bt.Backtest(ma_cross, data)
    res = bt.run(t)
    res.display()
    
    res.plot()
    plt.savefig("smacross_res")
示例#14
0
def run():
    df_price, df_thred = transfer()
    signal = df_thred > 0.7
    for col in range(signal.shape[1]):
        eng = 0
        for i in range(signal.shape[0]):
            if signal.iloc[i, col]:
                eng = 4
            elif eng > 0:
                signal.iloc[i, col] = True
                eng -= 1
            else:
                pass


    # first we create the Strategy
    s = bt.Strategy('above50sma', [SelectWhere(signal),
                                   bt.algos.WeighEqually(),
                                   bt.algos.Rebalance()])
    # now we create the Backtest
    t = bt.Backtest(s, df_price, initial_capital=9000)

    # and let's run it!
    res = bt.run(t)
    res.plot('d')
    ser = res._get_series('d').rebase()
    plot = ser.plot()
    fig = plot.get_figure()
    fig.savefig(os.path.join(root, "report", "backtest.png"))
def main():
    '''entry point'''

    # Get Test Data with all fields
    symbol_list = ['BTC', 'ETH']
    history = coinrepo.get_coinhistory(symbol_list)
    history = history.set_index('Date')

    # Pivot to have only price as timeseries
    pricehistory = history.pivot(columns='Symbol')['Price']

    # Create the strategy
    s = bt.Strategy('s1', [
        bt.algos.RunMonthly(),
        bt.algos.SelectAll(),
        bt.algos.WeighEqually(),
        bt.algos.Rebalance()
    ])

    # create a backtest and run it
    test = bt.Backtest(s, pricehistory)
    res = bt.run(test)

    res.display()

    # Save figures
    plot = pricehistory.plot(figsize=(15, 5))
    fig = plot.get_figure()
    fig.savefig("price.png")
    plot1 = res.plot_weights(figsize=(15, 5))
    fig1 = plot1.get_figure()
    fig1.savefig("bt_rest.png")
示例#16
0
def test_select_types():
    c1 = bt.Security('c1')
    c2 = bt.CouponPayingSecurity('c2')
    c3 = bt.HedgeSecurity('c3')
    c4 = bt.CouponPayingHedgeSecurity('c4')
    c5 = bt.FixedIncomeSecurity('c5')

    s = bt.Strategy('p', children = [c1, c2, c3, c4, c5])

    dts = pd.date_range('2010-01-01', periods=3)
    data = pd.DataFrame(index=dts, columns=['c1', 'c2', 'c3', 'c4', 'c5'], data=100.)
    coupons = pd.DataFrame(index=dts, columns=['c2', 'c4'], data=0.)
    s.setup(data, coupons = coupons)

    i = 0
    s.update(dts[i])

    algo = algos.SelectTypes(include_types=(bt.Security, bt.HedgeSecurity), exclude_types=())
    assert algo(s)
    assert set(s.temp.pop('selected')) == set(['c1', 'c3'])

    algo = algos.SelectTypes(include_types=(bt.core.SecurityBase,), exclude_types=(bt.CouponPayingSecurity,))
    assert algo(s)
    assert set(s.temp.pop('selected')) == set(['c1', 'c3', 'c5'])

    s.temp['selected'] = ['c1', 'c2', 'c3']
    algo = algos.SelectTypes(include_types=(bt.core.SecurityBase,))
    assert algo(s)
    assert set(s.temp.pop('selected')) == set(['c1', 'c2', 'c3'])
示例#17
0
def run():
    """ Run the code that illustrates the pairs trading strategy """
    data = make_data()

    # Define the "entry" strategy of the trade. In this case, we give each asset unit weight and trade it
    trade_entry = bt.AlgoStack( bt.algos.RunOnce(), WeighPair(1.), bt.algos.Rebalance() )

    # Define the "exit" strategy of the trade. Here we exit when we cross either an upper/lower
    # threshold on the price of the strategy, or hold it for a fixed length of time.
    trade_exit = bt.AlgoStack(
        bt.algos.Or( [PriceCompare( 96., is_greater=False ),
                    PriceCompare( 104., is_greater=True),
                    bt.algos.RunAfterDays( 5 ) ] ),
        ClosePositions()
        )
    # Combine the entry, exit and debug algos for each trade
    trade_algos = [ bt.algos.Or( [ trade_entry, trade_exit, DebugTradeLevel() ] )]

    # Define the strategy for the master portfolio.
    strategy_algos = [
        PairsSignal( threshold = 4., indicator_name = 'my_indicator' ),
        SetupPairsTrades( trade_algos ),
        SizePairsTrades( pct_of_capital = 0.2 ),
        DebugPortfolioLevel()
    ]

    # Build and run the strategy
    strategy = bt.Strategy( 'PairsStrategy', strategy_algos )
    test = bt.Backtest( strategy, data, additional_data={'my_indicator':data} )
    out = bt.run( test )
    print(out.stats)
    return out
示例#18
0
def test_turnover():
    dts = pd.date_range('2010-01-01', periods=5)
    data = pd.DataFrame(index=dts, columns=['a', 'b'], data=100)

    data['a'][dts[1]] = 105
    data['b'][dts[1]] = 95

    data['a'][dts[2]] = 110
    data['b'][dts[2]] = 90

    data['a'][dts[3]] = 115
    data['b'][dts[3]] = 85

    s = bt.Strategy('s', [bt.algos.SelectAll(),
                          bt.algos.WeighEqually(),
                          bt.algos.Rebalance()])

    t = bt.Backtest(s, data, commissions=lambda x, y: 0, progress_bar=False)
    res = bt.run(t)

    t = res.backtests['s']

    # these numbers were (tediously) calculated in excel
    assert np.allclose(t.turnover[dts[0]], 0. / 1000000)
    assert np.allclose(t.turnover[dts[1]], 24985. / 1000000)
    assert np.allclose(t.turnover[dts[2]], 24970. / 997490)
    assert np.allclose(t.turnover[dts[3]], 25160. / 992455)
    assert np.allclose(t.turnover[dts[4]], 76100. / 1015285)
示例#19
0
def test_select_where():
    s = bt.Strategy('s')

    dts = pd.date_range('2010-01-01', periods=3)
    data = pd.DataFrame(index=dts, columns=['c1', 'c2'], data=100.)

    where = pd.DataFrame(index=dts, columns=['c1', 'c2'], data=True)
    where.loc[ dts[1] ] = False
    where['c1'].loc[ dts[2] ] = False

    algo = algos.SelectWhere(where)

    s.setup(data)
    s.update(dts[0])

    assert algo(s)
    selected = s.temp['selected']
    assert len(selected) == 2
    assert 'c1' in selected
    assert 'c2' in selected

    s.update(dts[1])
    assert algo(s)
    assert s.temp['selected'] == []

    s.update(dts[2])
    assert algo(s)
    assert s.temp['selected'] == ['c2']
示例#20
0
 def combine_backtests(backtests):
     return bt.Strategy('{}'.format([b.name for b in backtests]), [
         bt.algos.RunOnce(),
         bt.algos.SelectAll(),
         bt.algos.WeighEqually(),
         bt.algos.Rebalance()
     ], backtests)
示例#21
0
 def get_benchmark_bt():
     return bt.Strategy('benchmark', [
         bt.algos.RunOnce(),
         bt.algos.SelectAll(),
         bt.algos.WeighEqually(),
         bt.algos.Rebalance()
     ])
示例#22
0
文件: test_algos.py 项目: xyicheng/bt
def test_weigh_mean_var(mock_mv):
    algo = algos.WeighMeanVar(lookback=pd.DateOffset(days=5))

    mock_mv.return_value = pd.Series({'c1': 0.3, 'c2': 0.7})

    s = bt.Strategy('s')

    dts = pd.date_range('2010-01-01', periods=5)
    data = pd.DataFrame(index=dts, columns=['c1', 'c2'], data=100.)

    s.setup(data)
    s.update(dts[4])
    s.temp['selected'] = ['c1', 'c2']

    assert algo(s)
    assert mock_mv.called
    rets = mock_mv.call_args[0][0]
    assert len(rets) == 4
    assert 'c1' in rets
    assert 'c2' in rets

    weights = s.temp['weights']
    assert len(weights) == 2
    assert weights['c1'] == 0.3
    assert weights['c2'] == 0.7
示例#23
0
def test_30_min_data():
    names = ['foo']
    dates = pd.date_range(start='2017-01-01', end='2017-12-31', freq='30min')
    n = len(dates)
    rdf = pd.DataFrame(np.zeros((n, len(names))), index=dates, columns=names)

    np.random.seed(1)
    rdf[names[0]] = np.random.normal(loc=0.1 / n,
                                     scale=0.2 / np.sqrt(n),
                                     size=n)

    pdf = 100 * np.cumprod(1 + rdf)

    sma50 = pdf.rolling(50).mean()
    sma200 = pdf.rolling(200).mean()

    tw = sma200.copy()
    tw[sma50 > sma200] = 1.0
    tw[sma50 <= sma200] = -1.0
    tw[sma200.isnull()] = 0.0

    ma_cross = bt.Strategy('ma_cross',
                           [bt.algos.WeighTarget(tw),
                            bt.algos.Rebalance()])
    t = bt.Backtest(ma_cross, pdf, progress_bar=False)
    res = bt.run(t)

    wait = 1
示例#24
0
文件: test_algos.py 项目: xyicheng/bt
def test_select_all():
    algo = algos.SelectAll()

    s = bt.Strategy('s')

    dts = pd.date_range('2010-01-01', periods=3)
    data = pd.DataFrame(index=dts, columns=['c1', 'c2'], data=100.)
    data['c1'][dts[1]] = np.nan
    data['c2'][dts[1]] = 95

    s.setup(data)
    s.update(dts[0])

    assert algo(s)
    selected = s.temp['selected']
    assert len(selected) == 2
    assert 'c1' in selected
    assert 'c2' in selected

    # make sure don't keep nan
    s.update(dts[1])

    assert algo(s)
    selected = s.temp['selected']
    assert len(selected) == 1
    assert 'c2' in selected

    # if specify include_no_data then 2
    algo = algos.SelectAll(include_no_data=True)

    assert algo(s)
    selected = s.temp['selected']
    assert len(selected) == 2
    assert 'c1' in selected
    assert 'c2' in selected
示例#25
0
文件: test_algos.py 项目: xyicheng/bt
def test_weigh_inv_vol():
    algo = algos.WeighInvVol(lookback=pd.DateOffset(days=5))

    s = bt.Strategy('s')

    dts = pd.date_range('2010-01-01', periods=5)
    data = pd.DataFrame(index=dts, columns=['c1', 'c2'], data=100.)

    # high vol c1
    data['c1'].ix[dts[1]] = 105
    data['c1'].ix[dts[2]] = 95
    data['c1'].ix[dts[3]] = 105
    data['c1'].ix[dts[4]] = 95

    # low vol c2
    data['c2'].ix[dts[1]] = 100.1
    data['c2'].ix[dts[2]] = 99.9
    data['c2'].ix[dts[3]] = 100.1
    data['c2'].ix[dts[4]] = 99.9

    s.setup(data)
    s.update(dts[4])
    s.temp['selected'] = ['c1', 'c2']

    assert algo(s)
    weights = s.temp['weights']
    assert len(weights) == 2
    assert weights['c2'] > weights['c1']
    aae(weights['c1'], 0.020, 3)
    aae(weights['c2'], 0.980, 3)
示例#26
0
def buy_and_hold(ticker: str, start: Union[str, datetime], name: str):
    """
    Generates a backtest object for the given ticker
    Parameters
    ----------
    ticker: str
        Stock to test
    start: Union[str, datetime]
        Backtest start date.  Can be either string or datetime
    name:
        Name of the backtest (for labeling purposes)

    Returns
    -------
    bt.Backtest object for buy and hold strategy
    """
    prices = bt.get(ticker, start=start)
    bt_strategy = bt.Strategy(
        name,
        [
            bt.algos.RunOnce(),
            bt.algos.SelectAll(),
            bt.algos.WeighEqually(),
            bt.algos.Rebalance(),
        ],
    )
    return bt.Backtest(bt_strategy, prices)
示例#27
0
def test_select_these():
    s = bt.Strategy('s')

    dts = pd.date_range('2010-01-01', periods=3)
    data = pd.DataFrame(index=dts, columns=['c1', 'c2'], data=100.)
    data['c1'][dts[1]] = np.nan
    data['c2'][dts[1]] = 95
    data['c1'][dts[2]] = -5

    s.setup(data)
    s.update(dts[0])

    algo = algos.SelectThese( ['c1', 'c2'])
    assert algo(s)
    selected = s.temp['selected']
    assert len(selected) == 2
    assert 'c1' in selected
    assert 'c2' in selected

    algo = algos.SelectThese( ['c1'])
    assert algo(s)
    selected = s.temp['selected']
    assert len(selected) == 1
    assert 'c1' in selected


    # make sure don't keep nan
    s.update(dts[1])

    algo = algos.SelectThese( ['c1', 'c2'])
    assert algo(s)
    selected = s.temp['selected']
    assert len(selected) == 1
    assert 'c2' in selected

    # if specify include_no_data then 2
    algo2 = algos.SelectThese( ['c1', 'c2'], include_no_data=True)

    assert algo2(s)
    selected = s.temp['selected']
    assert len(selected) == 2
    assert 'c1' in selected
    assert 'c2' in selected

    # behavior on negative prices
    s.update(dts[2])

    assert algo(s)
    selected = s.temp['selected']
    assert len(selected) == 1
    assert 'c2' in selected

    algo3 = algos.SelectThese(['c1', 'c2'], include_negative=True)

    assert algo3(s)
    selected = s.temp['selected']
    assert len(selected) == 2
    assert 'c1' in selected
    assert 'c2' in selected
示例#28
0
def CreateStrategy(name):
    strategy = bt.Strategy(name,
    [bt.algos.RunWeekly(),
     bt.algos.SelectAll(),
     bt.algos.WeighEqually(),
     bt.algos.Rebalance()
    ])
    return strategy
示例#29
0
def above_sma(data, sma_per = 50, name = "above_sma"):
    sma = data.rolling(sma_per).mean()
    s = bt.Strategy(name,
    [bt.algos.SelectWhere(data > sma),
     bt.algos.WeighEqually(),
     bt.algos.Rebalance()
    ])
    return bt.Backtest(s, data)
示例#30
0
def baseTest(data):
    s = bt.Strategy("base_line",
    [bt.algos.RunOnce(),
     bt.algos.SelectAll(),
     bt.algos.WeighEqually(),
     bt.algos.Rebalance()
    ])
    return bt.Backtest(s, data)