AIM-PIbd-31-Masenkin-M-S/lab_7/fuzzy_regression.ipynb

964 lines
208 KiB
Plaintext
Raw Normal View History

2025-02-07 06:02:14 +04:00
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Датасет: [Tesla Insider Trading](https://www.kaggle.com/datasets/ilyaryabov/tesla-insider-trading).\n",
"\n",
"### Описание датасета:\n",
"\n",
"Датасет представляет собой выборку операций с ценными бумагами компании Tesla, совершённых инсайдерами, и является частью более крупного проекта \"Insider Trading S&P500 Inside Info\". Данные охватывают транзакции с участием крупных акционеров и должностных лиц компании, включая такие операции, как покупка, продажа и опционы, начиная с 10 ноября 2021 года и до 27 июля 2022 года.\n",
"\n",
"---\n",
"\n",
"### Анализ сведений:\n",
"\n",
"**Проблемная область:**\n",
"Проблемная область данного датасета касается анализа инсайдерских сделок в публичных компаниях, а также их влияния на ценообразование акций. Инсайдерские транзакции, совершаемые людьми с доступом к непубличной информации (такими как руководители, крупные акционеры или члены совета директоров), могут быть индикаторами будущих изменений стоимости акций. Исследование таких транзакций помогает понять, как информация внутри компании отражается в действиях ключевых участников, и может выявить паттерны поведения, которые влияют на рынки.\n",
"\n",
"**Актуальность:**\n",
"Анализ инсайдерских сделок становится особенно важным в условиях высокой волатильности рынка и неопределенности. Инвесторы, аналитики и компании используют такие данные, чтобы лучше понимать сигналы от крупных акционеров и должностных лиц. Действия инсайдеров, такие как покупки и продажи акций, нередко рассматриваются как индикаторы доверия к компании, что может оказывать значительное влияние на рыночные ожидания и прогнозы.\n",
"\n",
"**Объекты наблюдений:**\n",
"Объектами наблюдений в датасете являются инсайдеры компании Tesla — лица, имеющие значительное влияние на управление и информацию компании. Каждый объект характеризуется различными параметрами, включая должность, тип транзакции, количество акций и общую стоимость сделок.\n",
"\n",
"**Атрибуты объектов:**\n",
"- Insider Trading: ФИО лица, совершившего транзакцию.\n",
"- Relationship: Должность или статус данного лица в компании Tesla.\n",
"- Date: Дата завершения транзакции.\n",
"- Transaction: Тип транзакции.\n",
"- Cost: Цена одной акции на момент совершения транзакции.\n",
"- Shares: Количество акций, участвующих в транзакции.\n",
"- Value ($): Общая стоимость транзакции в долларах США.\n",
"- Shares Total: Общее количество акций, принадлежащих этому лицу после завершения данной транзакции.\n",
"- SEC Form 4: Дата записи транзакции в форме SEC Form 4, обязательной для отчётности о сделках инсайдеров.\n",
"\n",
"---"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Выгрузка данных из файла в DataFrame:"
]
},
{
"cell_type": "code",
"execution_count": 137,
"metadata": {},
"outputs": [],
"source": [
"import pandas as pd\n",
"from pandas import DataFrame\n",
"\n",
"\n",
"df: DataFrame = pd.read_csv(\"..//static//csv//TSLA.csv\")\n",
"\n",
"# Преобразование типов данных\n",
"df[\"Insider Trading\"] = df[\"Insider Trading\"].astype(\"category\") # Преобразование в категорию\n",
"df[\"Relationship\"] = df[\"Relationship\"].astype(\"category\") # Преобразование в категорию\n",
"df[\"Transaction\"] = df[\"Transaction\"].astype(\"category\") # Преобразование в категорию\n",
"df[\"Cost\"] = pd.to_numeric(df[\"Cost\"], errors=\"coerce\") # Преобразование в float\n",
"df[\"Shares\"] = pd.to_numeric(df[\"Shares\"].str.replace(\",\", \"\"), errors=\"coerce\") # Преобразование в float с удалением запятых\n",
"df[\"Value ($)\"] = pd.to_numeric(df[\"Value ($)\"].str.replace(\",\", \"\"), errors=\"coerce\") # Преобразование в float с удалением запятых\n",
"df[\"Shares Total\"] = pd.to_numeric(df[\"Shares Total\"].str.replace(\",\", \"\"), errors=\"coerce\") # Преобразование в float с удалением запятых"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Краткая информация о DataFrame:"
]
},
{
"cell_type": "code",
"execution_count": 138,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"<class 'pandas.core.frame.DataFrame'>\n",
"RangeIndex: 156 entries, 0 to 155\n",
"Data columns (total 9 columns):\n",
" # Column Non-Null Count Dtype \n",
"--- ------ -------------- ----- \n",
" 0 Insider Trading 156 non-null category\n",
" 1 Relationship 156 non-null category\n",
" 2 Date 156 non-null object \n",
" 3 Transaction 156 non-null category\n",
" 4 Cost 156 non-null float64 \n",
" 5 Shares 156 non-null int64 \n",
" 6 Value ($) 156 non-null int64 \n",
" 7 Shares Total 156 non-null int64 \n",
" 8 SEC Form 4 156 non-null object \n",
"dtypes: category(3), float64(1), int64(3), object(2)\n",
"memory usage: 8.6+ KB\n"
]
},
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>count</th>\n",
" <th>mean</th>\n",
" <th>std</th>\n",
" <th>min</th>\n",
" <th>25%</th>\n",
" <th>50%</th>\n",
" <th>75%</th>\n",
" <th>max</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>Cost</th>\n",
" <td>156.0</td>\n",
" <td>4.787856e+02</td>\n",
" <td>4.489229e+02</td>\n",
" <td>0.0</td>\n",
" <td>50.5225</td>\n",
" <td>240.225</td>\n",
" <td>9.341075e+02</td>\n",
" <td>1.171040e+03</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Shares</th>\n",
" <td>156.0</td>\n",
" <td>5.404666e+05</td>\n",
" <td>1.530835e+06</td>\n",
" <td>121.0</td>\n",
" <td>3500.0000</td>\n",
" <td>10500.000</td>\n",
" <td>3.017978e+05</td>\n",
" <td>1.192000e+07</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Value ($)</th>\n",
" <td>156.0</td>\n",
" <td>1.818582e+08</td>\n",
" <td>4.131734e+08</td>\n",
" <td>0.0</td>\n",
" <td>271008.0000</td>\n",
" <td>2026823.000</td>\n",
" <td>1.487132e+08</td>\n",
" <td>2.278695e+09</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Shares Total</th>\n",
" <td>156.0</td>\n",
" <td>3.347679e+07</td>\n",
" <td>9.553593e+07</td>\n",
" <td>49.0</td>\n",
" <td>25103.5000</td>\n",
" <td>73488.000</td>\n",
" <td>1.507274e+06</td>\n",
" <td>4.554674e+08</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" count mean std min 25% \\\n",
"Cost 156.0 4.787856e+02 4.489229e+02 0.0 50.5225 \n",
"Shares 156.0 5.404666e+05 1.530835e+06 121.0 3500.0000 \n",
"Value ($) 156.0 1.818582e+08 4.131734e+08 0.0 271008.0000 \n",
"Shares Total 156.0 3.347679e+07 9.553593e+07 49.0 25103.5000 \n",
"\n",
" 50% 75% max \n",
"Cost 240.225 9.341075e+02 1.171040e+03 \n",
"Shares 10500.000 3.017978e+05 1.192000e+07 \n",
"Value ($) 2026823.000 1.487132e+08 2.278695e+09 \n",
"Shares Total 73488.000 1.507274e+06 4.554674e+08 "
]
},
"execution_count": 138,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# Краткая информация о DataFrame\n",
"df.info()\n",
"\n",
"# Статистическое описание числовых столбцов\n",
"df.describe().transpose()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Выбор входных данных и целевого признака:\n",
"\n",
"**Входные данные:**\n",
"\n",
"- Transaction (Тип транзакции): Категориальная переменная, указывающая на тип операции (Sale, Option Exercise).\n",
"- Shares (Количество акций): Числовая переменная, указывающая количество акций в транзакции.\n",
"- Value ($): Числовая переменная, представляющая общую стоимость транзакции.\n",
"\n",
"**Целевой признак:**\n",
"\n",
"Cost (Цена акции): Числовая переменная, показывающая стоимость одной акции на момент совершения транзакции.\n",
"\n",
"---"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Определение лингвистических переменных:\n",
"\n",
"**Лингвистическая переменная** это переменная, значениями которой являются слова или фразы вместо чисел. Она используется в нечеткой логике и теории нечетких множеств для описания понятий, которые нельзя точно выразить числовыми значениями.\n",
"\n",
"Для каждой переменной определим количество термов, типы и параметры функций принадлежности."
]
},
{
"cell_type": "code",
"execution_count": 139,
"metadata": {},
"outputs": [],
"source": [
"import numpy as np\n",
"from skfuzzy import control as ctrl\n",
"\n",
"\n",
"transaction = ctrl.Antecedent(np.arange(0, 2, 1), \"Transaction\")\n",
"shares = ctrl.Antecedent(np.arange(0, 12000000, 1), \"Shares\")\n",
"value = ctrl.Antecedent(np.arange(0, 2.3e9, 1e6), \"Value\")\n",
"cost = ctrl.Consequent(np.arange(0, 1200, 1), \"Cost\")"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Определение нечетких переменных:"
]
},
{
"cell_type": "code",
"execution_count": 140,
"metadata": {},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"d:\\ULSTU\\Семестр 5\\AIM-PIbd-31-Masenkin-M-S\\aimenv\\Lib\\site-packages\\skfuzzy\\control\\fuzzyvariable.py:125: UserWarning: FigureCanvasAgg is non-interactive, and thus cannot be shown\n",
" fig.show()\n",
"d:\\ULSTU\\Семестр 5\\AIM-PIbd-31-Masenkin-M-S\\aimenv\\Lib\\site-packages\\IPython\\core\\events.py:82: UserWarning: Creating legend with loc=\"best\" can be slow with large amounts of data.\n",
" func(*args, **kwargs)\n"
]
},
{
"data": {
"image/png": "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
"text/plain": [
"<Figure size 640x480 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"name": "stderr",
"output_type": "stream",
"text": [
"d:\\ULSTU\\Семестр 5\\AIM-PIbd-31-Masenkin-M-S\\aimenv\\Lib\\site-packages\\IPython\\core\\pylabtools.py:170: UserWarning: Creating legend with loc=\"best\" can be slow with large amounts of data.\n",
" fig.canvas.print_figure(bytes_io, **kw)\n"
]
},
{
"data": {
"image/png": "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
"text/plain": [
"<Figure size 640x480 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAjcAAAGyCAYAAAAYveVYAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjAsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvlHJYcgAAAAlwSFlzAAAPYQAAD2EBqD+naQAAgxpJREFUeJzt3QV402fXx/FvvcUKpUCR4l6guBUd7rANmLONCQwYOrQUK64bOjcm2CjuDsXd3aG4tpTqe93/vPDAhrQl7R05n+vKszZNkx9PSDi57TjEx8fHI4QQQghhIxx1BxBCCCGEMCcpboQQQghhU6S4EUIIIYRNkeJGCCGEEDZFihshhBBC2BQpboQQQghhU6S4EUIIIYRNkeJGCCGEEDZFihshhBBC2BS7K27Ugcx37941/iuEEEII26O1uFm/fj1NmjQhW7ZsODg4EBIS8tLfWbt2LaVLl8bNzY38+fPzyy+/JOox7927h6enp/FfIYQQQtgercVNeHg4/v7+TJ48OUG3P336NI0aNaJmzZrs2bOHLl268Mknn7Bs2bJkzyqEEEII6+BgKY0z1cjN3Llzad68+XNv06tXLxYtWsSBAwceX/fWW29x+/Ztli5dmqDHUVNSauTmzp07pEuXzizZhRBCCJG8VLmiagWbW3OzefNmateu/dR19erVM65/nocPHxoFzZMX5f7DmGTPK4RIYUeXwuy2EGl6nQshbMe8k/MSfFurKm7CwsLIkiXLU9ep71XB8uDBg2f+zvDhw42RmkcXX19f4/oxy46kSGYhRAq5cwFmfwQHZsPyQN1phBBmFBYexshtI22zuEmKPn36GFNQjy7nz583rp+98yJrjl7VHU8IYQ5qdn1eR3BPD7UHwq5f4fgK3amEEGaajgraFEQql1S2Wdz4+Phw5cqVp65T36u1Mx4eHs/8HbWrSv38yYtSOX9Ges/Zx52I6BTJLoRIRjt+glNroOlECOgC+WrB/E7w4JbuZEKIVzTr2Cw2X97M4MqDbbO4qVSpEqtWrXrquhUrVhjXJ9bgpn5ERMUycMFBMyYUQqS4m6dheX8o8yEUqK12J5iKnKgIWNJLdzohxCs4f+88Y3aM4c2CbxKQPcA6ipv79+8bW7rV5dFWb/X1uXPnHk8pffDBB49v365dO06dOkXPnj05cuQIU6ZMYebMmXTt2jXRj+3j6cGgpn7M3X2RpQfCzPinEkKkmLg4CPkCUmeEusH/u94zOzQYCftmwOEFOhMKIZIoLj6OwI2BeLl70aNsj0T9rtbiZseOHZQqVcq4KN26dTO+DgoKMr6/fPny40JHyZMnj7EVXI3WqPNxxo4dyw8//GDsmEqKFqWyU6doFvrN3c+N+w/N9KcSQqSYrVPhXCg0mwJuaZ/+mf9bUKgRLOgC4dd1JRRCJNH0Q9PZdXUXQwKGkNoltXWec5NS/n3OzbV7D6k7fh0V82ZkyrulE7yHXgih2bVj8G1V03SUGqV5lvtXYXIFyF0FWv1mmrISQli8U3dO0WpBK1oWbEmv8omfXraqNTfJIVNaN4KbF2fJgTDm772kO44QIiFiYyCkHaTLDrUGPP92aTJD43FweD4cmJOSCYUQSRQTF2NMR/mk9uHL0l8m6T7svrhRGpXIShP/bATNO8jVu5G64wghXib0a7i0G1pMA9eXbA/1awF+r8Oi7nBP1tcJYel+OfgLB28cJDggGA/nZ++Efhkpbp7YPeXq7Ejvf/ZLx3AhLFnYAVgzHCp/Cb7lE/Y7jcaCkyvM/9J0Jo4QwiIdvXmUyXsm86Hfh5TMXDLJ9yPFzf/LkNqV4S2Ks/rIVWbtuKA7jhDiWWKiTNNRGfNDzb4J/71UXtD0Gzi+DPb8kZwJhRBJFB0bTeCmQHKny02Hkh14FVLcPKF20Sy0LJODwQsPceFWhO44Qoh/Wz8arh6GFlPB2S1xv1uoAZR8F5b0htumk8qFEJbj233fcuLWCYZWGYqrGml9BVLc/Ev/JkVJ5+5Mrzn7iIuT4WshLMbFXbBhLFTtAdlMx0ckWv3h4J4O5nc0nZEjhLAIB68f5If9P/BZic8omrHoK9+fFDf/ks7dhVFv+rPpxA3+2HpWdxwhhBIdCXPbQRY/qJa4w7ye4u5pOr341FrY8aM5Ewohkuhh7EP6buxLwQwF+aTEJ5iDFDfPUKWAN+9VzMmwxUc4cz1cdxwhxJqhcOs0tPgWnFxe7b7y14KyH8OKILh5ylwJhRBJNHn3ZKPNgpqOcnF8xdf3/5Pi5jn6NChinIHz1ey9xMr0lBD6nNsCoRNNC4izvPpwtaHOEEidydS6IS7WPPcphEi03Vd3G1u/1QLiAhkKYC5S3DxHajdnxrT0Z8fZW/y08bTuOELYp6hwCGkPOcqatn6bi1saaK5aN2yBLVPNd79CiASLiI4wDusrnqm4sfXbnKS4eYHyebxoG5CH0cuPcvzKPd1xhLA/KwfC3cvQfBo4Opn3vnMHQMUvYNVguHbUvPcthHipr3d9zdWIqwwNGIqTmV/fUty8RI96hfDN4EH3WXuJiZXdFUKkmFPrYNt3UHsAeOdPnseo1R/S5zQtVlYtHYQQKWLr5a38eeRPupTpQm7P3Ga/fyluXsLdxYmxrUpy4OIdpq49qTuOEPYh8i7M6wC5qkD5z5PvcVw8TC0cLu+BTeOT73GEEI/dj7pP0KYgyvmU4+3Cb5McpLhJgJK+6fmiRn6+WX2cg5fu6I4jhO1b3g8e3ILmk8Exmd+m1HqegC6wdiSE7U/exxJCMGbHGG4/vM3gyoNxdEie17cUNwn0Za0C5MuUhu4z9xIVI9NTQiSbY8th129QNxgymH+4+plq9AbvgqbpKdXiQQiRLDZc2MCc43PoUa4HOdLmSJ4HkeIm4VRTzXGtSnLy2n2+WXVcdxwhbFPETZjfCfLVgjLm3T3xQqqVg5qeunYE1o9KuccVwo7ceXiHgaEDCcgWwJsF3kzWx5LiJhGKZkvHl68VYMraE+w+d0t3HCFsz5JeEP3AdIqwg0PKPnbWElC9F2wYBxd3puxjC2EHRmwbwYOYBwysPBCHZH59S3GTSO1r5KN4dk9j91RktBz+JYTZHJoP+2dCg5HgmV1Phipdwac4zG1vKrKEEGax6uwqFp5aSJ8KffBJ7UNyk+ImkZydHBnbyp8Ltx4wZpmcjSGEWYRfh4VdoVAj8H9LXw7V2kFNT906A6uD9eUQwobcjLzJ4C2Dqelbk8Z5G6fIY0pxkwT5M6flq7qF+HHTabadvqk7jhDWLT4eFnaB+DhoMiHlp6P+LXMReK0fbJ4MZzfrzSKElYuPjyd4SzBx8XEEVQpK9umoR6S4SaKPq+ShbK4M9Ji1l/CHcviXEEm2fzYcXgCNx0GazFiESh3Bt7yp9YNqASGESJIlp5ew4uwKAisG4u3hTUqR4iaJnBwdjN5T1+49ZPiSw7rjCGGdVGuFxT3A73Xwa4HFUEfBq95T98JgxQDdaYSwSldVa4WtQ2mQuwH1ctdL0ceW4uYV5MqYmr4NCzN9yzk2HL+mO44Q1jcdteBLcHKFRmOxOBnzQZ3BsP17OLVWdxohrG46atDmQbg6udK3Qt8Uf3wpbl7RuxVyEZA/Iz1n7+NuZLTuOEJYj93T4fhyaPoNpPLCIpX7BHJXhXkdIVJOJxcioUJOhLD+wnoGVBpAevf0pDQpbl6Ro6MDo970515kDIMXHNIdRwjrcPscLO0DJd+FQg2wWKr1Q7PJ8OA2LEv5T59CWKNL9y8xcvtImuVrRg3fGloySHFjBtnTexDUuCizd15g5aEruuMIYdni4kxNMd3TQf3hWLwMuaDeUNNI07FlutMIYdHi1K6o0CDSuqalV/le2nJIcWMmLcvm4LXCmen9z35uhUtvGiGea8ePcHq96RRid0+sQukPIH8dU2sI1SJCCPFMM4/OZOvlrQyqPMgocHSR4sZM1N79Ea8XJzo2jqD5B3XHEcIy3TgJK4Kg7MeQvxZWQ53NoYqxmEhY0lN3GiEs0rm75xi3cxytC7WmcrbKWrNIcWNGmdO5M7iZHwv2XmLRvsu64whhWeJiIeQLSJ0
"text/plain": [
"<Figure size 640x480 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"image/png": "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
"text/plain": [
"<Figure size 640x480 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"import skfuzzy as fuzz\n",
"\n",
"\n",
"transaction[\"Option Exercise\"] = fuzz.trimf(transaction.universe, [0, 0, 1])\n",
"transaction[\"Sale\"] = fuzz.trimf(transaction.universe, [0, 1, 1])\n",
"transaction.view()\n",
"\n",
"# shares[\"Few\"] = fuzz.zmf(shares.universe, 0, 20000)\n",
"# shares[\"Moderate\"] = fuzz.trimf(shares.universe, [10000, 50000, 500000])\n",
"# shares[\"Many\"] = fuzz.smf(shares.universe, 400000, 12000000)\n",
"shares.automf(3, names=[\"Few\", \"Moderate\", \"Many\"])\n",
"shares.view()\n",
"\n",
"# value[\"Low\"] = fuzz.zmf(value.universe, 0, 5e7)\n",
"# value[\"Medium\"] = fuzz.trimf(value.universe, [5e7, 1e8, 1e9])\n",
"# value[\"High\"] = fuzz.smf(value.universe, 1e9, 2.3e9)\n",
"value.automf(3, names=[\"Low\", \"Medium\", \"High\"])\n",
"value.view()\n",
"\n",
"# cost[\"Low\"] = fuzz.zmf(cost.universe, 0, 300)\n",
"# cost[\"Medium\"] = fuzz.trimf(cost.universe, [250, 500, 750])\n",
"# cost[\"High\"] = fuzz.smf(cost.universe, 700, 1200)\n",
"cost.automf(3, names=[\"Low\", \"Medium\", \"High\"])\n",
"cost.view()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Определение нечётких правил:"
]
},
{
"cell_type": "code",
"execution_count": 141,
"metadata": {},
"outputs": [],
"source": [
"rule1 = ctrl.Rule(transaction[\"Option Exercise\"] & shares[\"Few\"] & value[\"Low\"], cost[\"Low\"])\n",
"rule2 = ctrl.Rule(transaction[\"Option Exercise\"] & shares[\"Few\"] & value[\"Medium\"], cost[\"Low\"])\n",
"rule3 = ctrl.Rule(transaction[\"Option Exercise\"] & shares[\"Few\"] & value[\"High\"], cost[\"Medium\"])\n",
"rule4 = ctrl.Rule(transaction[\"Option Exercise\"] & shares[\"Moderate\"] & value[\"Low\"], cost[\"Low\"])\n",
"rule5 = ctrl.Rule(transaction[\"Option Exercise\"] & shares[\"Moderate\"] & value[\"Medium\"], cost[\"Medium\"])\n",
"rule6 = ctrl.Rule(transaction[\"Option Exercise\"] & shares[\"Moderate\"] & value[\"High\"], cost[\"High\"])\n",
"rule7 = ctrl.Rule(transaction[\"Option Exercise\"] & shares[\"Many\"] & value[\"Low\"], cost[\"Medium\"])\n",
"rule8 = ctrl.Rule(transaction[\"Option Exercise\"] & shares[\"Many\"] & value[\"Medium\"], cost[\"High\"])\n",
"rule9 = ctrl.Rule(transaction[\"Option Exercise\"] & shares[\"Many\"] & value[\"High\"], cost[\"High\"])\n",
"\n",
"rule10 = ctrl.Rule(transaction[\"Sale\"] & shares[\"Few\"] & value[\"Low\"], cost[\"Low\"])\n",
"rule11 = ctrl.Rule(transaction[\"Sale\"] & shares[\"Few\"] & value[\"Medium\"], cost[\"Low\"])\n",
"rule12 = ctrl.Rule(transaction[\"Sale\"] & shares[\"Few\"] & value[\"High\"], cost[\"Medium\"])\n",
"rule13 = ctrl.Rule(transaction[\"Sale\"] & shares[\"Moderate\"] & value[\"Low\"], cost[\"Low\"])\n",
"rule14 = ctrl.Rule(transaction[\"Sale\"] & shares[\"Moderate\"] & value[\"Medium\"], cost[\"Medium\"])\n",
"rule15 = ctrl.Rule(transaction[\"Sale\"] & shares[\"Moderate\"] & value[\"High\"], cost[\"High\"])\n",
"rule16 = ctrl.Rule(transaction[\"Sale\"] & shares[\"Many\"] & value[\"Low\"], cost[\"Medium\"])\n",
"rule17 = ctrl.Rule(transaction[\"Sale\"] & shares[\"Many\"] & value[\"Medium\"], cost[\"High\"])\n",
"rule18 = ctrl.Rule(transaction[\"Sale\"] & shares[\"Many\"] & value[\"High\"], cost[\"High\"])\n",
"# Всё ещё не нравится"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Создание нечеткой системы:"
]
},
{
"cell_type": "code",
"execution_count": 142,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"[IF (Transaction[Option Exercise] AND Shares[Few]) AND Value[Low] THEN Cost[Low]\n",
" \tAND aggregation function : fmin\n",
" \tOR aggregation function : fmax,\n",
" IF (Transaction[Option Exercise] AND Shares[Few]) AND Value[Medium] THEN Cost[Low]\n",
" \tAND aggregation function : fmin\n",
" \tOR aggregation function : fmax,\n",
" IF (Transaction[Option Exercise] AND Shares[Few]) AND Value[High] THEN Cost[Medium]\n",
" \tAND aggregation function : fmin\n",
" \tOR aggregation function : fmax,\n",
" IF (Transaction[Option Exercise] AND Shares[Moderate]) AND Value[Low] THEN Cost[Low]\n",
" \tAND aggregation function : fmin\n",
" \tOR aggregation function : fmax,\n",
" IF (Transaction[Option Exercise] AND Shares[Moderate]) AND Value[Medium] THEN Cost[Medium]\n",
" \tAND aggregation function : fmin\n",
" \tOR aggregation function : fmax,\n",
" IF (Transaction[Option Exercise] AND Shares[Moderate]) AND Value[High] THEN Cost[High]\n",
" \tAND aggregation function : fmin\n",
" \tOR aggregation function : fmax,\n",
" IF (Transaction[Option Exercise] AND Shares[Many]) AND Value[Low] THEN Cost[Medium]\n",
" \tAND aggregation function : fmin\n",
" \tOR aggregation function : fmax,\n",
" IF (Transaction[Option Exercise] AND Shares[Many]) AND Value[Medium] THEN Cost[High]\n",
" \tAND aggregation function : fmin\n",
" \tOR aggregation function : fmax,\n",
" IF (Transaction[Option Exercise] AND Shares[Many]) AND Value[High] THEN Cost[High]\n",
" \tAND aggregation function : fmin\n",
" \tOR aggregation function : fmax,\n",
" IF (Transaction[Sale] AND Shares[Few]) AND Value[Low] THEN Cost[Low]\n",
" \tAND aggregation function : fmin\n",
" \tOR aggregation function : fmax,\n",
" IF (Transaction[Sale] AND Shares[Few]) AND Value[Medium] THEN Cost[Low]\n",
" \tAND aggregation function : fmin\n",
" \tOR aggregation function : fmax,\n",
" IF (Transaction[Sale] AND Shares[Few]) AND Value[High] THEN Cost[Medium]\n",
" \tAND aggregation function : fmin\n",
" \tOR aggregation function : fmax,\n",
" IF (Transaction[Sale] AND Shares[Moderate]) AND Value[Low] THEN Cost[Low]\n",
" \tAND aggregation function : fmin\n",
" \tOR aggregation function : fmax,\n",
" IF (Transaction[Sale] AND Shares[Moderate]) AND Value[Medium] THEN Cost[Medium]\n",
" \tAND aggregation function : fmin\n",
" \tOR aggregation function : fmax,\n",
" IF (Transaction[Sale] AND Shares[Moderate]) AND Value[High] THEN Cost[High]\n",
" \tAND aggregation function : fmin\n",
" \tOR aggregation function : fmax,\n",
" IF (Transaction[Sale] AND Shares[Many]) AND Value[Low] THEN Cost[Medium]\n",
" \tAND aggregation function : fmin\n",
" \tOR aggregation function : fmax,\n",
" IF (Transaction[Sale] AND Shares[Many]) AND Value[Medium] THEN Cost[High]\n",
" \tAND aggregation function : fmin\n",
" \tOR aggregation function : fmax,\n",
" IF (Transaction[Sale] AND Shares[Many]) AND Value[High] THEN Cost[High]\n",
" \tAND aggregation function : fmin\n",
" \tOR aggregation function : fmax]"
]
},
"execution_count": 142,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"fuzzy_rules: list[ctrl.Rule] = [\n",
" rule1,\n",
" rule2,\n",
" rule3,\n",
" rule4,\n",
" rule5,\n",
" rule6,\n",
" rule7,\n",
" rule8,\n",
" rule9,\n",
" rule10,\n",
" rule11,\n",
" rule12,\n",
" rule13,\n",
" rule14,\n",
" rule15,\n",
" rule16,\n",
" rule17,\n",
" rule18,\n",
"]\n",
"\n",
"# Создание системы управления\n",
"cost_ctrl = ctrl.ControlSystem(fuzzy_rules)\n",
"\n",
"# Стимуляция системы управления\n",
"cost_sim = ctrl.ControlSystemSimulation(cost_ctrl)\n",
"\n",
"fuzzy_rules"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Тестирование нечёткой системы:"
]
},
{
"cell_type": "code",
"execution_count": 143,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>Transaction</th>\n",
" <th>Shares</th>\n",
" <th>Value ($)</th>\n",
" <th>Cost</th>\n",
" <th>Predicted cost</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>56</th>\n",
" <td>Option Exercise</td>\n",
" <td>2500</td>\n",
" <td>138300</td>\n",
" <td>55.32</td>\n",
" <td>200.001889</td>\n",
" </tr>\n",
" <tr>\n",
" <th>138</th>\n",
" <td>Option Exercise</td>\n",
" <td>2152681</td>\n",
" <td>13432729</td>\n",
" <td>6.24</td>\n",
" <td>236.449927</td>\n",
" </tr>\n",
" <tr>\n",
" <th>123</th>\n",
" <td>Option Exercise</td>\n",
" <td>2134440</td>\n",
" <td>13318906</td>\n",
" <td>6.24</td>\n",
" <td>235.991667</td>\n",
" </tr>\n",
" <tr>\n",
" <th>128</th>\n",
" <td>Sale</td>\n",
" <td>543452</td>\n",
" <td>555171415</td>\n",
" <td>1021.56</td>\n",
" <td>353.734614</td>\n",
" </tr>\n",
" <tr>\n",
" <th>127</th>\n",
" <td>Sale</td>\n",
" <td>390639</td>\n",
" <td>408039939</td>\n",
" <td>1044.54</td>\n",
" <td>304.168211</td>\n",
" </tr>\n",
" <tr>\n",
" <th>66</th>\n",
" <td>Sale</td>\n",
" <td>3500</td>\n",
" <td>2527350</td>\n",
" <td>722.10</td>\n",
" <td>200.649273</td>\n",
" </tr>\n",
" <tr>\n",
" <th>42</th>\n",
" <td>Option Exercise</td>\n",
" <td>8228</td>\n",
" <td>0</td>\n",
" <td>0.00</td>\n",
" <td>199.833987</td>\n",
" </tr>\n",
" <tr>\n",
" <th>26</th>\n",
" <td>Sale</td>\n",
" <td>10500</td>\n",
" <td>1885485</td>\n",
" <td>179.57</td>\n",
" <td>202.119571</td>\n",
" </tr>\n",
" <tr>\n",
" <th>134</th>\n",
" <td>Option Exercise</td>\n",
" <td>3283</td>\n",
" <td>0</td>\n",
" <td>0.00</td>\n",
" <td>199.833671</td>\n",
" </tr>\n",
" <tr>\n",
" <th>79</th>\n",
" <td>Sale</td>\n",
" <td>215528</td>\n",
" <td>212841259</td>\n",
" <td>987.53</td>\n",
" <td>252.897330</td>\n",
" </tr>\n",
" <tr>\n",
" <th>131</th>\n",
" <td>Sale</td>\n",
" <td>917</td>\n",
" <td>899091</td>\n",
" <td>980.47</td>\n",
" <td>200.047433</td>\n",
" </tr>\n",
" <tr>\n",
" <th>36</th>\n",
" <td>Sale</td>\n",
" <td>3750</td>\n",
" <td>1127212</td>\n",
" <td>300.59</td>\n",
" <td>200.706593</td>\n",
" </tr>\n",
" <tr>\n",
" <th>75</th>\n",
" <td>Option Exercise</td>\n",
" <td>3500</td>\n",
" <td>219520</td>\n",
" <td>62.72</td>\n",
" <td>200.100676</td>\n",
" </tr>\n",
" <tr>\n",
" <th>22</th>\n",
" <td>Option Exercise</td>\n",
" <td>16871</td>\n",
" <td>0</td>\n",
" <td>0.00</td>\n",
" <td>199.835187</td>\n",
" </tr>\n",
" <tr>\n",
" <th>135</th>\n",
" <td>Option Exercise</td>\n",
" <td>2133441</td>\n",
" <td>13312672</td>\n",
" <td>6.24</td>\n",
" <td>235.966640</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" Transaction Shares Value ($) Cost Predicted cost\n",
"56 Option Exercise 2500 138300 55.32 200.001889\n",
"138 Option Exercise 2152681 13432729 6.24 236.449927\n",
"123 Option Exercise 2134440 13318906 6.24 235.991667\n",
"128 Sale 543452 555171415 1021.56 353.734614\n",
"127 Sale 390639 408039939 1044.54 304.168211\n",
"66 Sale 3500 2527350 722.10 200.649273\n",
"42 Option Exercise 8228 0 0.00 199.833987\n",
"26 Sale 10500 1885485 179.57 202.119571\n",
"134 Option Exercise 3283 0 0.00 199.833671\n",
"79 Sale 215528 212841259 987.53 252.897330\n",
"131 Sale 917 899091 980.47 200.047433\n",
"36 Sale 3750 1127212 300.59 200.706593\n",
"75 Option Exercise 3500 219520 62.72 200.100676\n",
"22 Option Exercise 16871 0 0.00 199.835187\n",
"135 Option Exercise 2133441 13312672 6.24 235.966640"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>Transaction</th>\n",
" <th>Shares</th>\n",
" <th>Value ($)</th>\n",
" <th>Cost</th>\n",
" <th>Predicted cost</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>96</th>\n",
" <td>Option Exercise</td>\n",
" <td>3500</td>\n",
" <td>219520</td>\n",
" <td>62.72</td>\n",
" <td>200.100676</td>\n",
" </tr>\n",
" <tr>\n",
" <th>69</th>\n",
" <td>Sale</td>\n",
" <td>121</td>\n",
" <td>107447</td>\n",
" <td>887.99</td>\n",
" <td>199.861821</td>\n",
" </tr>\n",
" <tr>\n",
" <th>82</th>\n",
" <td>Sale</td>\n",
" <td>2258486</td>\n",
" <td>2007978676</td>\n",
" <td>889.08</td>\n",
" <td>619.839689</td>\n",
" </tr>\n",
" <tr>\n",
" <th>76</th>\n",
" <td>Sale</td>\n",
" <td>3500</td>\n",
" <td>3147970</td>\n",
" <td>899.42</td>\n",
" <td>200.649805</td>\n",
" </tr>\n",
" <tr>\n",
" <th>114</th>\n",
" <td>Sale</td>\n",
" <td>340564</td>\n",
" <td>333647031</td>\n",
" <td>979.69</td>\n",
" <td>286.706558</td>\n",
" </tr>\n",
" <tr>\n",
" <th>29</th>\n",
" <td>Sale</td>\n",
" <td>9650000</td>\n",
" <td>2012758726</td>\n",
" <td>208.58</td>\n",
" <td>753.891218</td>\n",
" </tr>\n",
" <tr>\n",
" <th>94</th>\n",
" <td>Option Exercise</td>\n",
" <td>25000</td>\n",
" <td>1309500</td>\n",
" <td>52.38</td>\n",
" <td>201.426112</td>\n",
" </tr>\n",
" <tr>\n",
" <th>132</th>\n",
" <td>Option Exercise</td>\n",
" <td>1786</td>\n",
" <td>0</td>\n",
" <td>0.00</td>\n",
" <td>199.833629</td>\n",
" </tr>\n",
" <tr>\n",
" <th>93</th>\n",
" <td>Option Exercise</td>\n",
" <td>1786</td>\n",
" <td>0</td>\n",
" <td>0.00</td>\n",
" <td>199.833629</td>\n",
" </tr>\n",
" <tr>\n",
" <th>139</th>\n",
" <td>Sale</td>\n",
" <td>126471</td>\n",
" <td>148102963</td>\n",
" <td>1171.04</td>\n",
" <td>231.142091</td>\n",
" </tr>\n",
" <tr>\n",
" <th>19</th>\n",
" <td>Sale</td>\n",
" <td>3768</td>\n",
" <td>670935</td>\n",
" <td>178.07</td>\n",
" <td>200.648862</td>\n",
" </tr>\n",
" <tr>\n",
" <th>90</th>\n",
" <td>Sale</td>\n",
" <td>1535</td>\n",
" <td>1297675</td>\n",
" <td>845.39</td>\n",
" <td>200.191485</td>\n",
" </tr>\n",
" <tr>\n",
" <th>15</th>\n",
" <td>Sale</td>\n",
" <td>6870000</td>\n",
" <td>1088011570</td>\n",
" <td>158.37</td>\n",
" <td>604.702496</td>\n",
" </tr>\n",
" <tr>\n",
" <th>125</th>\n",
" <td>Sale</td>\n",
" <td>764980</td>\n",
" <td>738683277</td>\n",
" <td>965.62</td>\n",
" <td>363.950049</td>\n",
" </tr>\n",
" <tr>\n",
" <th>24</th>\n",
" <td>Sale</td>\n",
" <td>3750</td>\n",
" <td>710625</td>\n",
" <td>189.50</td>\n",
" <td>200.697003</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" Transaction Shares Value ($) Cost Predicted cost\n",
"96 Option Exercise 3500 219520 62.72 200.100676\n",
"69 Sale 121 107447 887.99 199.861821\n",
"82 Sale 2258486 2007978676 889.08 619.839689\n",
"76 Sale 3500 3147970 899.42 200.649805\n",
"114 Sale 340564 333647031 979.69 286.706558\n",
"29 Sale 9650000 2012758726 208.58 753.891218\n",
"94 Option Exercise 25000 1309500 52.38 201.426112\n",
"132 Option Exercise 1786 0 0.00 199.833629\n",
"93 Option Exercise 1786 0 0.00 199.833629\n",
"139 Sale 126471 148102963 1171.04 231.142091\n",
"19 Sale 3768 670935 178.07 200.648862\n",
"90 Sale 1535 1297675 845.39 200.191485\n",
"15 Sale 6870000 1088011570 158.37 604.702496\n",
"125 Sale 764980 738683277 965.62 363.950049\n",
"24 Sale 3750 710625 189.50 200.697003"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"from sklearn.model_selection import train_test_split\n",
"\n",
"\n",
"# Функция для предсказания значений\n",
"def predict_value(row):\n",
" cost_sim.input[\"Transaction\"] = row[\"Transaction\"]\n",
" cost_sim.input[\"Shares\"] = row[\"Shares\"]\n",
" cost_sim.input[\"Value\"] = row[\"Value ($)\"]\n",
" cost_sim.compute()\n",
" return cost_sim.output[\"Cost\"]\n",
"\n",
"\n",
"# Выбор нужных столбцов\n",
"data: DataFrame = df[[\"Transaction\", \"Shares\", \"Value ($)\", \"Cost\"]]\n",
"\n",
"# Разделение данных на обучающую и тестовую выборки (80% / 20%)\n",
"train_data, test_data = train_test_split(data, test_size=0.2, random_state=42)\n",
"\n",
"# Применение модели к обучающей выборке\n",
"train_data[\"Predicted cost\"] = train_data.apply(predict_value, axis=1)\n",
"display(train_data.head(15))\n",
"\n",
"# Применение модели к тестовой выборке\n",
"test_data[\"Predicted cost\"] = test_data.apply(predict_value, axis=1)\n",
"display(test_data.head(15))"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Оценка результатов на метриках:\n",
"\n",
"~ Спустя n часов, проведенных в попытках улучшить показатели метрик и танцев с бубном вокруг настройки параметров лингвистических переменных я сдался."
]
},
{
"cell_type": "code",
"execution_count": 144,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"{'RMSE_train': 510.9053801945241,\n",
" 'RMSE_test': 454.5448906860201,\n",
" 'RMAE_test': 19.12051761053488,\n",
" 'R2_test': -0.16291982992374576}"
]
},
"execution_count": 144,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"import math\n",
"from typing import Union\n",
"from numpy import ndarray\n",
"\n",
"from sklearn import metrics\n",
"\n",
"\n",
"metrics_results: dict[str, Union[float, ndarray]] = {}\n",
"\n",
"metrics_results[\"RMSE_train\"] = math.sqrt(\n",
" metrics.mean_squared_error(train_data[\"Cost\"], train_data[\"Predicted cost\"])\n",
")\n",
"metrics_results[\"RMSE_test\"] = math.sqrt(\n",
" metrics.mean_squared_error(test_data[\"Cost\"], test_data[\"Predicted cost\"])\n",
")\n",
"metrics_results[\"RMAE_test\"] = math.sqrt(\n",
" metrics.mean_absolute_error(test_data[\"Cost\"], test_data[\"Predicted cost\"])\n",
")\n",
"metrics_results[\"R2_test\"] = metrics.r2_score( # type: ignore\n",
" test_data[\"Cost\"], test_data[\"Predicted cost\"]\n",
")\n",
"\n",
"metrics_results"
]
}
],
"metadata": {
"kernelspec": {
"display_name": "aimenv",
"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.8"
}
},
"nbformat": 4,
"nbformat_minor": 2
}