def AddInfo(stock, market): stock['sma10'] = techindicators.sma(stock['adj_close'], 10) stock['sma20'] = techindicators.sma(stock['adj_close'], 20) if len(stock['adj_close']) > 100: stock['sma100'] = techindicators.sma(stock['adj_close'], 100) else: stock['sma100'] = np.zeros(len(stock['adj_close'])) if len(stock['adj_close']) > 200: stock['sma200'] = techindicators.sma(stock['adj_close'], 200) else: stock['sma200'] = np.zeros(len(stock['adj_close'])) stock['rstd10'] = techindicators.rstd(stock['adj_close'], 10) stock['rsi10'] = techindicators.rsi(stock['adj_close'], 10) stock['cmf'] = techindicators.cmf(stock['high'], stock['low'], stock['close'], stock['volume'], 10) stock['KeltLower'], stock['KeltCenter'], stock[ 'KeltUpper'] = techindicators.kelt(stock['high'], stock['low'], stock['close'], 20, 2.0, 20) stock['copp'] = techindicators.copp(stock['close'], 14, 11, 10) stock['daily_return'] = stock['adj_close'].pct_change(periods=1) stock['daily_return_stddev14'] = techindicators.rstd( stock['daily_return'], 14) stock['beta'] = techindicators.rollingBetav2(stock, 14, market) stock['alpha'] = techindicators.rollingAlpha(stock, 14, market) #stock['rsquare']=techindicators.rollingRsquare(stock,14) stock['rsquare'] = techindicators.rollingRsquare(stock, 14, spy) stock['sharpe'] = techindicators.sharpe(stock['daily_return'], 30) # generally above 1 is good stock['cci'] = techindicators.cci(stock['high'], stock['low'], stock['close'], 20) stock['stochK'], stock['stochD'] = techindicators.stoch( stock['high'], stock['low'], stock['close'], 14, 3, 3) stock['obv'] = techindicators.obv(stock['adj_close'], stock['volume']) stock['force'] = techindicators.force(stock['adj_close'], stock['volume'], 13) stock['macd'], stock['macdsignal'] = techindicators.macd( stock['adj_close'], 12, 26, 9) stock['market'] = market['adj_close'] stock['corr14'] = stock['adj_close'].rolling(14).corr(spy['market']) #stock['pdmd'],stock['ndmd'],stock['adx']=techindicators.adx(stock['high'],stock['low'],stock['close'],14) #stock['aroonUp'],stock['aroonDown'],stock['aroon']=techindicators.aroon(stock['high'],stock['low'],25) stock['vwap14'] = techindicators.vwap(stock['high'], stock['low'], stock['close'], stock['volume'], 14) stock['vwap10'] = techindicators.vwap(stock['high'], stock['low'], stock['close'], stock['volume'], 10) stock['vwap20'] = techindicators.vwap(stock['high'], stock['low'], stock['close'], stock['volume'], 20) stock['chosc'] = techindicators.chosc(stock['high'], stock['low'], stock['close'], stock['volume'], 3, 10) stock['vwap10diff'] = (stock['adj_close'] - stock['vwap10']) / stock['adj_close'] #stock['max_drawdown'] = stock['adj_close'].rolling(250).apply(max_drawdown) day365 = GetTimeSlot(stock, 365) stock['max_drawdown'] = np.ones(len(stocks)) * zigzag.max_drawdown( day365['adj_close'].values)
def test_rise_fall_rise_drawdown(self): data = np.array([1.0, 1.05, 1.1, 1.0, 0.9, 1.5]) self.assertAlmostEqual(zigzag.max_drawdown(data), 0.18181818181818188)
def test_strictly_decreasing(self): data = np.linspace(100.0, 1.0, 10) self.assertEquals(zigzag.max_drawdown(data), 0.99)