Untitled
unknown
plain_text
a year ago
55 kB
6
Indexable
@jit(nopython=True) def simple_backtest_opposite(sig, item_id_changed, signal_times, bidprice, askprice, loss_thres, serial_incr, timelimit, quantity_risk, risk, reward, initial_nav, quantity_maxrisk, ls, minq = 5, fixed_quantity = False): """ Performs a simple financial backtesting simulation based on given trading signals and prices, adjusting positions according to specified trading rules, loss thresholds, and profit targets. Parameters: sig (numpy.ndarray): Array of trading signals where 1 indicates a long signal and -1 indicates a short signal. item_id_changed (numpy.ndarray): Array indicating whether the item ID has changed, triggering a closeout of positions. signal_times (numpy.ndarray): Array of timestamps for each trading signal. bidprice (numpy.ndarray): Array of bid prices for the trading instrument. askprice (numpy.ndarray): Array of ask prices for the trading instrument. loss_thres (float): Threshold for loss at which positions should be closed to stop further loss. serial_incr (int): Increment value for the serial number used in tracking trades. timelimit (int): Time limit after which positions should be closed if no other conditions are met. stop_loss (float): Stop loss level at which a position should be closed to limit losses. profit_target (float): Target profit level at which a position should be closed to realize gains. initial_quantity (int): Initial quantity of the instrument to be traded on receiving a trading signal. Returns: tuple: Contains multiple arrays including: - signal (numpy.ndarray): Updated signals after processing. - sig (numpy.ndarray): Original signals received. - quantity (numpy.ndarray): Array showing the quantity of instrument held over time. - tradeprice_leg1 (numpy.ndarray): Trading price for the first leg. - case (numpy.ndarray): Array of integers indicating the case scenario applied at each step. - return_since_signal (numpy.ndarray): Returns calculated since the last signal. - serial (numpy.ndarray): Serial numbers for trades. - traded_price_leg1 (numpy.ndarray): Actual traded prices after including transaction costs. - compounded_return_since_signal (numpy.ndarray): Compounded returns since the last trading signal. - time_since_signal (numpy.ndarray): Time elapsed since the last trading signal. - total_nav (numpy.ndarray): Net asset value over time. - crystallised_return (numpy.ndarray): Realized returns over the trading period. - short_signal_on_array (numpy.ndarray): Array indicating periods with active short positions. - long_signal_on_array (numpy.ndarray): Array indicating periods with active long positions. """ time_limit = timelimit loss_threshold = loss_thres serial_incr = serial_incr lotsize1 = ls txn_cost = 0.0 # 833 case = np.empty(bidprice.shape) signal = np.empty(bidprice.shape) short_signal_on_array = np.empty(bidprice.shape) long_signal_on_array = np.empty(bidprice.shape) quantity = np.empty(bidprice.shape) maxquantity = np.empty(bidprice.shape) serial = np.empty(bidprice.shape) q1 = np.empty(bidprice.shape) sl = np.empty(bidprice.shape) tp = np.empty(bidprice.shape) signal_price_leg1 = np.empty(bidprice.shape) tradeprice_leg1 = np.empty(bidprice.shape) traded_price_leg1 = np.empty(bidprice.shape) time_since_signal = np.empty(bidprice.shape) return_since_signal = np.empty(bidprice.shape) compounded_return_since_signal = np.empty(bidprice.shape) crystallised_quantity = np.empty(bidprice.shape) crystallised_return = np.empty(bidprice.shape) total_nav = np.empty(bidprice.shape) traded_nav1 = np.empty(bidprice.shape) short_signal_on = False long_signal_on = False short_signal_on_array[0] = 0 long_signal_on_array[0] = 0 signal[0] = 0 quantity[0] = 0 maxquantity[0] = 0 q1[0]=0 tp[0] = 0 sl[0] = 0 time_since_signal[0] = 0 return_since_signal[0] = 0 compounded_return_since_signal[0] = 0 crystallised_quantity[0] = 0 crystallised_return[0] = 0 total_nav[0] = initial_nav traded_nav1[0] = 0 if bidprice[0] != 0: tradeprice_leg1[0] = bidprice[0] signal_price_leg1[0] = bidprice[0] traded_price_leg1[0] = bidprice[0] else: tradeprice_leg1[0] = 0 signal_price_leg1[0] = 0 traded_price_leg1[0] = 0 for i in range(1,len(bidprice)): case1long = (sig[i] == 1 and long_signal_on==False and short_signal_on==False) case2long = (sig[i] == 1 and long_signal_on==True and short_signal_on==False) case1short = (sig[i] == -1 and long_signal_on==False and short_signal_on==False) case2short = (sig[i] == -1 and long_signal_on==False and short_signal_on==True) if long_signal_on: casecloseloss = (bidprice[i] <= sl[i-1]) caseclosetp = (bidprice[i] >= tp[i-1]) elif short_signal_on: casecloseloss = (askprice[i] >= sl[i-1]) caseclosetp = (askprice[i] <= tp[i-1]) closingbeforeexpiry = (item_id_changed[i] == 1) if signal_times[i] == 1: if case1long: if quantity[i-1] == 0: case[i] = 5 signal[i] = 1 long_signal_on = True short_signal_on = False serial[i] = 1 time_since_signal[i] = 1 signal_price_leg1[i] = askprice[i] traded_price_leg1[i] = askprice[i] * (1 + txn_cost) tradeprice_leg1[i] = traded_price_leg1[i] if fixed_quantity: quantity[i] = minq maxquantity[i] = minq else: quantity[i], maxquantity[i], tp[i], sl[i] = define_q_and_tp(1, askprice[i], quantity_risk, risk, reward, total_nav[i-1], quantity_maxrisk, minq) return_since_signal[i] = (quantity[i]*((bidprice[i] - traded_price_leg1[i]))*lotsize1) traded_nav1[i] = total_nav[i-1] crystallised_return[i] = 0 compounded_return_since_signal[i] = crystallised_return[i] + return_since_signal[i] total_nav[i] = total_nav[i-1] + crystallised_return[i] + return_since_signal[i] - return_since_signal[i-1] short_signal_on_array[i] = np.where(short_signal_on == False, 0, 1) long_signal_on_array[i] = np.where(long_signal_on == False, 0, 1) elif quantity[i-1] > 0: raise KeyError if ((askprice[i] - traded_price_leg1[i-1])/traded_price_leg1[i-1]) < -loss_threshold: signal_price_leg1[i] = askprice[i] traded_price_leg1[i] = askprice[i] * (1 + txn_cost) tradeprice_leg1[i] = traded_price_leg1[i] traded_nav1[i] = traded_nav1[i-1] serial[i] = serial[i-1] + serial_incr time_since_signal[i] = time_since_signal[i-1] + 1 q1[i] = 5 if abs(quantity[i-1]) >= maxquantity: quantity[i] = quantity[i-1] else: quantity[i] = quantity[i-1] + q1[i] case[i] = 6 crystallised_return[i] = (quantity[i-1]*((traded_price_leg1[i] - traded_price_leg1[i-1]))*lotsize1) short_signal_on = False long_signal_on = True signal[i] = 1 return_since_signal[i] = (quantity[i]*((bidprice[i] - traded_price_leg1[i]))*lotsize1) compounded_return_since_signal[i] = crystallised_return[i] + return_since_signal[i] total_nav[i] = total_nav[i-1] + crystallised_return[i] + return_since_signal[i] - return_since_signal[i-1] short_signal_on_array[i] = np.where(short_signal_on == False, 0, 1) long_signal_on_array[i] = np.where(long_signal_on == False, 0, 1) else: serial[i] = serial[i-1] time_since_signal[i] = time_since_signal[i-1] + 1 quantity[i] = quantity[i-1] traded_nav1[i] = traded_nav1[i-1] signal_price_leg1[i] = signal_price_leg1[i-1] traded_price_leg1[i] = traded_price_leg1[i-1] tradeprice_leg1[i] = askprice[i] short_signal_on = False long_signal_on = True signal[i] = 1 case[i] = 7 return_since_signal[i] = (quantity[i]*((bidprice[i] - traded_price_leg1[i]))*lotsize1) crystallised_return[i] = 0 compounded_return_since_signal[i] = crystallised_return[i] + return_since_signal[i] total_nav[i] = total_nav[i-1] + crystallised_return[i] + return_since_signal[i] - return_since_signal[i-1] short_signal_on_array[i] = np.where(short_signal_on == False, 0, 1) long_signal_on_array[i] = np.where(long_signal_on == False, 0, 1) else: raise KeyError serial[i] = serial[i-1] time_since_signal[i] = time_since_signal[i-1] + 1 quantity[i] = quantity[i-1] traded_nav1[i] = traded_nav1[i-1] signal_price_leg1[i] = signal_price_leg1[i-1] traded_price_leg1[i] = traded_price_leg1[i-1] tradeprice_leg1[i] = askprice[i] short_signal_on = False long_signal_on = True signal[i] = 0 case[i] = 8 return_since_signal[i] = (quantity[i]*((bidprice[i] - traded_price_leg1[i]))*lotsize1) crystallised_return[i] = 0 compounded_return_since_signal[i] = crystallised_return[i] + return_since_signal[i] total_nav[i] = total_nav[i-1] + crystallised_return[i] + return_since_signal[i] - return_since_signal[i-1] short_signal_on_array[i] = np.where(short_signal_on == False, 0, 1) long_signal_on_array[i] = np.where(long_signal_on == False, 0, 1) elif case2long: if quantity[i-1] == 0: raise KeyError long_signal_on = True short_signal_on = False serial[i] = 1 time_since_signal[i] = 1 quantity[i] = initial_quantity traded_nav1[i] = total_nav[i-1] signal_price_leg1[i] = askprice[i] traded_price_leg1[i] = askprice[i] * (1 + txn_cost) tradeprice_leg1[i] = traded_price_leg1[i] signal[i] = 1 case[i] = 5 return_since_signal[i] = (quantity[i]*((bidprice[i] - traded_price_leg1[i]))*lotsize1) # lotsize? crystallised_return[i] = 0 compounded_return_since_signal[i] = crystallised_return[i] + return_since_signal[i] total_nav[i] = total_nav[i-1] + crystallised_return[i] + return_since_signal[i] - return_since_signal[i-1] short_signal_on_array[i] = np.where(short_signal_on == False, 0, 1) long_signal_on_array[i] = np.where(long_signal_on == False, 0, 1) elif quantity[i-1] > 0: if casecloseloss or caseclosetp: case[i]=34 signal[i] = 0 short_signal_on = False long_signal_on = False serial[i] = 0 time_since_signal[i] = 0 signal_price_leg1[i] = signal_price_leg1[i-1] traded_price_leg1[i] = bidprice[i]*(1-txn_cost) tradeprice_leg1[i] = traded_price_leg1[i] traded_nav1[i] = traded_nav1[i - 1] quantity[i] = 0 maxquantity[i] = 0 sl[i] = 0 tp[i] = 0 return_since_signal[i] = 0 crystallised_return[i] = (quantity[i-1]*((traded_price_leg1[i] - traded_price_leg1[i-1]))*lotsize1) compounded_return_since_signal[i] = crystallised_return[i] + return_since_signal[i] total_nav[i] = total_nav[i-1] + crystallised_return[i] + return_since_signal[i] - return_since_signal[i-1] short_signal_on_array[i] = np.where(short_signal_on == False, 0, 1) long_signal_on_array[i] = np.where(long_signal_on == False, 0, 1) elif (((bidprice[i] - traded_price_leg1[i-1])/traded_price_leg1[i-1])) < -loss_threshold: case[i] = 6 signal[i] = 1 short_signal_on = False long_signal_on = True signal_price_leg1[i] = askprice[i] traded_price_leg1[i] = askprice[i] * (1 + txn_cost) tradeprice_leg1[i] = traded_price_leg1[i] traded_nav1[i] = traded_nav1[i-1] serial[i] = serial[i-1] + serial_incr time_since_signal[i] = time_since_signal[i-1] + 1 q1[i] = minq if abs(quantity[i-1]) >= maxquantity[i-1]: quantity[i] = quantity[i-1] else: quantity[i] = quantity[i-1] + q1[i] sl[i] = sl[i - 1] tp[i] = tp[i - 1] maxquantity[i] = maxquantity[i - 1] crystallised_return[i] = (quantity[i-1]*((traded_price_leg1[i] - traded_price_leg1[i-1]))*lotsize1) return_since_signal[i] = (quantity[i]*((bidprice[i] - traded_price_leg1[i]))*lotsize1) compounded_return_since_signal[i] = crystallised_return[i] + return_since_signal[i] total_nav[i] = total_nav[i-1] + crystallised_return[i] + return_since_signal[i] - return_since_signal[i-1] short_signal_on_array[i] = np.where(short_signal_on == False, 0, 1) long_signal_on_array[i] = np.where(long_signal_on == False, 0, 1) else: serial[i] = serial[i-1] time_since_signal[i] = time_since_signal[i-1] + 1 quantity[i] = quantity[i-1] traded_nav1[i] = traded_nav1[i-1] sl[i] = sl[i-1] tp[i] = tp[i-1] maxquantity[i] =maxquantity[i-1] signal_price_leg1[i] = signal_price_leg1[i-1] traded_price_leg1[i] = traded_price_leg1[i-1] tradeprice_leg1[i] = bidprice[i] short_signal_on = False long_signal_on = True signal[i] = 1 case[i] = 7 return_since_signal[i] = (quantity[i]*((bidprice[i] - traded_price_leg1[i]))*lotsize1) crystallised_return[i] = 0 compounded_return_since_signal[i] = crystallised_return[i] + return_since_signal[i] total_nav[i] = total_nav[i-1] + crystallised_return[i] + return_since_signal[i] - return_since_signal[i-1] short_signal_on_array[i] = np.where(short_signal_on == False, 0, 1) long_signal_on_array[i] = np.where(long_signal_on == False, 0, 1) else: raise KeyError serial[i] = serial[i-1] time_since_signal[i] = time_since_signal[i-1] + 1 traded_nav1[i] = traded_nav1[i-1] quantity[i] = quantity[i-1] signal_price_leg1[i] = signal_price_leg1[i-1] traded_price_leg1[i] = traded_price_leg1[i-1] tradeprice_leg1[i] = askprice[i] short_signal_on = False long_signal_on = True signal[i] = 0 case[i] = 8 return_since_signal[i] = (quantity[i]*((bidprice[i] - traded_price_leg1[i]))*lotsize1) crystallised_return[i] = 0 compounded_return_since_signal[i] = crystallised_return[i] + return_since_signal[i] total_nav[i] = total_nav[i-1] + crystallised_return[i] + return_since_signal[i] - return_since_signal[i-1] short_signal_on_array[i] = np.where(short_signal_on == False, 0, 1) long_signal_on_array[i] = np.where(long_signal_on == False, 0, 1) elif case1short: if quantity[i-1] == 0: temp_signal[i] = 0 serial[i] = 1 time_since_signal[i] = 1 q1[i] = 5 traded_nav1[i] = total_nav[i-1] signal_price_leg1[i] = bidprice[i] traded_price_leg1[i] = bidprice[i]*(1-txn_cost) tradeprice_leg1[i] = traded_price_leg1[i] short_signal_on = True long_signal_on = False signal[i] = -1 if fixed_quantity: quantity[i] = -5 maxquantity[i] = -minq else: quantity[i], maxquantity[i], tp[i], sl[i] = define_q_and_tp(-1, bidprice[i], quantity_risk, risk, reward, total_nav[i-1], quantity_maxrisk, minq) return_since_signal[i] = (quantity[i]*((askprice[i] - traded_price_leg1[i]))*lotsize1) crystallised_return[i] = 0 compounded_return_since_signal[i] = crystallised_return[i] + return_since_signal[i] case[i] = 13 total_nav[i] = total_nav[i-1] + crystallised_return[i] + return_since_signal[i] - return_since_signal[i-1] short_signal_on_array[i] = np.where(short_signal_on == False, 0, 1) long_signal_on_array[i] = np.where(long_signal_on == False, 0, 1) elif quantity[i-1] < 0: raise KeyError if (((bidprice[i] - traded_price_leg1[i-1])/traded_price_leg1[i-1])*-1) < -loss_threshold: signal_price_leg1[i] = bidprice[i] traded_price_leg1[i] = bidprice[i]*(1-txn_cost) tradeprice_leg1[i] = traded_price_leg1[i] temp_signal[i] = 0 traded_nav1[i] = traded_nav1[i-1] serial[i] = serial[i-1] + serial_incr time_since_signal[i] = time_since_signal[i-1] + 1 q1[i] = -5 if abs(quantity[i-1]) >= maxquantity: quantity[i] = quantity[i-1] else: quantity[i] = quantity[i-1] + q1[i] case[i] = 14 crystallised_return[i] = (quantity[i-1]*((traded_price_leg1[i] - traded_price_leg1[i-1]))*lotsize1) short_signal_on = True long_signal_on = False signal[i] = -1 return_since_signal[i] = (quantity[i]*((askprice[i] - traded_price_leg1[i]))*lotsize1) compounded_return_since_signal[i] = crystallised_return[i] + return_since_signal[i] total_nav[i] = total_nav[i-1] + crystallised_return[i] + return_since_signal[i] - return_since_signal[i-1] short_signal_on_array[i] = np.where(short_signal_on == False, 0, 1) long_signal_on_array[i] = np.where(long_signal_on == False, 0, 1) else: serial[i] = serial[i-1] time_since_signal[i] = time_since_signal[i-1] + 1 quantity[i] = quantity[i-1] temp_signal[i] = 0 traded_nav1[i] = traded_nav1[i-1] signal_price_leg1[i] = signal_price_leg1[i-1] traded_price_leg1[i] = traded_price_leg1[i-1] tradeprice_leg1[i] = bidprice[i] short_signal_on = True long_signal_on = False signal[i] = -1 case[i] = 15 return_since_signal[i] = (quantity[i]*((askprice[i] - traded_price_leg1[i]))*lotsize1) crystallised_return[i] = 0 compounded_return_since_signal[i] = crystallised_return[i] + return_since_signal[i] total_nav[i] = total_nav[i-1] + crystallised_return[i] + return_since_signal[i] - return_since_signal[i-1] short_signal_on_array[i] = np.where(short_signal_on == False, 0, 1) long_signal_on_array[i] = np.where(long_signal_on == False, 0, 1) else: raise KeyError serial[i] = 0 time_since_signal[i] = 0 quantity[i] = 0 temp_signal[i] = -1 traded_nav1[i] = traded_nav1[i-1] signal_price_leg1[i] = 0 traded_price_leg1[i] = 0 tradeprice_leg1[i] = 0 short_signal_on = False long_signal_on = False signal[i] = 0 case[i] = 16 return_since_signal[i] = 0 crystallised_return[i] = 0 compounded_return_since_signal[i] = 0 total_nav[i] = total_nav[i-1] + crystallised_return[i] + return_since_signal[i] - return_since_signal[i-1] short_signal_on_array[i] = np.where(short_signal_on == False, 0, 1) long_signal_on_array[i] = np.where(long_signal_on == False, 0, 1) elif case2short: if quantity[i-1] == 0: raise KeyError temp_signal[i] = 0 serial[i] = 1 time_since_signal[i] = 1 q1[i] = 5 quantity[i] = initial_quantity * -1 traded_nav1[i] = total_nav[i-1] signal_price_leg1[i] = bidprice[i] traded_price_leg1[i] = bidprice[i]*(1-txn_cost) tradeprice_leg1[i] = traded_price_leg1[i] short_signal_on = True long_signal_on = False signal[i] = -1 return_since_signal[i] = (quantity[i]*((askprice[i] - traded_price_leg1[i]))*lotsize1) crystallised_return[i] = 0 compounded_return_since_signal[i] = crystallised_return[i] + return_since_signal[i] case[i] = 13 total_nav[i] = total_nav[i-1] + crystallised_return[i] + return_since_signal[i] - return_since_signal[i-1] short_signal_on_array[i] = np.where(short_signal_on == False, 0, 1) long_signal_on_array[i] = np.where(long_signal_on == False, 0, 1) elif quantity[i-1] < 0: if casecloseloss or caseclosetp: serial[i] = 0 time_since_signal[i] = 0 temp_signal[i] = 0 traded_nav1[i] = traded_nav1[i-1] quantity[i] = 0 signal_price_leg1[i] = signal_price_leg1[i-1] traded_price_leg1[i] = askprice[i]*(1+txn_cost) tradeprice_leg1[i] = traded_price_leg1[i] short_signal_on = False long_signal_on = False signal[i] = 0 case[i] = 38 return_since_signal[i] = 0 sl[i] = 0 tp[i] = 0 maxquantity[i] = 0 crystallised_return[i] = (quantity[i-1]*((traded_price_leg1[i] - traded_price_leg1[i-1]))*lotsize1) compounded_return_since_signal[i] = crystallised_return[i] + return_since_signal[i] total_nav[i] = total_nav[i-1] + crystallised_return[i] + return_since_signal[i] - return_since_signal[i-1] short_signal_on_array[i] = np.where(short_signal_on == False, 0, 1) long_signal_on_array[i] = np.where(long_signal_on == False, 0, 1) elif (((askprice[i] - traded_price_leg1[i-1])/traded_price_leg1[i-1])*-1) < -loss_threshold: signal_price_leg1[i] = bidprice[i] traded_price_leg1[i] = bidprice[i]*(1-txn_cost) tradeprice_leg1[i] = traded_price_leg1[i] temp_signal[i] = 0 traded_nav1[i] = traded_nav1[i-1] tp[i], serial[i] = serial[i-1] + serial_incr time_since_signal[i] = time_since_signal[i-1] + 1 q1[i] = -5 if abs(quantity[i-1]) >= maxquantity: quantity[i] = quantity[i-1] else: quantity[i] = quantity[i-1] + q1[i] case[i] = 14 sl[i] = sl[i-1] tp[i] = tp[i-1] maxquantity[i] =maxquantity[i-1] crystallised_return[i] = (quantity[i-1]*((traded_price_leg1[i] - traded_price_leg1[i-1]))*lotsize1) short_signal_on = True long_signal_on = False signal[i] = -1 return_since_signal[i] = (quantity[i]*((askprice[i] - traded_price_leg1[i]))*lotsize1) compounded_return_since_signal[i] = crystallised_return[i] + return_since_signal[i] total_nav[i] = total_nav[i-1] + crystallised_return[i] + return_since_signal[i] - return_since_signal[i-1] short_signal_on_array[i] = np.where(short_signal_on == False, 0, 1) long_signal_on_array[i] = np.where(long_signal_on == False, 0, 1) else: serial[i] = serial[i-1] time_since_signal[i] = time_since_signal[i-1] + 1 quantity[i] = quantity[i-1] temp_signal[i] = 0 signal_price_leg1[i] = signal_price_leg1[i-1] traded_price_leg1[i] = traded_price_leg1[i-1] tradeprice_leg1[i] = askprice[i] short_signal_on = True long_signal_on = False signal[i] = -1 traded_nav1[i] = traded_nav1[i-1] sl[i] = sl[i-1] tp[i] = tp[i-1] maxquantity[i] =maxquantity[i-1] case[i] = 15 return_since_signal[i] = (quantity[i]*((askprice[i] - traded_price_leg1[i]))*lotsize1) crystallised_return[i] = 0 compounded_return_since_signal[i] = crystallised_return[i] + return_since_signal[i] total_nav[i] = total_nav[i-1] + crystallised_return[i] + return_since_signal[i] - return_since_signal[i-1] short_signal_on_array[i] = np.where(short_signal_on == False, 0, 1) long_signal_on_array[i] = np.where(long_signal_on == False, 0, 1) else: raise KeyError serial[i] = 0 time_since_signal[i] = 0 quantity[i] = 0 temp_signal[i] = -1 traded_nav1[i] = traded_nav1[i-1] signal_price_leg1[i] = 0 traded_price_leg1[i] = 0 tradeprice_leg1[i] = 0 short_signal_on = False long_signal_on = False signal[i] = 0 case[i] = 16 return_since_signal[i] = 0 crystallised_return[i] = 0 compounded_return_since_signal[i] = 0 total_nav[i] = total_nav[i-1] + crystallised_return[i] + return_since_signal[i] - return_since_signal[i-1] short_signal_on_array[i] = np.where(short_signal_on == False, 0, 1) long_signal_on_array[i] = np.where(long_signal_on == False, 0, 1) else: if long_signal_on: if sig[i] == -1: case[i] = 13 signal[i] = -1 short_signal_on = True long_signal_on = False serial[i] = 1 time_since_signal[i] = 1 # q1[i] = -minq signal_price_leg1[i] = bidprice[i] traded_price_leg1[i] = bidprice[i]*(1-txn_cost) tradeprice_leg1[i] = traded_price_leg1[i] crystallised_return[i] = (quantity[i - 1] * ((traded_price_leg1[i] - traded_price_leg1[i - 1])) * lotsize1) traded_nav1[i] = total_nav[i-1] + crystallised_return[i] if fixed_quantity: quantity[i] = -minq maxquantity[i] = -minq else: quantity[i], maxquantity[i], tp[i], sl[i] = define_q_and_tp(-1, bidprice[i], quantity_risk, risk, reward, traded_nav1[i], quantity_maxrisk, minq) return_since_signal[i] = (quantity[i]*((askprice[i] - traded_price_leg1[i]))*lotsize1) compounded_return_since_signal[i] = crystallised_return[i] + return_since_signal[i] total_nav[i] = total_nav[i-1] + crystallised_return[i] + return_since_signal[i] - return_since_signal[i-1] short_signal_on_array[i] = np.where(short_signal_on == False, 0, 1) long_signal_on_array[i] = np.where(long_signal_on == False, 0, 1) elif casecloseloss or caseclosetp: raise KeyError serial[i] = 0 time_since_signal[i] = 0 quantity[i] = 0 traded_nav1[i] = traded_nav1[i-1] signal_price_leg1[i] = signal_price_leg1[i-1] traded_price_leg1[i] = bidprice[i]*(1-txn_cost) tradeprice_leg1[i] = traded_price_leg1[i] short_signal_on = False long_signal_on = False signal[i] = 0 case[i] = 26 sl[i] = 0 tp[i] = 0 maxquantity[i] =0 return_since_signal[i] = 0 crystallised_return[i] = (quantity[i-1]*((traded_price_leg1[i] - traded_price_leg1[i-1]))*lotsize1) compounded_return_since_signal[i] = crystallised_return[i] + return_since_signal[i] total_nav[i] = total_nav[i-1] + crystallised_return[i] + return_since_signal[i] - return_since_signal[i-1] short_signal_on_array[i] = np.where(short_signal_on == False, 0, 1) long_signal_on_array[i] = np.where(long_signal_on == False, 0, 1) else: raise KeyError serial[i] = serial[i-1] time_since_signal[i] = time_since_signal[i-1] + 1 traded_nav1[i] = traded_nav1[i-1] quantity[i] = quantity[i-1] signal_price_leg1[i] = signal_price_leg1[i-1] traded_price_leg1[i] = traded_price_leg1[i-1] tradeprice_leg1[i] = askprice[i] short_signal_on = False long_signal_on = True signal[i] = 1 case[i] = 27 return_since_signal[i] = (quantity[i]*((bidprice[i] - traded_price_leg1[i]))*lotsize1) crystallised_return[i] = 0 compounded_return_since_signal[i] = crystallised_return[i] + return_since_signal[i] total_nav[i] = total_nav[i-1] + crystallised_return[i] + return_since_signal[i] - return_since_signal[i-1] short_signal_on_array[i] = np.where(short_signal_on == False, 0, 1) long_signal_on_array[i] = np.where(long_signal_on == False, 0, 1) elif short_signal_on: if sig[i] == 1: case[i] = 30 signal[i] = 1 long_signal_on = True short_signal_on = False serial[i] = 1 time_since_signal[i] = 1 signal_price_leg1[i] = askprice[i] traded_price_leg1[i] = askprice[i] * (1 + txn_cost) tradeprice_leg1[i] = traded_price_leg1[i] crystallised_return[i] = (quantity[i - 1] * ((traded_price_leg1[i] - traded_price_leg1[i - 1])) * lotsize1) traded_nav1[i] = total_nav[i-1] + crystallised_return[i] if fixed_quantity: quantity[i] = minq maxquantity[i] = minq else: quantity[i], maxquantity[i], tp[i], sl[i] = define_q_and_tp(1, askprice[i], quantity_risk, risk, reward, traded_nav1[i], quantity_maxrisk, minq) return_since_signal[i] = (quantity[i]*((bidprice[i] - traded_price_leg1[i]))*lotsize1) compounded_return_since_signal[i] = crystallised_return[i] + return_since_signal[i] total_nav[i] = total_nav[i-1] + crystallised_return[i] + return_since_signal[i] - return_since_signal[i-1] short_signal_on_array[i] = np.where(short_signal_on == False, 0, 1) long_signal_on_array[i] = np.where(long_signal_on == False, 0, 1) elif casecloseloss or caseclosetp: raise KeyError serial[i] = 0 time_since_signal[i] = 0 temp_signal[i] = 0 traded_nav1[i] = traded_nav1[i-1] quantity[i] = 0 signal_price_leg1[i] = signal_price_leg1[i-1] traded_price_leg1[i] = askprice[i]*(1+txn_cost) tradeprice_leg1[i] = traded_price_leg1[i] short_signal_on = False long_signal_on = False signal[i] = 0 case[i] = 29 return_since_signal[i] = 0 sl[i] = 0 tp[i] = 0 maxquantity[i] =0 crystallised_return[i] = (quantity[i-1]*((traded_price_leg1[i] - traded_price_leg1[i-1]))*lotsize1) compounded_return_since_signal[i] = crystallised_return[i] + return_since_signal[i] total_nav[i] = total_nav[i-1] + crystallised_return[i] + return_since_signal[i] - return_since_signal[i-1] short_signal_on_array[i] = np.where(short_signal_on == False, 0, 1) long_signal_on_array[i] = np.where(long_signal_on == False, 0, 1) else: raise KeyError serial[i] = serial[i-1] time_since_signal[i] = time_since_signal[i-1] + 1 traded_nav1[i] = traded_nav1[i-1] quantity[i] = quantity[i-1] temp_signal[i] = temp_signal[i-1] signal_price_leg1[i] = signal_price_leg1[i-1] traded_price_leg1[i] = traded_price_leg1[i-1] tradeprice_leg1[i] = bidprice[i] short_signal_on = True long_signal_on = False signal[i] = -1 case[i] = 30 return_since_signal[i] = (quantity[i]*((askprice[i] - traded_price_leg1[i]))*lotsize1) crystallised_return[i] = 0 compounded_return_since_signal[i] = crystallised_return[i] + return_since_signal[i] total_nav[i] = total_nav[i-1] + crystallised_return[i] + return_since_signal[i] - return_since_signal[i-1] short_signal_on_array[i] = np.where(short_signal_on == False, 0, 1) long_signal_on_array[i] = np.where(long_signal_on == False, 0, 1) else: raise KeyError serial[i] = 0 time_since_signal[i] = 0 quantity[i] = 0 traded_nav1[i] = traded_nav1[i-1] sl[i] = 0 tp[i] = 0 maxquantity[i] =0 signal_price_leg1[i] = 0 traded_price_leg1[i] = 0 tradeprice_leg1[i] = 0 short_signal_on = False long_signal_on = False signal[i] = 0 case[i] = 31 return_since_signal[i] = 0 crystallised_return[i] = 0 compounded_return_since_signal[i] = 0 total_nav[i] = total_nav[i-1] + crystallised_return[i] + return_since_signal[i] - return_since_signal[i-1] short_signal_on_array[i] = np.where(short_signal_on == False, 0, 1) long_signal_on_array[i] = np.where(long_signal_on == False, 0, 1) if (time_since_signal[i] >= time_limit ) or closingbeforeexpiry: if long_signal_on: traded_price_leg1[i] = bidprice[i]*(1-txn_cost) signal_price_leg1[i] = signal_price_leg1[i-1] tradeprice_leg1[i] = traded_price_leg1[i] case[i] = 32 serial[i] = 0 time_since_signal[i] = 0 temp_signal[i] = 0 traded_nav1[i] = 0 sl[i] = 0 tp[i] = 0 maxquantity[i] = 0 quantity[i] = 0 short_signal_on = False long_signal_on = False signal[i] = 0 return_since_signal[i] = 0 crystallised_return[i] = (quantity[i-1]*((traded_price_leg1[i] - traded_price_leg1[i-1]))*lotsize1) compounded_return_since_signal[i] = crystallised_return[i] + return_since_signal[i] total_nav[i] = total_nav[i-1] + crystallised_return[i] + return_since_signal[i] - return_since_signal[i-1] short_signal_on_array[i] = np.where(short_signal_on == False, 0, 1) long_signal_on_array[i] = np.where(long_signal_on == False, 0, 1) elif short_signal_on: traded_price_leg1[i] = askprice[i]*(1+txn_cost) signal_price_leg1[i] = signal_price_leg1[i-1] temp_signal[i] = 0 tradeprice_leg1[i] = traded_price_leg1[i] traded_nav1[i] = 0 sl[i] = 0 tp[i] = 0 maxquantity[i] =0 case[i] = 33 serial[i] = 0 time_since_signal[i] = 0 quantity[i] = 0 short_signal_on = False long_signal_on = False signal[i] = 0 return_since_signal[i] = 0 crystallised_return[i] = (quantity[i-1]*((traded_price_leg1[i] - traded_price_leg1[i-1]))*lotsize1) compounded_return_since_signal[i] = crystallised_return[i] + return_since_signal[i] total_nav[i] = total_nav[i-1] + crystallised_return[i] + return_since_signal[i] - return_since_signal[i-1] short_signal_on_array[i] = np.where(short_signal_on == False, 0, 1) long_signal_on_array[i] = np.where(long_signal_on == False, 0, 1) else: traded_price_leg1[i] = 0 signal_price_leg1[i] = 0 temp_signal[i] = 0 traded_nav1[i] = 0 sl[i] = 0 tp[i] = 0 maxquantity[i] = 0 tradeprice_leg1[i] = 0 crystallised_return[i] = 0 serial[i] = 0 time_since_signal[i] = 0 quantity[i] = 0 short_signal_on = False long_signal_on = False signal[i] = 0 return_since_signal[i] = 0 compounded_return_since_signal[i] = 0 case[i] = 34 total_nav[i] = total_nav[i-1] + crystallised_return[i] + return_since_signal[i] - return_since_signal[i-1] short_signal_on_array[i] = np.where(short_signal_on == False, 0, 1) long_signal_on_array[i] = np.where(long_signal_on == False, 0, 1) elif signal_times[i] == 0: if long_signal_on: if casecloseloss or caseclosetp: serial[i] = 0 time_since_signal[i] = 0 quantity[i] = 0 temp_signal[i] = 0 sl[i] = 0 tp[i] = 0 maxquantity[i] =0 signal_price_leg1[i] = signal_price_leg1[i-1] traded_price_leg1[i] = bidprice[i]*(1-txn_cost) tradeprice_leg1[i] = traded_price_leg1[i] short_signal_on = False long_signal_on = False signal[i] = 0 case[i] = 26 traded_nav1[i] = traded_nav1[i-1] return_since_signal[i] = 0 crystallised_return[i] = (quantity[i-1]*((traded_price_leg1[i] - traded_price_leg1[i-1]))*lotsize1) compounded_return_since_signal[i] = crystallised_return[i] + return_since_signal[i] total_nav[i] = total_nav[i-1] + crystallised_return[i] + return_since_signal[i] - return_since_signal[i-1] short_signal_on_array[i] = np.where(short_signal_on == False, 0, 1) long_signal_on_array[i] = np.where(long_signal_on == False, 0, 1) else: serial[i] = serial[i-1] time_since_signal[i] = time_since_signal[i-1] + 1 quantity[i] = quantity[i-1] temp_signal[i] = temp_signal[i-1] traded_nav1[i] = traded_nav1[i-1] sl[i] = sl[i-1] tp[i] = tp[i-1] maxquantity[i] = maxquantity[i-1] signal_price_leg1[i] = signal_price_leg1[i-1] traded_price_leg1[i] = traded_price_leg1[i-1] tradeprice_leg1[i] = bidprice[i] short_signal_on = False long_signal_on = True signal[i] = 1 case[i] = 27 return_since_signal[i] = (quantity[i]*((bidprice[i] - traded_price_leg1[i]))*lotsize1) crystallised_return[i] = 0 compounded_return_since_signal[i] = crystallised_return[i] + return_since_signal[i] total_nav[i] = total_nav[i-1] + crystallised_return[i] + return_since_signal[i] - return_since_signal[i-1] short_signal_on_array[i] = np.where(short_signal_on == False, 0, 1) long_signal_on_array[i] = np.where(long_signal_on == False, 0, 1) elif short_signal_on: if casecloseloss or caseclosetp: serial[i] = 0 time_since_signal[i] = 0 temp_signal[i] = 0 traded_nav1[i] = traded_nav1[i-1] sl[i] = 0 tp[i] = 0 maxquantity[i] =0 quantity[i] = 0 signal_price_leg1[i] = signal_price_leg1[i-1] traded_price_leg1[i] = askprice[i]*(1+txn_cost) tradeprice_leg1[i] = traded_price_leg1[i] short_signal_on = False long_signal_on = False signal[i] = 0 case[i] = 29 return_since_signal[i] = 0 crystallised_return[i] = (quantity[i-1]*((traded_price_leg1[i] - traded_price_leg1[i-1]))*lotsize1) compounded_return_since_signal[i] = crystallised_return[i] + return_since_signal[i] total_nav[i] = total_nav[i-1] + crystallised_return[i] + return_since_signal[i] - return_since_signal[i-1] short_signal_on_array[i] = np.where(short_signal_on == False, 0, 1) long_signal_on_array[i] = np.where(long_signal_on == False, 0, 1) else: serial[i] = serial[i-1] time_since_signal[i] = time_since_signal[i-1] + 1 quantity[i] = quantity[i-1] temp_signal[i] = temp_signal[i-1] traded_nav1[i] = total_nav[i-1] sl[i] = sl[i-1] tp[i] = tp[i-1] maxquantity[i] =maxquantity[i-1] signal_price_leg1[i] = signal_price_leg1[i-1] traded_price_leg1[i] = traded_price_leg1[i-1] tradeprice_leg1[i] = askprice[i] short_signal_on = True long_signal_on = False signal[i] = -1 case[i] = 30 return_since_signal[i] = (quantity[i]*((askprice[i] - traded_price_leg1[i]))*lotsize1) crystallised_return[i] = 0 compounded_return_since_signal[i] = crystallised_return[i] + return_since_signal[i] total_nav[i] = total_nav[i-1] + crystallised_return[i] + return_since_signal[i] - return_since_signal[i-1] short_signal_on_array[i] = np.where(short_signal_on == False, 0, 1) long_signal_on_array[i] = np.where(long_signal_on == False, 0, 1) else: serial[i] = 0 time_since_signal[i] = 0 quantity[i] = 0 temp_signal[i] = 0 traded_nav1[i] = total_nav[i-1] sl[i] = 0 tp[i] = 0 maxquantity[i] =0 signal_price_leg1[i] = 0 traded_price_leg1[i] = 0 tradeprice_leg1[i] = 0 short_signal_on = False long_signal_on = False signal[i] = 0 case[i] = 31 return_since_signal[i] = 0 crystallised_return[i] = 0 compounded_return_since_signal[i] = 0 total_nav[i] = total_nav[i-1] + crystallised_return[i] + return_since_signal[i] - return_since_signal[i-1] short_signal_on_array[i] = np.where(short_signal_on == False, 0, 1) long_signal_on_array[i] = np.where(long_signal_on == False, 0, 1) if (time_since_signal[i] >= time_limit) or closingbeforeexpiry: if long_signal_on: traded_price_leg1[i] = bidprice[i]*(1-txn_cost) signal_price_leg1[i] = signal_price_leg1[i-1] tradeprice_leg1[i] = traded_price_leg1[i] serial[i] = 0 time_since_signal[i] = 0 traded_nav1[i] = 0 sl[i] = 0 tp[i] = 0 maxquantity[i] =0 quantity[i] = 0 temp_signal[i] = 0 short_signal_on = False long_signal_on = False signal[i] = 0 return_since_signal[i] = 0 crystallised_return[i] = (quantity[i-1]*((traded_price_leg1[i] - traded_price_leg1[i-1]))*lotsize1) compounded_return_since_signal[i] = crystallised_return[i] + return_since_signal[i] case[i] = 60 total_nav[i] = total_nav[i-1] + crystallised_return[i] + return_since_signal[i] - return_since_signal[i-1] short_signal_on_array[i] = np.where(short_signal_on == False, 0, 1) long_signal_on_array[i] = np.where(long_signal_on == False, 0, 1) elif short_signal_on: traded_price_leg1[i] = askprice[i]*(1+txn_cost) signal_price_leg1[i] = signal_price_leg1[i-1] tradeprice_leg1[i] = traded_price_leg1[i] serial[i] = 0 time_since_signal[i] = 0 traded_nav1[i] = 0 sl[i] = 0 tp[i] = 0 maxquantity[i] =0 quantity[i] = 0 temp_signal[i] = 0 short_signal_on = False long_signal_on = False signal[i] = 0 return_since_signal[i] = 0 crystallised_return[i] = (quantity[i-1]*((traded_price_leg1[i] - traded_price_leg1[i-1]))*lotsize1) compounded_return_since_signal[i] = crystallised_return[i] + return_since_signal[i] case[i] = 61 total_nav[i] = total_nav[i-1] + crystallised_return[i] + return_since_signal[i] - return_since_signal[i-1] short_signal_on_array[i] = np.where(short_signal_on == False, 0, 1) long_signal_on_array[i] = np.where(long_signal_on == False, 0, 1) else: traded_price_leg1[i] = 0 signal_price_leg1[i] = 0 tradeprice_leg1[i] = 0 crystallised_return[i] = 0 serial[i] = 0 time_since_signal[i] = 0 temp_signal[i] = 0 traded_nav1[i] = 0 sl[i] = 0 tp[i] = 0 maxquantity[i] =0 quantity[i] = 0 short_signal_on = False long_signal_on = False signal[i] = 0 return_since_signal[i] = 0 compounded_return_since_signal[i] = 0 case[i] = 62 total_nav[i] = total_nav[i-1] + crystallised_return[i] + return_since_signal[i] - return_since_signal[i-1] short_signal_on_array[i] = np.where(short_signal_on == False, 0, 1) long_signal_on_array[i] = np.where(long_signal_on == False, 0, 1) if total_nav[i] <= 0: break return signal, sig, quantity, maxquantity, tradeprice_leg1, case, return_since_signal,serial, traded_price_leg1, compounded_return_since_signal, time_since_signal, total_nav, crystallised_return, short_signal_on_array, long_signal_on_array @jit(nopython=True) def define_q_and_tp(buy_sell, closeprice, quantity_risk, risk, reward, initial_nav, quantity_maxrisk, min_q): q = (initial_nav * quantity_risk) / closeprice maxquantity = (initial_nav * quantity_maxrisk) / closeprice q = (q // min_q) * min_q maxquantity = (maxquantity // min_q) * min_q if q < min_q: q = min_q if maxquantity < min_q: maxquantity = min_q q = q * buy_sell maxquantity = maxquantity * buy_sell tp = closeprice * (1 + buy_sell * reward) sl = closeprice * (1 - buy_sell * risk) return float(q), float(maxquantity), float(tp), float(sl)
Editor is loading...
Leave a Comment