Beispiel #1
0
    def run(self):
        self._ts = pf.fetch_timeseries(self._symbol)
        self._ts = pf.select_tradeperiod(self._ts,
                                         self._start,
                                         self._end,
                                         use_adj=False)

        # Add technical indicator: 200 day sma
        sma200 = SMA(self._ts, timeperiod=200)
        self._ts['sma200'] = sma200

        # Add technical indicator: X day high, and X day low
        period_high = pd.Series(self._ts.close).rolling(self._period).max()
        period_low = pd.Series(self._ts.close).rolling(self._period).min()
        self._ts['period_high'] = period_high
        self._ts['period_low'] = period_low

        self._tlog = pf.TradeLog()
        self._dbal = pf.DailyBal()

        # add S&P500 200 sma
        sp500 = pf.fetch_timeseries('^GSPC')
        sp500 = pf.select_tradeperiod(sp500, self._start, self._end, False)
        self._ts['sp500_close'] = sp500['close']
        sp500_sma = SMA(sp500, timeperiod=200)
        self._ts['sp500_sma'] = sp500_sma

        self._algo()
Beispiel #2
0
    def run(self):
        self._ts = pf.fetch_timeseries(self._symbol)
        self._ts = pf.select_tradeperiod(self._ts, self._start,
                                         self._end, use_adj=True)

        # Add technical indicator: 200 day sma
        sma200 = SMA(self._ts, timeperiod=200)
        self._ts['sma200'] = sma200

        # Add technical indicator: X day sma
        sma = SMA(self._ts, timeperiod=self._sma)
        self._ts['sma'] = sma

        # Add technical indicator: X day high, and X day low
        period_high = pd.Series(self._ts.close).rolling(self._period).max()
        period_low = pd.Series(self._ts.close).rolling(self._period).min()
        self._ts['period_high'] = period_high
        self._ts['period_low'] = period_low
        
        self._ts, self._start = pf.finalize_timeseries(self._ts, self._start)
        
        self._tlog = pf.TradeLog()
        self._dbal = pf.DailyBal()

        self._algo()
Beispiel #3
0
    def run(self):

        # Fetch and select timeseries.
        self.ts = pf.fetch_timeseries(self.symbol,
                                      use_cache=self.options['use_cache'])
        self.ts = pf.select_tradeperiod(self.ts,
                                        self.start,
                                        self.end,
                                        use_adj=self.options['use_adj'])

        # Add technical indicator: 200 day sma regime filter.
        self.ts['regime'] = pf.CROSSOVER(self.ts,
                                         timeperiod_fast=1,
                                         timeperiod_slow=200)

        # Add technical indicators: X day high, and X day low.
        self.ts['period_high'] = pd.Series(self.ts.close).rolling(
            self.options['period']).max()
        self.ts['period_low'] = pd.Series(self.ts.close).rolling(
            self.options['period']).min()

        # Finalize timeseries.
        self.ts, self.start = pf.finalize_timeseries(self.ts, self.start)

        # Create tlog and dbal objects.
        self.tlog = pf.TradeLog(self.symbol)
        self.dbal = pf.DailyBal()

        # Run algo, get logs, and get stats.
        self._algo()
        self._get_logs()
        self._get_stats()
Beispiel #4
0
    def run(self):
        self._ts = pf.fetch_timeseries(self._symbol)
        self._ts = pf.select_tradeperiod(self._ts, self._start, self._end)
        self._tlog = pf.TradeLog()
        self._dbal = pf.DailyBal()

        self._algo()
Beispiel #5
0
    def run(self):
        self.ts = pf.fetch_timeseries(self.symbol)
        self.ts = pf.select_tradeperiod(self.ts, self.start, self.end, use_adj=True)

        # Add technical indicator: 200 sma regime filter
        self.ts['regime'] = \
            pf.CROSSOVER(self.ts, timeperiod_fast=1, timeperiod_slow=200)
        
        # Add technical indicator: instrument risk, i.e. annual std
        self.ts['vola'] = \
            pf.VOLATILITY(self.ts, lookback=20, time_frame='yearly')

        # Add technical indicator: X day sma
        sma = SMA(self.ts, timeperiod=self.sma)
        self.ts['sma'] = sma

        # Add technical indicator: X day high, and X day low
        period_high = pd.Series(self.ts.close).rolling(self.period).max()
        period_low = pd.Series(self.ts.close).rolling(self.period).min()
        self.ts['period_high'] = period_high
        self.ts['period_low'] = period_low
        
        self.ts, self.start = pf.finalize_timeseries(self.ts, self.start)
        
        self.tlog = pf.TradeLog(self.symbol)
        self.dbal = pf.DailyBal()

        self._algo()
Beispiel #6
0
    def get_logs(self):
        """
        Return raw tradelog, tradelog, and daily balance log.

        Parameters
        ----------
        None

        Returns
        -------
        rlog : pd.DataFrame
            The raw trade log.
        tlog : pd.DataFrame
            The trade log.
        dbal : pd.DataFrame
            The daily balance log.
        """
        tlogs = []; rlogs = []
        for tlog in pf.TradeLog.instance.values():
            rlogs.append(tlog.get_log_raw())
            tlogs.append(tlog.get_log(merge_trades=False))
        rlog = pd.concat([r for r in rlogs]).sort_values(['seq_num'],
                         ignore_index=True)
        tlog = pd.concat([t for t in tlogs]).sort_values(['entry_date', 'exit_date'],
                         ignore_index=True)
        tlog['cumul_total'] = tlog['pl_cash'].cumsum()

        dbal = pf.DailyBal()
        dbal._l = self._l
        dbal = dbal.get_log(tlog)
        return rlog, tlog, dbal
Beispiel #7
0
    def run(self):
        self.ts = pf.fetch_timeseries(self.symbol,
                                      use_cache=self.options['use_cache'])
        self.ts = pf.select_tradeperiod(self.ts, self.start, self.end,
                                        self.options['use_adj'])

        # Add calendar columns
        self.ts = pf.calendar(self.ts)

        # Add momentum indicator for 3...18 months
        lookbacks = range(3, 18 + 1)
        for lookback in lookbacks:
            self.ts['mom' + str(lookback)] = pf.MOMENTUM(self.ts,
                                                         lookback=lookback,
                                                         time_frame='monthly',
                                                         price='close',
                                                         prevday=False)

        self.ts, self.start = pf.finalize_timeseries(self.ts, self.start)

        self.tlog = pf.TradeLog(self.symbol)
        self.dbal = pf.DailyBal()

        self._algo()
        self._get_logs()
        self._get_stats()
Beispiel #8
0
 def test_daily_balance_state(self):
     ''' For t to be instantiated the trade state must exist.
         Throw an error if the trade state is not valid.
     '''
     bal = pf.DailyBal()
     self.state = None
     with self.assertRaises(pf.trade.TradeStateError):
         self.call_append(bal)
Beispiel #9
0
    def run(self):
        self.ts = pf.fetch_timeseries(self.symbol)
        self.ts = pf.select_tradeperiod(self.ts,
                                        self.start,
                                        self.end,
                                        use_adj=self.use_adj)
        self.ts, _ = pf.finalize_timeseries(self.ts, self.start)

        self.tlog = pf.TradeLog(self.symbol)
        self.dbal = pf.DailyBal()

        self._algo()
Beispiel #10
0
    def run(self):
        self._ts = pf.fetch_timeseries(self._symbol)
        self._ts = pf.select_tradeperiod(self._ts, self._start,
                                         self._end, use_adj=False)
        
        # Add technical indicator:  day sma
        sma = SMA(self._ts, timeperiod=self._sma_period)
        self._ts['sma'] = sma          
        
        self._tlog = pf.TradeLog()
        self._dbal = pf.DailyBal()

        self._algo()
Beispiel #11
0
    def run(self):
        self._ts = pf.fetch_timeseries(self._symbol)
        self._ts = pf.select_tradeperiod(self._ts,
                                         self._start,
                                         self._end,
                                         use_adj=self._use_adj,
                                         pad=False)
        self._ts, _ = pf.finalize_timeseries(self._ts, self._start)

        self._tlog = pf.TradeLog()
        self._dbal = pf.DailyBal()

        self._algo()
Beispiel #12
0
    def run(self):
        self._ts = pf.fetch_timeseries(self._symbol)
        self._ts = pf.select_tradeperiod(self._ts,
                                         self._start,
                                         self._end,
                                         use_adj=False)

        # Add technical indicator: X day high
        period_high = pd.rolling_max(self._ts.high, self._period)
        self._ts['period_high'] = period_high

        self._tlog = pf.TradeLog()
        self._dbal = pf.DailyBal()

        self._algo()
Beispiel #13
0
    def run(self):
        self.ts = pf.fetch_timeseries(self.symbol)
        self.ts = pf.select_tradeperiod(self.ts, self.start,
                                         self.end, self.use_adj)
        
        # Add technical indicator: day sma regime filter
        self.ts['regime'] = \
            pf.CROSSOVER(self.ts, timeperiod_fast=1, timeperiod_slow=self.sma_period,
                         band=self.percent_band)
        
        self.ts, self.start = pf.finalize_timeseries(self.ts, self.start)

        self.tlog = pf.TradeLog(self.symbol)
        self.dbal = pf.DailyBal()

        self._algo()
Beispiel #14
0
    def run(self):
        self.ts = pf.fetch_timeseries(self.symbol)
        self.ts = pf.select_tradeperiod(self.ts, self.start, self.end)

        # add regime filter
        self.ts['regime'] = \
            pf.CROSSOVER(self.ts,
                         timeperiod_fast=self.timeperiod_fast,
                         timeperiod_slow=self.timeperiod_slow,
                         band=self.percent_band)

        self.ts, self.start = pf.finalize_timeseries(self.ts, self.start)

        self.tlog = pf.TradeLog(self.symbol)
        self.dbal = pf.DailyBal()

        self._algo()
Beispiel #15
0
    def test_daily_balance_append(self):
        ''' Check that the daily log grows as expected. '''
        bal = pf.DailyBal()
        df = bal.get_log()
        self.assertTrue(isinstance(df, pd.DataFrame))
        self.assertTrue(len(df.index) == 0)

        self.state = pf.trade.TradeState.OPEN
        self.call_append(bal)
        df = bal.get_log()
        self.assertTrue(len(df.index) == 1)

        self.state = pf.trade.TradeState.HOLD
        self.call_append(bal)
        df = bal.get_log()
        self.assertTrue(len(df.index) == 2)

        self.state = pf.trade.TradeState.CLOSE
        self.call_append(bal)
        df = bal.get_log()
        self.assertTrue(len(df.index) == 3)

        price_columns = ["high", "low", "close"]
        other_columns = ["shares", "cash"]

        # we are keeping the high, low and close the same for this test
        # cash and shares are also kept equal
        portfolio_value = self.high * self.shares + self.cash

        # all prices are $x
        prices = list(set(df[price_columns].values.flatten().tolist()))
        self.assertTrue(len(prices) == 1)
        self.assertTrue(prices[0] == portfolio_value)

        # all other values (except state) are y
        others = list(set(df[other_columns].values.flatten().tolist()))
        self.assertTrue(len(others) == 1)
        self.assertTrue(others[0] == self.shares)

        # check the order of our states
        states = df["state"].values.tolist()
        self.assertTrue(states[0] == pf.trade.TradeState.OPEN)
        self.assertTrue(states[1] == pf.trade.TradeState.HOLD)
        self.assertTrue(states[2] == pf.trade.TradeState.CLOSE)
Beispiel #16
0
    def run(self):
        self._ts = pf.fetch_timeseries(self._symbol)
        self._ts = pf.select_tradeperiod(self._ts, self._start,
                                         self._end, self._use_adj)       

        # Add technical indicator:  day sma
        sma = SMA(self._ts, timeperiod=self._sma_period)
        self._ts['sma'] = sma          

        self._tlog = pf.TradeLog()
        self._dbal = pf.DailyBal()
        
        # add S&P500 200 sma regime filter
        ts = pf.fetch_timeseries('^GSPC')
        ts = pf.select_tradeperiod(ts, self._start, self._end, False) 
        self._ts['regime'] = \
            pf.CROSSOVER(ts, timeperiod_fast=1, timeperiod_slow=200)

        self._algo()
Beispiel #17
0
    def run(self):
        self.ts = pf.fetch_timeseries(self.symbol)
        self.ts = pf.select_tradeperiod(self.ts, self.start, self.end)

        # add regime filter
        self.ts['regime'] = \
            pf.CROSSOVER(self.ts,
                         timeperiod_fast=self.timeperiod_fast,
                         timeperiod_slow=self.timeperiod_slow,
                         band=self.percent_band)

        # Add technical indicator: volatility
        self.ts['vola'] = pf.VOLATILITY(self.ts)

        self.ts, self.start = pf.finalize_timeseries(self.ts, self.start)

        self.tlog = pf.TradeLog(self.symbol)
        self.dbal = pf.DailyBal()

        self._algo()
Beispiel #18
0
    def run(self):
        self._ts = pf.fetch_timeseries(self._symbol)
        self._ts = pf.select_tradeperiod(self._ts, self._start,
                                         self._end, self._use_adj)       

        # Add technical indicator:  day sma
        sma = SMA(self._ts, timeperiod=self._sma_period)
        self._ts['sma'] = sma          

        self._tlog = pf.TradeLog()
        self._dbal = pf.DailyBal()
        
        # add S&P500 200 sma
        sp500 = pf.fetch_timeseries('^GSPC')
        sp500 = pf.select_tradeperiod(sp500, self._start,
                                      self._end, False)
        self._ts['sp500_close'] = sp500['close']
        sp500_sma = SMA(sp500, timeperiod=200)
        self._ts['sp500_sma'] = sp500_sma

        self._algo()
Beispiel #19
0
    def run(self):

        # Fetch and selct timeseries
        self.ts = pf.fetch_timeseries(self.symbol,
                                      use_cache=self.options['use_cache'])
        self.ts = pf.select_tradeperiod(self.ts, self.start, self.end,
                                        self.options['use_adj'])

        # Add technical indicator: day sma regime filter.
        self.ts['regime'] = \
            pf.CROSSOVER(self.ts, timeperiod_fast=50, timeperiod_slow=200)

        # Finalize timeseries
        self.ts, self.start = pf.finalize_timeseries(self.ts, self.start)

        self.tlog = pf.TradeLog(self.symbol)
        self.dbal = pf.DailyBal()

        self._algo()
        self._get_logs()
        self._get_stats()
Beispiel #20
0
    def run(self):
        self._ts = pf.fetch_timeseries(self._symbol)
        self._ts = pf.select_tradeperiod(self._ts,
                                         self._start,
                                         self._end,
                                         use_adj=False)

        # Add technical indicator: 200 day sma
        sma200 = SMA(self._ts, timeperiod=200)
        self._ts['sma200'] = sma200

        # Add technical indicator: X day high, and X day low
        period_high = pd.rolling_max(self._ts.high, self._period)
        period_low = pd.rolling_min(self._ts.low, self._period)
        self._ts['period_high'] = period_high
        self._ts['period_low'] = period_low

        self._tlog = pf.TradeLog()
        self._dbal = pf.DailyBal()

        self._algo()
Beispiel #21
0
    def run(self):
        """
        Run the backtest.

        Don't adjust the start day because that may cause it not
        to match the start date of the strategy you are benchmarking
        against.  Instead, you should pass in the start date calculated
        for the strategy.
        """
        self.ts = pf.fetch_timeseries(self.symbol)
        self.ts = pf.select_tradeperiod(self.ts,
                                        self.start,
                                        self.end,
                                        use_adj=self.use_adj)
        self.ts, _ = pf.finalize_timeseries(self.ts, self.start)

        self.tlog = pf.TradeLog(self.symbol)
        self.dbal = pf.DailyBal()

        self._algo()
        self._get_logs()
        self._get_stats()
Beispiel #22
0
    def run(self):
        self.ts = pf.fetch_timeseries(self.symbol)
        self.ts = pf.select_tradeperiod(self.ts,
                                        self.start,
                                        self.end,
                                        use_adj=False)

        # Add technical indicator: 200 sma regime filter
        self.ts['regime'] = \
            pf.CROSSOVER(self.ts, timeperiod_fast=1, timeperiod_slow=200)

        # Add technical indicator: X day high, and X day low
        period_high = pd.Series(self.ts.close).rolling(self.period).max()
        period_low = pd.Series(self.ts.close).rolling(self.period).min()
        self.ts['period_high'] = period_high
        self.ts['period_low'] = period_low

        self.ts, self.start = pf.finalize_timeseries(self.ts, self.start)

        self.tlog = pf.TradeLog(self.symbol)
        self.dbal = pf.DailyBal()

        self._algo()
Beispiel #23
0
    def run(self):
        self.ts = pf.fetch_timeseries(self.symbol,
                                      use_cache=self.options['use_cache'])
        self.ts = pf.select_tradeperiod(self.ts, self.start, self.end,
                                        self.options['use_adj'])

        # Add technical indicator:  day sma
        self.ts['sma'] = SMA(self.ts, timeperiod=self.options['sma_period'])

        # add S&P500 200 sma regime filter
        ts = pf.fetch_timeseries('^GSPC')
        ts = pf.select_tradeperiod(ts, self.start, self.end, use_adj=False)
        self.ts['regime'] = \
            pf.CROSSOVER(ts, timeperiod_fast=1, timeperiod_slow=200)

        self.ts, self.start = pf.finalize_timeseries(self.ts, self.start)

        self.tlog = pf.TradeLog(self.symbol)
        self.dbal = pf.DailyBal()

        self._algo()
        self._get_logs()
        self._get_stats()
Beispiel #24
0
sma1 = SMA(ts, timeperiod=2)
ts['sma1'] = sma1

sma5 = SMA(ts, timeperiod=5)
ts['sma5'] = sma5

fig = plt.figure()
axes = fig.add_subplot(111, ylabel='Price in $')

ts['close'].plot(ax=axes, label='close', color='k')
ts['sma1'].plot(ax=axes, label='sma1', color='r')
ts['sma5'].plot(ax=axes, label='sma5', color='b')
plt.legend(loc='best')

tlog = pf.TradeLog()
dbal = pf.DailyBal()

cash = capital
shares = 0
start_flag = True

t0 = time.time()

for i in range(len(ts.index)):
    date = ts.index[i]
    high = ts['high'][i]
    low = ts['low'][i]
    close = ts['close'][i]
    sma1 = ts['sma1'][i]
    sma5 = ts['sma5'][i]