13 KiB
13 KiB
In [ ]:
from v2realbot.tools.loadbatch import load_batch from v2realbot.utils.utils import zoneNY, DATA_DIR import pandas as pd import numpy as np import vectorbtpro as vbt vbt.settings.set_theme("dark") vbt.settings['plotting']['layout']['width'] = 1280 vbt.settings.plotting.auto_rangebreaks = True # Set the option to display with pagination pd.set_option('display.notebook_repr_html', True) pd.set_option('display.max_rows', 10) # Number of rows per page
In [ ]:
batch_id = "e44a5075" # res, df = load_batch(batch_id=batch_id, # space_resolution_evenly=False, # indicators_columns=["Rsi14"], # main_session_only=True) # if res < 0: # print("Error" + str(res) + str(df)) # df = df["bars"] # df.info() # df.head() # #df.ptable() # df.to_pickle(DATA_DIR+"/"+f'{batch_id}.pickle')
FILTERING¶
In [ ]:
df = pd.read_pickle(DATA_DIR+"/"+f'{batch_id}.pickle') df
In [ ]:
#naloadujeme do vbt symbol as column basic_data = vbt.Data.from_data({"BAC": df}, tz_convert=zoneNY) start_date = pd.Timestamp('2024-03-12 09:30', tz=zoneNY) end_date = pd.Timestamp('2024-03-13 16:00', tz=zoneNY) #filter date #basic_data = basic_data.transform(lambda df: df[df.index.date == start_date.date()]) #filter range basic_data = basic_data.transform(lambda df: df[(df.index >= start_date) & (df.index <= end_date)]) #filtered_data = basic_data.transform(lambda df: df[(df.index >= start_date) & (df.index <= end_date)]) # #range filtered_data = data[(data.index >= start_date) & (data.index <= end_date) #df.between_time('09:30', '16:00') #(df.index.time >= pd.Timestamp('09:30').time()) & (df.index.time <= pd.Timestamp('16:00').time())
In [ ]:
# basic_data.data["BAC"] rsi14
In [ ]:
#b = filtered_data.get().iloc[100:200] #b[["Open","High"]] rsi14 = basic_data.data["BAC"]["Rsi14"].rename("Rsi14") #create subploit fig = vbt.make_subplots(rows=2, cols=1, shared_xaxes=True, specs=[[{"secondary_y": True}], [{"secondary_y": False}]]) rsi14.vbt.plot(add_trace_kwargs=dict(row=1, col=1, secondary_y=True),fig=fig) basic_data.data["BAC"].vbt.ohlcv.plot(add_trace_kwargs=dict(row=1, col=1, secondary_y=False), fig=fig)
In [ ]:
run_rsi = vbt.talib_func("rsi") rsi_new = run_rsi(basic_data.vwap, timeperiod=15) rsi_new = rsi_new.fillna(0) # print(rsi_new) # print(dir(rsi_new)) rsi14 = basic_data.data["BAC"]["Rsi14"] # print(rsi14) #zkombinujeme do stejneho dataframe skrz sloupce (axis1) # combined_df = pd.concat([rsi_new, rsi14], axis=1) # combined_df #create subplot fig = vbt.make_subplots(rows=1, cols=1, shared_xaxes=True) plot_rsi = vbt.talib_plot_func("rsi") plot_rsi(rsi_new, fig=fig) plot_rsi(rsi14, fig=fig) fig.show()
In [ ]:
entries = rsi_new.vbt.crossed_below(30) entries
In [ ]:
exits = rsi_new.vbt.crossed_above(70) exits
In [ ]:
def plot_rsi(close, rsi, entries, exits): fig = vbt.make_subplots(rows=2, cols=1, shared_xaxes=True, specs=[[{"secondary_y": True}], [{"secondary_y": False}]]) basic_data.data["BAC"].vbt.ohlcv.plot(add_trace_kwargs=dict(row=1, col=1, secondary_y=True),fig=fig) rsi.vbt.plot(fig=fig, add_trace_kwargs=dict(row=1, col=1, secondary_y=False), trace_kwargs=dict(line=dict(color='grey', width=1.5))) #close.vbt.plot(fig=fig, add_trace_kwargs=dict(row=1, col=1, secondary_y=True)) entries.vbt.signals.plot_as_entries(y=close, fig=fig, add_trace_kwargs=dict(row=1, col=1, secondary_y=True)) exits.vbt.signals.plot_as_exits(y=close, fig=fig, add_trace_kwargs=dict(row=1, col=1, secondary_y=True)) return fig close = basic_data.get("Close") print(entries) plot_rsi(close, rsi_new, entries, exits).show() clean_entries, clean_exits = entries.vbt.signals.clean(exits) plot_rsi(close, rsi_new, clean_entries, clean_exits).show()
In [ ]:
clean_entries.vbt.signals.total() clean_exits.vbt.signals.total()
In [ ]:
index = basic_data.wrapper.index #minutes from market open market_open_time = pd.to_timedelta('09:30:00') # Calculate the market open datetime for each day market_opens = index.normalize() + market_open_time minutes_from_open = (index - market_opens).total_seconds() / 60 # Ensuring the result is a Series minutes_from_open = pd.Series(minutes_from_open, index=index) #minutes_from_open.values
In [ ]:
symbol_wrapper = basic_data.get_symbol_wrapper() @vbt.njit def elapsed_minutes_from_open_nb(time_in_ns): market_opens_in_minute = 570 # 9 hours * 60 minutes + 30 minutes current_minute = vbt.dt_nb.hour_nb(time_in_ns) * 60 + vbt.dt_nb.minute_nb(time_in_ns) #print("current_minutes", current_minutes) # Calculate elapsed minutes since market open at 9:30 AM minutes_from_open = current_minute - market_opens_in_minute print( "elapsed_from_open", minutes_from_open) return minutes_from_open if minutes_from_open >= 0 else 0 @vbt.njit def entry_place_func_nb(c, low, close, time_in_ns, rsi14, window_open, window_close): # if c.from_i == 0: # (1)! # c.out[0] = True # return -1 # print("ted") # print(c.from_i) #exit_i = c.from_i - c.wait # (2)! #exit_price = close[exit_i, c.col] # (3)! #hit_price = exit_price * (1 - th) market_open_minutes = 570 # 9 hours * 60 minutes + 30 minutes for out_i in range(len(c.out)): i = c.from_i + out_i current_minutes = vbt.dt_nb.hour_nb(time_in_ns[i]) * 60 + vbt.dt_nb.minute_nb(time_in_ns[i]) #print("current_minutes", current_minutes) # Calculate elapsed minutes since market open at 9:30 AM elapsed_from_open = current_minutes - market_open_minutes elapsed_from_open = elapsed_from_open if elapsed_from_open >= 0 else 0 #print( "elapsed_from_open", elapsed_from_open) #elapsed_from_open = elapsed_minutes_from_open_nb(time_in_ns) in_window = elapsed_from_open > window_open and elapsed_from_open < window_close #print("in_window", in_window) # if in_window: # print("in window") if in_window and rsi14[i] > 60: # and low[i, c.col] <= hit_price: # and hour == 9: # (4)! return out_i return -1 #whether the date changed # day_changed_nb( # ts1, # ts2 # ) # h_ns(ts1) int @vbt.njit def exit_place_func_nb(c, high, close, time_index, tp, sl): # (5)! entry_i = c.from_i - c.wait entry_price = close[entry_i, c.col] hit_price = entry_price * (1 + tp) stop_price = entry_price * (1 - sl) for out_i in range(len(c.out)): i = c.from_i + out_i last_bar_of_day = vbt.dt_nb.day_changed_nb(time_index[i], time_index[i + 1]) #print(next_day) if last_bar_of_day: #pokud je dalsi next day, tak zavirame posledni print("ted",out_i) return out_i if high[i, c.col] >= hit_price or close[i, c.col] <= stop_price : return out_i return -1 index = basic_data.wrapper.index #minutes from market open market_open_time = pd.to_timedelta('09:30:00') # Calculate the market open datetime for each day market_opens = index.normalize() + market_open_time minutes_from_open = (index - market_opens).total_seconds() / 60 print(minutes_from_open) #index 9:30 az 10:00 time_entry_window = ((index.time >= pd.Timestamp("09:30:00").time())& (index.time <= pd.Timestamp("14:00:00").time())) print(time_entry_window) print(rsi_new) rsi_entries = rsi_new.vbt.crossed_below(64) rsi_entries = rsi_entries < 40 rsi_entries_array = rsi_entries.vbt.to_1d_array() print(rsi_entries_array) entries, exits = vbt.pd_acc.signals.generate_both( # (6)! symbol_wrapper.shape, entry_place_func_nb=entry_place_func_nb, #timeindex to ns to numba entry_place_args=(vbt.Rep("low"), vbt.Rep("close"), vbt.dt.to_ns(basic_data.wrapper.index), vbt.Rep("rsi14"), 0, 380), # (7)! exit_place_func_nb=exit_place_func_nb, exit_place_args=(vbt.Rep("high"), vbt.Rep("close"), vbt.dt.to_ns(basic_data.wrapper.index), 0.001, 0.001), wrapper=symbol_wrapper, broadcast_named_args=dict( # (8)! high=basic_data.get("High"), low=basic_data.get("Low"), close=basic_data.get("Close"), rsi14=basic_data.get("Rsi14"), window_open=10, window_close=60 ), broadcast_kwargs=dict(post_func=np.asarray) # (9)! ) plot_rsi(close, rsi_new, entries, exits).show() # fig = basic_data.plot( # symbol="BAC", # ohlc_trace_kwargs=dict(opacity=0.5), # plot_volume=False # ) # #rsi_entries.vbt.plot(fig=fig) # entries.vbt.signals.plot_as_entries( # y=close, fig=fig) # exits.vbt.signals.plot_as_exits( # y=close, fig=fig) # fig.show() # (10)!