From cb927a704c43f23692f89bb1aa68f7caad660ba8 Mon Sep 17 00:00:00 2001 From: user_client2024 Date: Thu, 5 Dec 2024 06:38:21 +0000 Subject: [PATCH] Initial commit --- .ipynb_checkpoints/main-checkpoint.ipynb | 139 +++++++++++++++ .ipynb_checkpoints/main-checkpoint.py | 205 +++++++++++++++++++++++ main.ipynb | 139 +++++++++++++++ main.py | 112 +++++++++++++ 4 files changed, 595 insertions(+) create mode 100644 .ipynb_checkpoints/main-checkpoint.ipynb create mode 100644 .ipynb_checkpoints/main-checkpoint.py create mode 100644 main.ipynb create mode 100644 main.py diff --git a/.ipynb_checkpoints/main-checkpoint.ipynb b/.ipynb_checkpoints/main-checkpoint.ipynb new file mode 100644 index 0000000..8720304 --- /dev/null +++ b/.ipynb_checkpoints/main-checkpoint.ipynb @@ -0,0 +1,139 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": null, + "id": "776ef599-d5a9-4665-b8e5-b07f219fb9c2", + "metadata": {}, + "outputs": [], + "source": [ + "from datetime import datetime, timedelta\n", + "import pandas as pd\n", + "from tms_data_interface import SQLQueryInterface\n", + "\n", + "query = \"\"\"\n", + "WITH time_windows AS (\n", + " SELECT\n", + " -- End time is the current trade time\n", + " date_time AS end_time,\n", + "\n", + " -- Subtract seconds from the end_time using date_add() with negative integer interval\n", + " date_add('second', -{time_window_s}, date_time) AS start_time,\n", + "\n", + " -- Trade details\n", + " trade_price,\n", + " trade_volume,\n", + " trader_id,\n", + "\n", + " -- Calculate minimum price within the time window\n", + " MIN(trade_price) OVER (\n", + " ORDER BY date_time \n", + " RANGE BETWEEN INTERVAL '{time_window_s}' SECOND PRECEDING AND CURRENT ROW\n", + " ) AS min_price,\n", + "\n", + " -- Calculate maximum price within the time window\n", + " MAX(trade_price) OVER (\n", + " ORDER BY date_time \n", + " RANGE BETWEEN INTERVAL '{time_window_s}' SECOND PRECEDING AND CURRENT ROW\n", + " ) AS max_price,\n", + "\n", + " -- Calculate total trade volume within the time window\n", + " SUM(trade_volume) OVER ( \n", + " ORDER BY date_time \n", + " RANGE BETWEEN INTERVAL '{time_window_s}' SECOND PRECEDING AND CURRENT ROW\n", + " ) AS total_volume,\n", + "\n", + " -- Calculate participant's trade volume within the time window\n", + " SUM(CASE WHEN trader_id = trader_id THEN trade_volume ELSE 0 END) OVER (\n", + " PARTITION BY trader_id \n", + " ORDER BY date_time \n", + " RANGE BETWEEN INTERVAL '{time_window_s}' SECOND PRECEDING AND CURRENT ROW\n", + " ) AS participant_volume\n", + " FROM\n", + " {trade_data_1b}\n", + ")\n", + "SELECT\n", + " -- Select the time window details\n", + " start_time,\n", + " end_time,\n", + "\n", + " -- Select the participant (trader) ID\n", + " trader_id AS \"Participant\",\n", + "\n", + " -- Select the calculated min and max prices\n", + " min_price,\n", + " max_price,\n", + "\n", + " -- Calculate the price change percentage\n", + " (max_price - min_price) / NULLIF(min_price, 0) * 100 AS \"Price Change (%)\",\n", + "\n", + " -- Calculate the participant's volume as a percentage of total volume\n", + " (participant_volume / NULLIF(total_volume, 0)) * 100 AS \"Volume (%)\",\n", + "\n", + " -- Participant volume\n", + " participant_volume,\n", + "\n", + " -- Select the total volume within the window\n", + " total_volume AS \"Total Volume\"\n", + "FROM\n", + " time_windows\n", + "\"\"\"\n", + "\n", + "\n", + "from tms_data_interface import SQLQueryInterface\n", + "\n", + "class Scenario:\n", + " seq = SQLQueryInterface(schema=\"trade_schema\")\n", + " def logic(self, **kwargs):\n", + " validation_window = kwargs.get('validation_window', 300000)\n", + " time_window_s = int(validation_window/1000)\n", + " query_start_time = datetime.now()\n", + " print(\"Query start time :\",query_start_time)\n", + " row_list = self.seq.execute_raw(query.format(trade_data_1b=\"trade_10m_v3\",\n", + " time_window_s = time_window_s)\n", + " )\n", + " cols = [\n", + " 'START_DATE_TIME',\n", + " 'END_DATE_TIME',\n", + " 'Focal_id',\n", + " 'MIN_PRICE',\n", + " 'MAX_PRICE',\n", + " 'PRICE_CHANGE_PCT',\n", + " 'PARTICIPANT_VOLUME_PCT',\n", + " 'PARTICIPANT_VOLUME',\n", + " 'TOTAL_VOLUME',\n", + " ]\n", + " final_scenario_df = pd.DataFrame(row_list, columns = cols)\n", + " final_scenario_df['PARTICIPANT_VOLUME_PCT'] = final_scenario_df['PARTICIPANT_VOLUME']/\\\n", + " final_scenario_df['TOTAL_VOLUME'] * 100\n", + " final_scenario_df['Segment'] = 'Default'\n", + " final_scenario_df['SAR_FLAG'] = 'N'\n", + " final_scenario_df['Risk'] = 'Low Risk'\n", + " final_scenario_df.dropna(inplace=True)\n", + " # final_scenario_df['RUN_DATE'] = final_scenario_df['END_DATE']\n", + " return final_scenario_df\n" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "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.11.8" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/.ipynb_checkpoints/main-checkpoint.py b/.ipynb_checkpoints/main-checkpoint.py new file mode 100644 index 0000000..56d8f5e --- /dev/null +++ b/.ipynb_checkpoints/main-checkpoint.py @@ -0,0 +1,205 @@ +#!/usr/bin/env python +# coding: utf-8 + +# In[6]: + + +from datetime import datetime, timedelta + +import pandas as pd + +from tms_data_interface import SQLQueryInterface + +query = """ + +WITH time_windows AS ( + + SELECT + + -- End time is the current trade time + + date_time AS end_time, + + -- Subtract seconds from the end_time using date_add() with negative integer interval + + date_add('second', -{time_window_s}, date_time) AS start_time, + + -- Trade details + + trade_price, + + trade_volume, + + trader_id, + + -- Calculate minimum price within the time window + + MIN(trade_price) OVER ( + + ORDER BY date_time + + RANGE BETWEEN INTERVAL '{time_window_s}' SECOND PRECEDING AND CURRENT ROW + + ) AS min_price, + + -- Calculate maximum price within the time window + + MAX(trade_price) OVER ( + + ORDER BY date_time + + RANGE BETWEEN INTERVAL '{time_window_s}' SECOND PRECEDING AND CURRENT ROW + + ) AS max_price, + + -- Calculate total trade volume within the time window + + SUM(trade_volume) OVER ( + + ORDER BY date_time + + RANGE BETWEEN INTERVAL '{time_window_s}' SECOND PRECEDING AND CURRENT ROW + + ) AS total_volume, + + -- Calculate participant's trade volume within the time window + + SUM(CASE WHEN trader_id = trader_id THEN trade_volume ELSE 0 END) OVER ( + + PARTITION BY trader_id + + ORDER BY date_time + + RANGE BETWEEN INTERVAL '{time_window_s}' SECOND PRECEDING AND CURRENT ROW + + ) AS participant_volume + + FROM + + {trade_data_1b} + +) + +SELECT + + -- Select the time window details + + start_time, + + end_time, + + -- Select the participant (trader) ID + + trader_id AS "Participant", + + -- Select the calculated min and max prices + + min_price, + + max_price, + + -- Calculate the price change percentage + + (max_price - min_price) / NULLIF(min_price, 0) * 100 AS "Price Change (%)", + + -- Calculate the participant's volume as a percentage of total volume + + (participant_volume / NULLIF(total_volume, 0)) * 100 AS "Volume (%)", + + -- Participant volume + + participant_volume, + + -- Select the total volume within the window + + total_volume AS "Total Volume" + +FROM + + time_windows + +""" + + +from tms_data_interface import SQLQueryInterface + +class Scenario: + + seq = SQLQueryInterface(schema="trade_schema") + + def logic(self, **kwargs): + + validation_window = kwargs.get('validation_window', 300000) + + time_window_s = int(validation_window/1000) + + query_start_time = datetime.now() + + print("Query start time :",query_start_time) + + row_list = self.seq.execute_raw(query.format(trade_data_1b="trade_10m_v3", + + time_window_s = time_window_s) + + ) + + cols = [ + + 'START_DATE_TIME', + + 'END_DATE_TIME', + + 'Focal_id', + + 'MIN_PRICE', + + 'MAX_PRICE', + + 'PRICE_CHANGE_PCT', + + 'PARTICIPANT_VOLUME_PCT', + + 'PARTICIPANT_VOLUME', + + 'TOTAL_VOLUME', + + ] + + final_scenario_df = pd.DataFrame(row_list, columns = cols) + + final_scenario_df['PARTICIPANT_VOLUME_PCT'] = final_scenario_df['PARTICIPANT_VOLUME']/\ + + final_scenario_df['TOTAL_VOLUME'] * 100 + + final_scenario_df['Segment'] = 'Default' + + final_scenario_df['SAR_FLAG'] = 'N' + + final_scenario_df['Risk'] = 'Low Risk' + + final_scenario_df.dropna(inplace=True) + + # final_scenario_df['RUN_DATE'] = final_scenario_df['END_DATE'] + + return final_scenario_df + + + + +# In[ ]: + + + + + +# In[ ]: + + + + + +# In[ ]: + + + + diff --git a/main.ipynb b/main.ipynb new file mode 100644 index 0000000..8720304 --- /dev/null +++ b/main.ipynb @@ -0,0 +1,139 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": null, + "id": "776ef599-d5a9-4665-b8e5-b07f219fb9c2", + "metadata": {}, + "outputs": [], + "source": [ + "from datetime import datetime, timedelta\n", + "import pandas as pd\n", + "from tms_data_interface import SQLQueryInterface\n", + "\n", + "query = \"\"\"\n", + "WITH time_windows AS (\n", + " SELECT\n", + " -- End time is the current trade time\n", + " date_time AS end_time,\n", + "\n", + " -- Subtract seconds from the end_time using date_add() with negative integer interval\n", + " date_add('second', -{time_window_s}, date_time) AS start_time,\n", + "\n", + " -- Trade details\n", + " trade_price,\n", + " trade_volume,\n", + " trader_id,\n", + "\n", + " -- Calculate minimum price within the time window\n", + " MIN(trade_price) OVER (\n", + " ORDER BY date_time \n", + " RANGE BETWEEN INTERVAL '{time_window_s}' SECOND PRECEDING AND CURRENT ROW\n", + " ) AS min_price,\n", + "\n", + " -- Calculate maximum price within the time window\n", + " MAX(trade_price) OVER (\n", + " ORDER BY date_time \n", + " RANGE BETWEEN INTERVAL '{time_window_s}' SECOND PRECEDING AND CURRENT ROW\n", + " ) AS max_price,\n", + "\n", + " -- Calculate total trade volume within the time window\n", + " SUM(trade_volume) OVER ( \n", + " ORDER BY date_time \n", + " RANGE BETWEEN INTERVAL '{time_window_s}' SECOND PRECEDING AND CURRENT ROW\n", + " ) AS total_volume,\n", + "\n", + " -- Calculate participant's trade volume within the time window\n", + " SUM(CASE WHEN trader_id = trader_id THEN trade_volume ELSE 0 END) OVER (\n", + " PARTITION BY trader_id \n", + " ORDER BY date_time \n", + " RANGE BETWEEN INTERVAL '{time_window_s}' SECOND PRECEDING AND CURRENT ROW\n", + " ) AS participant_volume\n", + " FROM\n", + " {trade_data_1b}\n", + ")\n", + "SELECT\n", + " -- Select the time window details\n", + " start_time,\n", + " end_time,\n", + "\n", + " -- Select the participant (trader) ID\n", + " trader_id AS \"Participant\",\n", + "\n", + " -- Select the calculated min and max prices\n", + " min_price,\n", + " max_price,\n", + "\n", + " -- Calculate the price change percentage\n", + " (max_price - min_price) / NULLIF(min_price, 0) * 100 AS \"Price Change (%)\",\n", + "\n", + " -- Calculate the participant's volume as a percentage of total volume\n", + " (participant_volume / NULLIF(total_volume, 0)) * 100 AS \"Volume (%)\",\n", + "\n", + " -- Participant volume\n", + " participant_volume,\n", + "\n", + " -- Select the total volume within the window\n", + " total_volume AS \"Total Volume\"\n", + "FROM\n", + " time_windows\n", + "\"\"\"\n", + "\n", + "\n", + "from tms_data_interface import SQLQueryInterface\n", + "\n", + "class Scenario:\n", + " seq = SQLQueryInterface(schema=\"trade_schema\")\n", + " def logic(self, **kwargs):\n", + " validation_window = kwargs.get('validation_window', 300000)\n", + " time_window_s = int(validation_window/1000)\n", + " query_start_time = datetime.now()\n", + " print(\"Query start time :\",query_start_time)\n", + " row_list = self.seq.execute_raw(query.format(trade_data_1b=\"trade_10m_v3\",\n", + " time_window_s = time_window_s)\n", + " )\n", + " cols = [\n", + " 'START_DATE_TIME',\n", + " 'END_DATE_TIME',\n", + " 'Focal_id',\n", + " 'MIN_PRICE',\n", + " 'MAX_PRICE',\n", + " 'PRICE_CHANGE_PCT',\n", + " 'PARTICIPANT_VOLUME_PCT',\n", + " 'PARTICIPANT_VOLUME',\n", + " 'TOTAL_VOLUME',\n", + " ]\n", + " final_scenario_df = pd.DataFrame(row_list, columns = cols)\n", + " final_scenario_df['PARTICIPANT_VOLUME_PCT'] = final_scenario_df['PARTICIPANT_VOLUME']/\\\n", + " final_scenario_df['TOTAL_VOLUME'] * 100\n", + " final_scenario_df['Segment'] = 'Default'\n", + " final_scenario_df['SAR_FLAG'] = 'N'\n", + " final_scenario_df['Risk'] = 'Low Risk'\n", + " final_scenario_df.dropna(inplace=True)\n", + " # final_scenario_df['RUN_DATE'] = final_scenario_df['END_DATE']\n", + " return final_scenario_df\n" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "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.11.8" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/main.py b/main.py new file mode 100644 index 0000000..6a08ef5 --- /dev/null +++ b/main.py @@ -0,0 +1,112 @@ +#!/usr/bin/env python +# coding: utf-8 + +# In[ ]: + + +from datetime import datetime, timedelta +import pandas as pd +from tms_data_interface import SQLQueryInterface + +query = """ +WITH time_windows AS ( + SELECT + -- End time is the current trade time + date_time AS end_time, + + -- Subtract seconds from the end_time using date_add() with negative integer interval + date_add('second', -{time_window_s}, date_time) AS start_time, + + -- Trade details + trade_price, + trade_volume, + trader_id, + + -- Calculate minimum price within the time window + MIN(trade_price) OVER ( + ORDER BY date_time + RANGE BETWEEN INTERVAL '{time_window_s}' SECOND PRECEDING AND CURRENT ROW + ) AS min_price, + + -- Calculate maximum price within the time window + MAX(trade_price) OVER ( + ORDER BY date_time + RANGE BETWEEN INTERVAL '{time_window_s}' SECOND PRECEDING AND CURRENT ROW + ) AS max_price, + + -- Calculate total trade volume within the time window + SUM(trade_volume) OVER ( + ORDER BY date_time + RANGE BETWEEN INTERVAL '{time_window_s}' SECOND PRECEDING AND CURRENT ROW + ) AS total_volume, + + -- Calculate participant's trade volume within the time window + SUM(CASE WHEN trader_id = trader_id THEN trade_volume ELSE 0 END) OVER ( + PARTITION BY trader_id + ORDER BY date_time + RANGE BETWEEN INTERVAL '{time_window_s}' SECOND PRECEDING AND CURRENT ROW + ) AS participant_volume + FROM + {trade_data_1b} +) +SELECT + -- Select the time window details + start_time, + end_time, + + -- Select the participant (trader) ID + trader_id AS "Participant", + + -- Select the calculated min and max prices + min_price, + max_price, + + -- Calculate the price change percentage + (max_price - min_price) / NULLIF(min_price, 0) * 100 AS "Price Change (%)", + + -- Calculate the participant's volume as a percentage of total volume + (participant_volume / NULLIF(total_volume, 0)) * 100 AS "Volume (%)", + + -- Participant volume + participant_volume, + + -- Select the total volume within the window + total_volume AS "Total Volume" +FROM + time_windows +""" + + +from tms_data_interface import SQLQueryInterface + +class Scenario: + seq = SQLQueryInterface(schema="trade_schema") + def logic(self, **kwargs): + validation_window = kwargs.get('validation_window', 300000) + time_window_s = int(validation_window/1000) + query_start_time = datetime.now() + print("Query start time :",query_start_time) + row_list = self.seq.execute_raw(query.format(trade_data_1b="trade_10m_v3", + time_window_s = time_window_s) + ) + cols = [ + 'START_DATE_TIME', + 'END_DATE_TIME', + 'Focal_id', + 'MIN_PRICE', + 'MAX_PRICE', + 'PRICE_CHANGE_PCT', + 'PARTICIPANT_VOLUME_PCT', + 'PARTICIPANT_VOLUME', + 'TOTAL_VOLUME', + ] + final_scenario_df = pd.DataFrame(row_list, columns = cols) + final_scenario_df['PARTICIPANT_VOLUME_PCT'] = final_scenario_df['PARTICIPANT_VOLUME']/\ + final_scenario_df['TOTAL_VOLUME'] * 100 + final_scenario_df['Segment'] = 'Default' + final_scenario_df['SAR_FLAG'] = 'N' + final_scenario_df['Risk'] = 'Low Risk' + final_scenario_df.dropna(inplace=True) + # final_scenario_df['RUN_DATE'] = final_scenario_df['END_DATE'] + return final_scenario_df +