Esempio n. 1
0
 def handle_data(self, data):  # overload handle_data() method
     #print self.day_count
     date = TradingAlgorithm.get_datetime(self)
     self.dates.append(date)
     #print self.portfolio
     #print str(date)[0:10]
     # Get price and trend data
     for sym in sym_list:
         #print self.portfolio
         # Price
         sym_price = data[sym].price
         sym_high = data[sym].high
         sym_low = data[sym].low
         sym_volume = data[sym].volume
         self.prices[sym] = np.append(self.prices[sym],sym_price)
         self.lows[sym] = np.append(self.prices[sym],sym_low)
         self.highs[sym] = np.append(self.prices[sym],sym_high)
         # Volume
         self.volume[sym] = np.append(self.volume[sym],sym_volume)
         # RSI, MACD, Chaikin, MFI
         mfi = self.get_mfi(sym)
         cmf = self.get_chaikin(sym)
         self.chaikin_plot[sym] = np.append(self.chaikin_plot[sym],cmf)
         rsi = self.get_rsi(sym)[-1]
         self.rsi_plot[sym] = np.append(self.rsi_plot[sym],rsi)
         macd, macdsignal, macdhist = self.get_macd(sym)
         # Trend
         trend = self.trend_dfs[sym]['sum'][self.dates[-1]]
         self.trends[sym].append(float(trend))
         # Get gains
         gain = self.trade_gain(sym)
         self.gains[sym] = np.append(self.gains[sym],gain)      
         # Get RS and zscore
         if self.day_count >= window_long:
             rs = self.get_rs
             zscore = self.trend_zscore(sym,date,window_long)
             zscore_s = self.trend_zscore(sym,date,window_short)
             self.zscores[sym].append(zscore)
             self.zscores_s[sym].append(zscore_s)
             # Execute trades
             if self.portfolio.positions[sym].amount == 0 and self.zscores[sym][-1] >= 2 and mfi > 40: # cmf > -0.1 and :# and rsi <= 30: # and cmf > -0.05:
                 #if self.zscores_s[sym][-1] > self.zscores[sym][-1] and self.zscores_s[sym][-2] < self.zscores[sym][-2]:
                  if 1 == 1:
                     self.long(data,sym)
                     print str(date)[0:10],'LONG:',sym
             elif self.portfolio.positions[sym].amount != 0:
                 if sym_price >= self.atr_plot[sym]['profit'][-1] or sym_price <= self.atr_plot[sym]['loss'][-1]:
                     q = self.portfolio.positions[sym].amount
                     self.order(sym,-q)
                     print str(date)[0:10],'Exit:',sym
         else:
             self.zscores[sym].append(0)
             self.zscores_s[sym].append(0)
         atr = self.get_atr(sym)[-1]
         self.atr_plot[sym]['profit'].append((atr*3)+sym_price)
         self.atr_plot[sym]['loss'].append(-(atr*3)+sym_price)
     self.day_count += 1
Esempio n. 2
0
    def handle_data(self, data):  # overload handle_data() method
        day = TradingAlgorithm.get_datetime(self)
        self.dates.append(day)
        #print self.day_count
        #print self.portfolio
        # Get price data
        for sym in sym_list:
            sym_price = data[sym].price
            sym_high = data[sym].high
            sym_low = data[sym].low
            self.prices[sym] = np.append(self.prices[sym], sym_price)
            self.lows[sym] = np.append(self.prices[sym], sym_low)
            self.highs[sym] = np.append(self.prices[sym], sym_high)

        # Execute trades
        for sym in sym_list:
            if self.day_count >= 0:
                atr = self.get_atr(sym)[-1]
                rsi = self.get_rsi(sym)[-1]
                macd, macdsignal, macdhist = self.get_macd(sym)
                slowk, slowd = self.get_stoch(sym)
                #
                if self.portfolio.positions[sym].amount == 0:
                    if macd[-1] > 0 and rsi > 70 and 50 <= slowk[-1] <= 80:
                        print day, ' Long ', sym
                        self.long(data, sym)
                        self.buy_plot[sym].append(self.day_count)
                        take = (atr * 5) + sym_price
                        stop = -(atr * 2) + sym_price
                        self.stops[sym] = [take, stop]
                    elif macd[-1] < 0 and rsi < 30 and 20 <= slowk[-1] <= 50:
                        print day, ' Short ', sym
                        self.short(data, sym)
                        self.sell_plot[sym].append(self.day_count)
                        take = -(atr * 5) + sym_price
                        stop = (atr * 2) + sym_price
                        self.stops[sym] = [take, stop]
                    else:
                        pass
                elif self.portfolio.positions[sym].amount > 0:
                    if sym_price >= self.stops[sym][
                            0] or sym_price <= self.stops[sym][1]:
                        print day, ' Exit Long ', sym
                        q = self.portfolio.positions[sym].amount
                        self.order(sym, -q)
                        self.sell_plot[sym].append(self.day_count)
                elif self.portfolio.positions[sym].amount < 0:
                    if sym_price <= self.stops[sym][
                            0] or sym_price >= self.stops[sym][1]:
                        print day, ' Exit Short ', sym
                        q = self.portfolio.positions[sym].amount
                        self.order(sym, -q)
                        self.buy_plot[sym].append(self.day_count)
        self.day_count += 1
Esempio n. 3
0
 def handle_data(self, data):  # overload handle_data() method
     day = TradingAlgorithm.get_datetime(self)
     self.dates.append(day)
     #print self.day_count
     #print self.portfolio
     # Get price data
     for sym in sym_list:
         sym_price = data[sym].price
         sym_high = data[sym].high
         sym_low = data[sym].low
         self.prices[sym] = np.append(self.prices[sym],sym_price)
         self.lows[sym] = np.append(self.prices[sym],sym_low)
         self.highs[sym] = np.append(self.prices[sym],sym_high)
         
     # Execute trades
     for sym in sym_list:
         if self.day_count >= 0:
             atr = self.get_atr(sym)[-1]
             rsi = self.get_rsi(sym)[-1]
             macd, macdsignal, macdhist = self.get_macd(sym)
             slowk, slowd = self.get_stoch(sym)
             #
             if self.portfolio.positions[sym].amount == 0:
                 if macd[-1] > 0 and rsi > 70 and 50 <= slowk[-1] <= 80:
                     print day,' Long ',sym
                     self.long(data,sym)
                     self.buy_plot[sym].append(self.day_count)
                     take = (atr*5)+sym_price
                     stop = -(atr*2)+sym_price
                     self.stops[sym] = [take,stop]
                 elif macd[-1] < 0 and rsi < 30 and 20 <= slowk[-1] <= 50:
                     print day,' Short ',sym
                     self.short(data,sym)
                     self.sell_plot[sym].append(self.day_count)
                     take = -(atr*5)+sym_price
                     stop = (atr*2)+sym_price
                     self.stops[sym] = [take,stop]
                 else:
                     pass
             elif self.portfolio.positions[sym].amount > 0:
                 if sym_price >= self.stops[sym][0] or sym_price <= self.stops[sym][1]:
                     print day,' Exit Long ',sym
                     q = self.portfolio.positions[sym].amount
                     self.order(sym,-q)
                     self.sell_plot[sym].append(self.day_count)
             elif self.portfolio.positions[sym].amount < 0:
                 if sym_price <= self.stops[sym][0] or sym_price >= self.stops[sym][1]:
                     print day,' Exit Short ',sym
                     q = self.portfolio.positions[sym].amount
                     self.order(sym,-q)
                     self.buy_plot[sym].append(self.day_count)
     self.day_count += 1
Esempio n. 4
0
 def handle_data(self, data):  # overload handle_data() method
     #print self.day_count
     date = TradingAlgorithm.get_datetime(self)
     self.dates.append(date)
     #print self.portfolio
     #print str(date)[0:10]
     # Get price and trend data
     for sym in sym_list:
         # Price
         sym_price = data[sym].price
         sym_high = data[sym].high
         sym_low = data[sym].low
         self.prices[sym] = np.append(self.prices[sym], sym_price)
         self.lows[sym] = np.append(self.prices[sym], sym_low)
         self.highs[sym] = np.append(self.prices[sym], sym_high)
         # RSI, MACD
         rsi = self.get_rsi(sym)[-1]
         macd, macdsignal, macdhist = self.get_macd(sym)
         # Trend
         trend = self.trend_df[sym][self.dates[-1]]
         self.trends[sym].append(float(trend))
         # Get RS and zscore
         if self.day_count >= window:
             rs = self.get_rs
             zscore = self.trend_zscore(sym, date)
             self.zscores[sym].append(zscore)
             # Execute trades
             if self.portfolio.positions[sym].amount == 0 and zscore >= 3:
                 self.long(data, sym)
                 print str(date)[0:10], 'LONG:', sym
             elif self.portfolio.positions[sym].amount != 0:
                 if sym_price >= self.atr_plot[sym]['profit'][
                         -1] or sym_price <= self.atr_plot[sym]['loss'][-1]:
                     q = self.portfolio.positions[sym].amount
                     self.order(sym, -q)
                     print str(date)[0:10], 'Exit:', sym
         else:
             self.zscores[sym].append(0)
         atr = self.get_atr(sym)[-1]
         self.atr_plot[sym]['profit'].append((atr * 3) + sym_price)
         self.atr_plot[sym]['loss'].append(-(atr * 1.5) + sym_price)
     self.day_count += 1
Esempio n. 5
0
 def place_orders(self, data, sym, etf, sym_price, etf_price, zscore):
     ####################################################################
     day = TradingAlgorithm.get_datetime(self)
     # Buy spread if z-score is > 2, sell if z-score < .5.
     etf = sym_list[sym]
     sym_price = data[sym].price
     etf_price = data[etf].price
     if zscore >= 2 and self.portfolio.positions[sym].amount == 0:
         sym_quantity = -int(trade_size / sym_price)
         etf_quantity = int(trade_size / etf_price)
         self.order(sym, sym_quantity)
         self.order(etf, etf_quantity)
         self.trade_log[sym] = self.trade_log[sym] + 1
         action = 'SELL'
         self.set_log(day, sym, etf, zscore, action,
                      (sym_price - etf_price))
     elif zscore <= -2 and self.portfolio.positions[sym].amount == 0:
         sym_quantity = int(trade_size / sym_price)
         etf_quantity = -int(trade_size / etf_price)
         self.order(sym, sym_quantity)
         self.order(etf, etf_quantity)
         self.trade_log[sym] = self.trade_log[sym] + 1
         action = 'BUY'
         self.set_log(day, sym, etf, zscore, action,
                      (sym_price - etf_price))
     elif abs(zscore) < .5 and self.portfolio.positions[sym].amount != 0:
         etf_amount = self.portfolio.positions[etf].amount
         self.order(etf, -1 * etf_amount)
         sym_amount = self.portfolio.positions[sym].amount
         self.order(sym, -1 * sym_amount)
         if sym_amount > 0:
             action = 'SELL'
             self.set_log(day, sym, etf, zscore, action,
                          (sym_price - etf_price))
         else:
             action = 'BUY'
             self.set_log(day, sym, etf, zscore, action,
                          (sym_price - etf_price))
     else:
         action = '---'
     self.actions[sym]['ACTION'].append(action)
     return
Esempio n. 6
0
    def handle_data(self, data):
        ####################################################################
        day = TradingAlgorithm.get_datetime(self)
        self.dates.append(day)
        print self.dates[-1]
        #print 'Progress: ' + str(PerformanceTracker.to_dict(self))
        ####################################################################
        # Get the prices and do some calculations
        for sym in sym_list:
            etf = sym_list[sym]
            sym_price = data[sym].price
            etf_price = data[etf].price
            ratio = sym_price - etf_price
            self.trade_return(sym, ratio)
            self.ratios[sym]['SPREAD'].append(ratio)
        ####################################################################
        # Calculate the trade return for analysis purposes

        ####################################################################
        # Trade related calculations loop
        self.day_count += 1
        for sym in sym_list:
            etf = sym_list[sym]
            sym_price = data[sym].price
            etf_price = data[etf].price
            ################################################################
            # 1. Compute regression coefficients between the two instruments
            params = self.ols_transform.handle_data(data, sym, etf)
            if params is None:  # Exits before
                for sym in sym_list:  # place_orders
                    self.zscores[sym]['ZSCORE'].append(0)
                    action = '---'
                    self.actions[sym]['ACTION'].append(action)
                return
            intercept, slope = params
            ################################################################
            # 2. Compute spread and z-score
            zscore = self.compute_zscore(data, sym, etf, sym_price, etf_price,
                                         slope, intercept)
            ################################################################
            # 3. Place orders
            self.place_orders(data, sym, etf, sym_price, etf_price, zscore)
Esempio n. 7
0
 def handle_data(self, data):  # overload handle_data() method
     print self.day_count
     print self.portfolio
     month = int(str(TradingAlgorithm.get_datetime(self))[5:7])
     # Get price data
     spy_price = data[index].price
     self.prices[index].append(spy_price)
     for sym in sym_list:
         sym_price = data[sym].price
         self.prices[sym].append(sym_price)
     # Execute trades
     if len(self.dates) < spy_window or len(self.dates) < window:
         pass
     else:
         spySMA = self.spy_sma()
         if self.last_order == 0 or self.day_count >= self.last_order+22:
             # Exit existing positions
             for sym in feed:
                 if self.portfolio.positions[sym].amount != 0:
                     q = self.portfolio.positions[sym].amount
                     self.order(sym,-q)
             if spy_price > spySMA:
                 # Enter new position
                 self.get_rs(data)
                 sorted_rs = sorted(self.rs_list.iteritems(), key=operator.itemgetter(1))
                 print sorted_rs
                 #print 'SHORT: ', sorted_rs[0][0], sorted_rs[1][0], sorted_rs[2][0]
                 #print 'LONG: ', sorted_rs[-3][0], sorted_rs[-2][0], sorted_rs[-1][0]
                 #self.short(data,sorted_rs[0][0])
                 #self.short(data,'SPY')
                 #self.short(data,sorted_rs[1][0])
                 #self.short(data,sorted_rs[2][0])
                 self.long(data,sorted_rs[-1][0])
                 self.long(data,sorted_rs[-2][0])
                 #self.long(data,sorted_rs[-3][0])
                 self.last_order = self.day_count
             else:
                 pass
         else:
             pass
     self.dates.append(month)
     self.day_count += 1
Esempio n. 8
0
 def handle_data(self, data):  # overload handle_data() method
     #print self.day_count
     date = TradingAlgorithm.get_datetime(self)
     self.dates.append(date)
     #print self.portfolio
     #print str(date)[0:10]
     # Get price and trend data
     for sym in sym_list:
         # Price
         sym_price = data[sym].price
         sym_high = data[sym].high
         sym_low = data[sym].low
         self.prices[sym] = np.append(self.prices[sym],sym_price)
         self.lows[sym] = np.append(self.prices[sym],sym_low)
         self.highs[sym] = np.append(self.prices[sym],sym_high)
         # RSI, MACD
         rsi = self.get_rsi(sym)[-1]
         macd, macdsignal, macdhist = self.get_macd(sym)
         # Trend
         trend = self.trend_df[sym][self.dates[-1]]
         self.trends[sym].append(float(trend))      
         # Get RS and zscore
         if self.day_count >= window:
             rs = self.get_rs
             zscore = self.trend_zscore(sym,date)
             self.zscores[sym].append(zscore)
             # Execute trades
             if self.portfolio.positions[sym].amount == 0 and zscore >= 3:
                 self.long(data,sym)
                 print str(date)[0:10],'LONG:',sym
             elif self.portfolio.positions[sym].amount != 0:
                 if sym_price >= self.atr_plot[sym]['profit'][-1] or sym_price <= self.atr_plot[sym]['loss'][-1]:
                     q = self.portfolio.positions[sym].amount
                     self.order(sym,-q)
                     print str(date)[0:10],'Exit:',sym
         else:
             self.zscores[sym].append(0)
         atr = self.get_atr(sym)[-1]
         self.atr_plot[sym]['profit'].append((atr*3)+sym_price)
         self.atr_plot[sym]['loss'].append(-(atr*1.5)+sym_price)
     self.day_count += 1
Esempio n. 9
0
 def handle_data(self, data):
     ####################################################################
     day = TradingAlgorithm.get_datetime(self)
     self.dates.append(day)
     print self.dates[-1]
     #print 'Progress: ' + str(PerformanceTracker.to_dict(self))
     ####################################################################
     # Get the prices and do some calculations
     for sym in sym_list:
         etf = sym_list[sym]
         sym_price = data[sym].price
         etf_price = data[etf].price
         ratio = sym_price - etf_price
         self.trade_return(sym, ratio)
         self.ratios[sym]['SPREAD'].append(ratio)
     ####################################################################
     # Calculate the trade return for analysis purposes
         
     ####################################################################
     # Trade related calculations loop
     self.day_count += 1
     for sym in sym_list:
         etf = sym_list[sym]
         sym_price = data[sym].price
         etf_price = data[etf].price
         ################################################################
         # 1. Compute regression coefficients between the two instruments
         params = self.ols_transform.handle_data(data, sym, etf)
         if params is None:                                # Exits before
             for sym in sym_list:                          # place_orders
                 self.zscores[sym]['ZSCORE'].append(0)
                 action = '---'
                 self.actions[sym]['ACTION'].append(action)
             return
         intercept, slope = params
         ################################################################
         # 2. Compute spread and z-score
         zscore = self.compute_zscore(data, sym, etf, sym_price, etf_price, slope, intercept)
         ################################################################
         # 3. Place orders
         self.place_orders(data, sym, etf, sym_price, etf_price, zscore)
Esempio n. 10
0
 def handle_data(self, data):  # overload handle_data() method
     day = TradingAlgorithm.get_datetime(self)
     self.dates.append(day)
     #print self.day_count
     #print self.portfolio
     # Get price data
     for sym in sym_list:
         sym_price = data[sym].price
         self.prices[sym] = np.append(self.prices[sym],sym_price)
     # Execute trades
     for sym in sym_list:
         if self.day_count >=  30:
             rsi = self.get_rsi(sym)[-1]
             trending = self.get_vratio(sym)
             t = self.get_ttest(sym)
             rs = self.get_rs(sym)
             #
             if self.portfolio.positions[sym].amount == 0:
                 if trending == True and t == True and rs > 0 and rsi < 70:
                     print day,' Long ',sym
                     self.long(data,sym)
                     self.buy_plot[sym].append(self.day_count)
                 elif trending == True and t == True and rs < 0 and rsi > 30:
                     print day,' Short ',sym
                     self.short(data,sym)
                     self.sell_plot[sym].append(self.day_count)
                 else:
                     pass
             elif self.portfolio.positions[sym].amount > 0 and rsi >70:
                 print day,' Exit Long ',sym
                 q = self.portfolio.positions[sym].amount
                 self.order(sym,-q)
                 self.sell_plot[sym].append(self.day_count)
             elif self.portfolio.positions[sym].amount < 0 and rsi < 30:
                 print day,' Exit Short ',sym
                 q = self.portfolio.positions[sym].amount
                 self.order(sym,-q)
                 self.buy_plot[sym].append(self.day_count)
         else:
             self.vratio_plot[sym] = np.append(self.vratio_plot[sym],0)
     self.day_count += 1
Esempio n. 11
0
 def place_orders(self, data, sym, etf, sym_price, etf_price, zscore):
     ####################################################################
     day = TradingAlgorithm.get_datetime(self)
     # Buy spread if z-score is > 2, sell if z-score < .5.
     etf = sym_list[sym]
     sym_price = data[sym].price
     etf_price = data[etf].price
     if zscore >= 2 and self.portfolio.positions[sym].amount == 0:
         sym_quantity = -int(trade_size / sym_price)
         etf_quantity = int(trade_size / etf_price)
         self.order(sym, sym_quantity)
         self.order(etf, etf_quantity)
         self.trade_log[sym] = self.trade_log[sym] + 1
         action = 'SELL'
         self.set_log(day, sym, etf, zscore, action, (sym_price-etf_price))
     elif zscore <= -2 and self.portfolio.positions[sym].amount == 0:
         sym_quantity = int(trade_size / sym_price)
         etf_quantity = -int(trade_size / etf_price)
         self.order(sym, sym_quantity)
         self.order(etf, etf_quantity)
         self.trade_log[sym] = self.trade_log[sym] + 1
         action = 'BUY'
         self.set_log(day, sym, etf, zscore, action, (sym_price-etf_price))
     elif abs(zscore) < .5 and self.portfolio.positions[sym].amount != 0:
         etf_amount = self.portfolio.positions[etf].amount
         self.order(etf, -1 * etf_amount)
         sym_amount = self.portfolio.positions[sym].amount
         self.order(sym, -1 * sym_amount)
         if sym_amount > 0:
             action = 'SELL'
             self.set_log(day, sym, etf, zscore, action, (sym_price-etf_price))
         else:
             action = 'BUY'
             self.set_log(day, sym, etf, zscore, action, (sym_price-etf_price))
     else:
         action = '---'
     self.actions[sym]['ACTION'].append(action)
     return