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