diff --git a/data.ipynb b/data.ipynb
new file mode 100644
index 0000000..9e0ca72
--- /dev/null
+++ b/data.ipynb
@@ -0,0 +1,496 @@
+{
+ "cells": [
+ {
+ "cell_type": "code",
+ "execution_count": 1,
+ "id": "2acce44b",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "import pandas as pd"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 14,
+ "id": "5ba70af7",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "
\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " | \n",
+ " Timestamp | \n",
+ " Open | \n",
+ " High | \n",
+ " Low | \n",
+ " Close | \n",
+ " Volume | \n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " | 7317754 | \n",
+ " 2025-11-30 23:55:00+00:00 | \n",
+ " 90405.0 | \n",
+ " 90452.0 | \n",
+ " 90403.0 | \n",
+ " 90452.0 | \n",
+ " 0.531700 | \n",
+ "
\n",
+ " \n",
+ " | 7317755 | \n",
+ " 2025-11-30 23:56:00+00:00 | \n",
+ " 90452.0 | \n",
+ " 90481.0 | \n",
+ " 90420.0 | \n",
+ " 90420.0 | \n",
+ " 0.055547 | \n",
+ "
\n",
+ " \n",
+ " | 7317756 | \n",
+ " 2025-11-30 23:57:00+00:00 | \n",
+ " 90412.0 | \n",
+ " 90458.0 | \n",
+ " 90396.0 | \n",
+ " 90435.0 | \n",
+ " 0.301931 | \n",
+ "
\n",
+ " \n",
+ " | 7317757 | \n",
+ " 2025-11-30 23:58:00+00:00 | \n",
+ " 90428.0 | \n",
+ " 90428.0 | \n",
+ " 90362.0 | \n",
+ " 90362.0 | \n",
+ " 4.591653 | \n",
+ "
\n",
+ " \n",
+ " | 7317758 | \n",
+ " 2025-11-30 23:59:00+00:00 | \n",
+ " 90363.0 | \n",
+ " 90386.0 | \n",
+ " 90362.0 | \n",
+ " 90382.0 | \n",
+ " 0.410369 | \n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
"
+ ],
+ "text/plain": [
+ " Timestamp Open High Low Close \\\n",
+ "7317754 2025-11-30 23:55:00+00:00 90405.0 90452.0 90403.0 90452.0 \n",
+ "7317755 2025-11-30 23:56:00+00:00 90452.0 90481.0 90420.0 90420.0 \n",
+ "7317756 2025-11-30 23:57:00+00:00 90412.0 90458.0 90396.0 90435.0 \n",
+ "7317757 2025-11-30 23:58:00+00:00 90428.0 90428.0 90362.0 90362.0 \n",
+ "7317758 2025-11-30 23:59:00+00:00 90363.0 90386.0 90362.0 90382.0 \n",
+ "\n",
+ " Volume \n",
+ "7317754 0.531700 \n",
+ "7317755 0.055547 \n",
+ "7317756 0.301931 \n",
+ "7317757 4.591653 \n",
+ "7317758 0.410369 "
+ ]
+ },
+ "execution_count": 14,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "df = pd.read_csv(\"data.csv\")\n",
+ "df['Timestamp'] = pd.to_datetime(df['Timestamp'], unit='s', utc=True)\n",
+ "df.tail()"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 19,
+ "id": "d4b22f3b",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " | \n",
+ " Timestamp | \n",
+ " Low | \n",
+ " High | \n",
+ " Open | \n",
+ " Close | \n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " | 5078 | \n",
+ " 2025-11-26 | \n",
+ " 86304.0 | \n",
+ " 90646.0 | \n",
+ " 87331.0 | \n",
+ " 90477.0 | \n",
+ "
\n",
+ " \n",
+ " | 5079 | \n",
+ " 2025-11-27 | \n",
+ " 90091.0 | \n",
+ " 91926.0 | \n",
+ " 90476.0 | \n",
+ " 91325.0 | \n",
+ "
\n",
+ " \n",
+ " | 5080 | \n",
+ " 2025-11-28 | \n",
+ " 90233.0 | \n",
+ " 93091.0 | \n",
+ " 91326.0 | \n",
+ " 90913.0 | \n",
+ "
\n",
+ " \n",
+ " | 5081 | \n",
+ " 2025-11-29 | \n",
+ " 90216.0 | \n",
+ " 91179.0 | \n",
+ " 90913.0 | \n",
+ " 90832.0 | \n",
+ "
\n",
+ " \n",
+ " | 5082 | \n",
+ " 2025-11-30 | \n",
+ " 90362.0 | \n",
+ " 91969.0 | \n",
+ " 90832.0 | \n",
+ " 90382.0 | \n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
"
+ ],
+ "text/plain": [
+ " Timestamp Low High Open Close\n",
+ "5078 2025-11-26 86304.0 90646.0 87331.0 90477.0\n",
+ "5079 2025-11-27 90091.0 91926.0 90476.0 91325.0\n",
+ "5080 2025-11-28 90233.0 93091.0 91326.0 90913.0\n",
+ "5081 2025-11-29 90216.0 91179.0 90913.0 90832.0\n",
+ "5082 2025-11-30 90362.0 91969.0 90832.0 90382.0"
+ ]
+ },
+ "execution_count": 19,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "df_days = (\n",
+ " df.groupby(df[\"Timestamp\"].dt.date)\n",
+ " .agg({\"Low\": \"min\", \"High\": \"max\", \"Open\": \"first\", \"Close\": \"last\"})\n",
+ " .reset_index()\n",
+ ")\n",
+ "df_days.tail()"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 21,
+ "id": "91823496",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " | \n",
+ " Timestamp | \n",
+ " Low | \n",
+ " High | \n",
+ " Open | \n",
+ " Close | \n",
+ " Avg | \n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " | 5078 | \n",
+ " 2025-11-26 | \n",
+ " 86304.0 | \n",
+ " 90646.0 | \n",
+ " 87331.0 | \n",
+ " 90477.0 | \n",
+ " 88475.0 | \n",
+ "
\n",
+ " \n",
+ " | 5079 | \n",
+ " 2025-11-27 | \n",
+ " 90091.0 | \n",
+ " 91926.0 | \n",
+ " 90476.0 | \n",
+ " 91325.0 | \n",
+ " 91008.5 | \n",
+ "
\n",
+ " \n",
+ " | 5080 | \n",
+ " 2025-11-28 | \n",
+ " 90233.0 | \n",
+ " 93091.0 | \n",
+ " 91326.0 | \n",
+ " 90913.0 | \n",
+ " 91662.0 | \n",
+ "
\n",
+ " \n",
+ " | 5081 | \n",
+ " 2025-11-29 | \n",
+ " 90216.0 | \n",
+ " 91179.0 | \n",
+ " 90913.0 | \n",
+ " 90832.0 | \n",
+ " 90697.5 | \n",
+ "
\n",
+ " \n",
+ " | 5082 | \n",
+ " 2025-11-30 | \n",
+ " 90362.0 | \n",
+ " 91969.0 | \n",
+ " 90832.0 | \n",
+ " 90382.0 | \n",
+ " 91165.5 | \n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
"
+ ],
+ "text/plain": [
+ " Timestamp Low High Open Close Avg\n",
+ "5078 2025-11-26 86304.0 90646.0 87331.0 90477.0 88475.0\n",
+ "5079 2025-11-27 90091.0 91926.0 90476.0 91325.0 91008.5\n",
+ "5080 2025-11-28 90233.0 93091.0 91326.0 90913.0 91662.0\n",
+ "5081 2025-11-29 90216.0 91179.0 90913.0 90832.0 90697.5\n",
+ "5082 2025-11-30 90362.0 91969.0 90832.0 90382.0 91165.5"
+ ]
+ },
+ "execution_count": 21,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "df_days[\"Avg\"] = (df_days[\"Low\"] + df_days[\"High\"]) / 2\n",
+ "df_days.tail()"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 25,
+ "id": "9a7b3310",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " | \n",
+ " start_date | \n",
+ " end_date | \n",
+ " min_open | \n",
+ " max_close | \n",
+ " start_avg | \n",
+ " end_avg | \n",
+ " change | \n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " | 335 | \n",
+ " 2025-02-27 | \n",
+ " 2025-04-23 | \n",
+ " 76252.0 | \n",
+ " 94273.0 | \n",
+ " 84801.5 | \n",
+ " 93335.0 | \n",
+ " 0.100629 | \n",
+ "
\n",
+ " \n",
+ " | 336 | \n",
+ " 2025-04-24 | \n",
+ " 2025-05-09 | \n",
+ " 93730.0 | \n",
+ " 103261.0 | \n",
+ " 92867.5 | \n",
+ " 103341.0 | \n",
+ " 0.112779 | \n",
+ "
\n",
+ " \n",
+ " | 337 | \n",
+ " 2025-05-10 | \n",
+ " 2025-07-11 | \n",
+ " 100990.0 | \n",
+ " 117579.0 | \n",
+ " 103915.0 | \n",
+ " 117032.5 | \n",
+ " 0.126233 | \n",
+ "
\n",
+ " \n",
+ " | 338 | \n",
+ " 2025-07-12 | \n",
+ " 2025-11-04 | \n",
+ " 106470.0 | \n",
+ " 124728.0 | \n",
+ " 117599.0 | \n",
+ " 103079.0 | \n",
+ " 0.123470 | \n",
+ "
\n",
+ " \n",
+ " | 339 | \n",
+ " 2025-11-05 | \n",
+ " 2025-11-18 | \n",
+ " 92112.0 | \n",
+ " 105972.0 | \n",
+ " 101737.5 | \n",
+ " 91471.0 | \n",
+ " 0.100912 | \n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
"
+ ],
+ "text/plain": [
+ " start_date end_date min_open max_close start_avg end_avg \\\n",
+ "335 2025-02-27 2025-04-23 76252.0 94273.0 84801.5 93335.0 \n",
+ "336 2025-04-24 2025-05-09 93730.0 103261.0 92867.5 103341.0 \n",
+ "337 2025-05-10 2025-07-11 100990.0 117579.0 103915.0 117032.5 \n",
+ "338 2025-07-12 2025-11-04 106470.0 124728.0 117599.0 103079.0 \n",
+ "339 2025-11-05 2025-11-18 92112.0 105972.0 101737.5 91471.0 \n",
+ "\n",
+ " change \n",
+ "335 0.100629 \n",
+ "336 0.112779 \n",
+ "337 0.126233 \n",
+ "338 0.123470 \n",
+ "339 0.100912 "
+ ]
+ },
+ "execution_count": 25,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "intervals = []\n",
+ "start_idx = 0\n",
+ "price_base = df_days.loc[start_idx, \"Avg\"]\n",
+ "\n",
+ "for i in range(1, len(df_days)):\n",
+ " price_now = df_days.loc[i, \"Avg\"]\n",
+ " change = abs(price_now - price_base) / price_base\n",
+ "\n",
+ " if change >= 0.10:\n",
+ " interval = df_days.loc[start_idx:i]\n",
+ " \n",
+ " intervals.append({\n",
+ " \"start_date\": df_days.loc[start_idx, \"Timestamp\"],\n",
+ " \"end_date\": df_days.loc[i, \"Timestamp\"],\n",
+ " \"min_open\": interval[\"Open\"].min(),\n",
+ " \"max_close\": interval[\"Close\"].max(),\n",
+ " \"start_avg\": price_base,\n",
+ " \"end_avg\": price_now,\n",
+ " \"change\": change,\n",
+ " })\n",
+ "\n",
+ " start_idx = i + 1\n",
+ " if start_idx >= len(df_days):\n",
+ " break\n",
+ " price_base = df_days.loc[start_idx, \"Avg\"]\n",
+ "\n",
+ "df_intervals = pd.DataFrame(intervals)\n",
+ "df_intervals.tail()"
+ ]
+ }
+ ],
+ "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.12.12"
+ }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 5
+}