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()
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()
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()
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()
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()
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
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()
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)
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()
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()
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()
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()
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()
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()
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)
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()
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()
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()
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()
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()
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()
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()
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()
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]