684 lines
334 KiB
Plaintext
Raw Normal View History

2025-02-22 11:16:19 +04:00
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## **Лабораторная работа №7**\n",
"\n",
"**Столбцы датасета и их пояснение:**\n",
"\n",
"**Date** - Дата, на которую относятся данные. Эта характеристика указывает конкретный день, в который происходила торговля акциями Walmart.\n",
"\n",
"**Open** - Цена открытия. Стоимость акций Walmart в начале торгового дня. Это важный показатель, который показывает, по какой цене начались торги в конкретный день, и часто используется для сравнения с ценой закрытия для определения дневного тренда.\n",
"\n",
"**High** - Максимальная цена за день. Наибольшая цена, достигнутая акциями Walmart в течение торгового дня. Эта характеристика указывает, какой была самая высокая стоимость акций за день.\n",
"\n",
"**Low** - Минимальная цена за день. Наименьшая цена, по которой торговались акции Walmart в течение дня.\n",
"\n",
"**Close** - Цена закрытия. Стоимость акций Walmart в конце торгового дня. Цена закрытия — один из основных показателей, используемых для анализа акций, так как она отображает итоговую стоимость акций за день и часто используется для расчета дневных изменений и трендов на длительных временных периодах.\n",
"\n",
"**Adj Close** - Скорректированная цена закрытия. Цена закрытия, скорректированная с учетом всех корпоративных действий.\n",
"\n",
"**Volume** - Объем торгов. Количество акций Walmart, проданных и купленных в течение дня. "
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"**Выгружаем данные**"
]
},
{
"cell_type": "code",
"execution_count": 18,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
" Date Open High Low Close Adj Close Volume\n",
"0 1972-08-25 0.021159 0.021566 0.021159 0.021484 0.011664 7526400\n",
"1 1972-08-28 0.021484 0.021647 0.021403 0.021403 0.011620 2918400\n",
"2 1972-08-29 0.021322 0.021322 0.021159 0.021159 0.011488 5836800\n",
"3 1972-08-30 0.021159 0.021159 0.020996 0.021159 0.011488 1228800\n",
"4 1972-08-31 0.020996 0.020996 0.020833 0.020833 0.011311 2611200\n",
"Index(['Date', 'Open', 'High', 'Low', 'Close', 'Adj Close', 'Volume'], dtype='object')\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>Date</th>\n",
" <th>Open</th>\n",
" <th>High</th>\n",
" <th>Low</th>\n",
" <th>Close</th>\n",
" <th>Adj Close</th>\n",
" <th>Volume</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>1972-08-25</td>\n",
" <td>0.021159</td>\n",
" <td>0.021566</td>\n",
" <td>0.021159</td>\n",
" <td>0.021484</td>\n",
" <td>0.011664</td>\n",
" <td>7526400</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>1972-08-28</td>\n",
" <td>0.021484</td>\n",
" <td>0.021647</td>\n",
" <td>0.021403</td>\n",
" <td>0.021403</td>\n",
" <td>0.011620</td>\n",
" <td>2918400</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>1972-08-29</td>\n",
" <td>0.021322</td>\n",
" <td>0.021322</td>\n",
" <td>0.021159</td>\n",
" <td>0.021159</td>\n",
" <td>0.011488</td>\n",
" <td>5836800</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>1972-08-30</td>\n",
" <td>0.021159</td>\n",
" <td>0.021159</td>\n",
" <td>0.020996</td>\n",
" <td>0.021159</td>\n",
" <td>0.011488</td>\n",
" <td>1228800</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>1972-08-31</td>\n",
" <td>0.020996</td>\n",
" <td>0.020996</td>\n",
" <td>0.020833</td>\n",
" <td>0.020833</td>\n",
" <td>0.011311</td>\n",
" <td>2611200</td>\n",
" </tr>\n",
" <tr>\n",
" <th>5</th>\n",
" <td>1972-09-01</td>\n",
" <td>0.020915</td>\n",
" <td>0.020996</td>\n",
" <td>0.020915</td>\n",
" <td>0.020996</td>\n",
" <td>0.011400</td>\n",
" <td>768000</td>\n",
" </tr>\n",
" <tr>\n",
" <th>6</th>\n",
" <td>1972-09-05</td>\n",
" <td>0.020996</td>\n",
" <td>0.020996</td>\n",
" <td>0.020833</td>\n",
" <td>0.020833</td>\n",
" <td>0.011311</td>\n",
" <td>1689600</td>\n",
" </tr>\n",
" <tr>\n",
" <th>7</th>\n",
" <td>1972-09-06</td>\n",
" <td>0.020996</td>\n",
" <td>0.020996</td>\n",
" <td>0.020996</td>\n",
" <td>0.020996</td>\n",
" <td>0.011400</td>\n",
" <td>768000</td>\n",
" </tr>\n",
" <tr>\n",
" <th>8</th>\n",
" <td>1972-09-07</td>\n",
" <td>0.020996</td>\n",
" <td>0.020996</td>\n",
" <td>0.020915</td>\n",
" <td>0.020915</td>\n",
" <td>0.011356</td>\n",
" <td>3532800</td>\n",
" </tr>\n",
" <tr>\n",
" <th>9</th>\n",
" <td>1972-09-08</td>\n",
" <td>0.020833</td>\n",
" <td>0.020833</td>\n",
" <td>0.020752</td>\n",
" <td>0.020752</td>\n",
" <td>0.011267</td>\n",
" <td>1996800</td>\n",
" </tr>\n",
" <tr>\n",
" <th>10</th>\n",
" <td>1972-09-11</td>\n",
" <td>0.020915</td>\n",
" <td>0.020915</td>\n",
" <td>0.020915</td>\n",
" <td>0.020915</td>\n",
" <td>0.011356</td>\n",
" <td>2764800</td>\n",
" </tr>\n",
" <tr>\n",
" <th>11</th>\n",
" <td>1972-09-12</td>\n",
" <td>0.020915</td>\n",
" <td>0.020915</td>\n",
" <td>0.020915</td>\n",
" <td>0.020915</td>\n",
" <td>0.011356</td>\n",
" <td>1843200</td>\n",
" </tr>\n",
" <tr>\n",
" <th>12</th>\n",
" <td>1972-09-13</td>\n",
" <td>0.020915</td>\n",
" <td>0.020915</td>\n",
" <td>0.020915</td>\n",
" <td>0.020915</td>\n",
" <td>0.011356</td>\n",
" <td>460800</td>\n",
" </tr>\n",
" <tr>\n",
" <th>13</th>\n",
" <td>1972-09-14</td>\n",
" <td>0.020915</td>\n",
" <td>0.021077</td>\n",
" <td>0.020833</td>\n",
" <td>0.021077</td>\n",
" <td>0.011443</td>\n",
" <td>3840000</td>\n",
" </tr>\n",
" <tr>\n",
" <th>14</th>\n",
" <td>1972-09-15</td>\n",
" <td>0.020996</td>\n",
" <td>0.020996</td>\n",
" <td>0.020915</td>\n",
" <td>0.020915</td>\n",
" <td>0.011356</td>\n",
" <td>1536000</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" Date Open High Low Close Adj Close Volume\n",
"0 1972-08-25 0.021159 0.021566 0.021159 0.021484 0.011664 7526400\n",
"1 1972-08-28 0.021484 0.021647 0.021403 0.021403 0.011620 2918400\n",
"2 1972-08-29 0.021322 0.021322 0.021159 0.021159 0.011488 5836800\n",
"3 1972-08-30 0.021159 0.021159 0.020996 0.021159 0.011488 1228800\n",
"4 1972-08-31 0.020996 0.020996 0.020833 0.020833 0.011311 2611200\n",
"5 1972-09-01 0.020915 0.020996 0.020915 0.020996 0.011400 768000\n",
"6 1972-09-05 0.020996 0.020996 0.020833 0.020833 0.011311 1689600\n",
"7 1972-09-06 0.020996 0.020996 0.020996 0.020996 0.011400 768000\n",
"8 1972-09-07 0.020996 0.020996 0.020915 0.020915 0.011356 3532800\n",
"9 1972-09-08 0.020833 0.020833 0.020752 0.020752 0.011267 1996800\n",
"10 1972-09-11 0.020915 0.020915 0.020915 0.020915 0.011356 2764800\n",
"11 1972-09-12 0.020915 0.020915 0.020915 0.020915 0.011356 1843200\n",
"12 1972-09-13 0.020915 0.020915 0.020915 0.020915 0.011356 460800\n",
"13 1972-09-14 0.020915 0.021077 0.020833 0.021077 0.011443 3840000\n",
"14 1972-09-15 0.020996 0.020996 0.020915 0.020915 0.011356 1536000"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"Date 0\n",
"Open 0\n",
"High 0\n",
"Low 0\n",
"Close 0\n",
"Adj Close 0\n",
"Volume 0\n",
"dtype: int64\n",
"\n",
"Максимальные значения по каждому столбцу:\n",
"Date 2024-10-14\n",
"Open 81.040001\n",
"High 81.599998\n",
"Low 80.68\n",
"Close 81.400002\n",
"Adj Close 81.400002\n",
"Volume 395500800\n",
"dtype: object\n",
"\\Минимальные значения по каждому столбцу:\n",
"Date 1972-08-25\n",
"Open 0.005208\n",
"High 0.005208\n",
"Low 0.004801\n",
"Close 0.005208\n",
"Adj Close 0.002845\n",
"Volume 0\n",
"dtype: object\n"
]
}
],
"source": [
"import pandas as pd\n",
"\n",
"df = pd.read_csv(\"..//static//csv//WMT.csv\")\n",
"\n",
"print(df.head())\n",
"print(df.columns)\n",
"display(df.head(15))\n",
"print(df.isnull().sum()) \n",
"\n",
"print(\"\\nМаксимальные значения по каждому столбцу:\")\n",
"print(df.max())\n",
"\n",
"print(\"\\Минимальные значения по каждому столбцу:\")\n",
"print(df.min())"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Выбор входных и выходных переменных"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Входные переменные будут Open (цена открытия) и Volume (объем торгов)\n",
"\n",
"Выходная переменная - Close (цена закрытия)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Настройка параметров лингвистических переменных"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Термы: Low, Medium, High"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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
"text/plain": [
"<Figure size 1000x600 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"import numpy as np\n",
"import matplotlib.pyplot as plt\n",
"import skfuzzy as fuzz\n",
"\n",
"# Минимальные и максимальные значения из данных\n",
"volume_max = 395500800\n",
"\n",
"# Определяем диапазон значений для объема торгов\n",
"volume_range = np.arange(0, volume_max, 10000) \n",
"\n",
"# Определение функций принадлежности для термов\n",
"# Определение функций принадлежности для термов\n",
"low = fuzz.trapmf(volume_range, [0, 0, 100000000, 150000000]) \n",
"medium = fuzz.trimf(volume_range, [100000000, 200000000, 300000000]) \n",
"high = fuzz.trapmf(volume_range, [250000000, 300000000, volume_max, volume_max]) \n",
"\n",
"# Визуализация функций принадлежности\n",
"plt.figure(figsize=(10, 6))\n",
"plt.plot(volume_range, low, label='Низкий (Low)', color='blue')\n",
"plt.plot(volume_range, medium, label='Средний (Medium)', color='orange')\n",
"plt.plot(volume_range, high, label='Высокий (High)', color='green')\n",
"plt.title('Функции принадлежности для объема торгов')\n",
"plt.xlabel('Объем торгов')\n",
"plt.ylabel('Принадлежность')\n",
"plt.ylim(-0.1, 1.1)\n",
"plt.axhline(0, color='black', lw=0.5)\n",
"plt.axvline(0, color='black', lw=0.5)\n",
"plt.legend()\n",
"plt.grid()\n",
"\n",
"# Отображаем график\n",
"plt.show()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Формирование базы нечетких правил"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Нечеткие правила:\n",
"Если Цена открытия Низкая И Объем Низкий, Тогда Цена закрытия Низкая.\n",
"Если Цена открытия Низкая И Объем Средний, Тогда Цена закрытия Средняя.\n",
"Если Цена открытия Низкая И Объем Высокий, Тогда Цена закрытия Средняя.\n",
"Если Цена открытия Средняя И Объем Низкий, Тогда Цена закрытия Средняя.\n",
"Если Цена открытия Средняя И Объем Средний, Тогда Цена закрытия Высокая.\n",
"Если Цена открытия Средняя И Объем Высокий, Тогда Цена закрытия Высокая.\n",
"Если Цена открытия Высокая И Объем Низкий, Тогда Цена закрытия Средняя.\n",
"Если Цена открытия Высокая И Объем Средний, Тогда Цена закрытия Высокая.\n",
"Если Цена открытия Высокая И Объем Высокий, Тогда Цена закрытия Высокая.\n"
]
},
{
"data": {
"image/png": "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
"text/plain": [
"<Figure size 1000x1200 with 3 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAA90AAAJOCAYAAACqS2TfAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjAsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvlHJYcgAAAAlwSFlzAAAPYQAAD2EBqD+naQAA6UdJREFUeJzs3QecXHW5P/7P6TOzLZtNJQRC7yUhCSCKchVR1Cv29hPkqldE/3ZRr4rYFfu9dlGxi9IhCRA6SKRXIWVL+vbd6f2c838938mum81uspvs7pnyeec1r8zMzsx5Zs7szjzn+X6fr+b7vg8iIiIiIiIimnL61D8kEREREREREQkm3URERERERETThEk3ERERERER0TRh0k1EREREREQ0TZh0ExEREREREU0TJt1ERERERERE04RJNxEREREREdE0YdJNRERERERENE2YdBMRERERERFNEybdRERERERERNOESTcRUQ26+uqroWnabqd58+bhnHPOwZo1a4IOj4iIiKhqmEEHQEREwfnKV76Cww47DL7vo7u7WyXj559/Pm655Ra89rWvDTo8IiIioorHpJuIqIa9+tWvxvLly4cvv/e978X8+fPxl7/8hUk3ERER0RTg8HIiIho2a9YshMNhmOa/j8lu3rxZDT+XKvhIH/rQh9T173nPe4avu/7667Fy5UrMnj1bPc6xxx6Lb3/726qSLu655x51nxtuuGGPbf/5z39WP1u3bp26/Mwzz6jHPvzwwxEKhbBgwQL813/9F/r7+8eMfcmSJXsMmZfTvffeu9ttRsYr/v73v6vbyc+GbNiwAf/xH/+htuk4DhYvXoxLLrkEAwMDw7fJ5/O4/PLLcdppp6GpqQl1dXV4yUteop7jSEOv33e/+909Yj7xxBPxspe9bLfr5PLo6x599NHh5zNSMpnEJz/5SfUaWZa12/Pu6+sb83UauR3Z/mgSp9xf4h5Jph3I85Pn2dDQgNe85jX417/+tdttxnp95fUfvR/Eww8/jFe96lXqtYtEInjpS1+Kf/zjH8M/v+KKK8bcn2Pt27Fes69//evQdV29ryb72v72t79Vl3/zm9/sdttvfOMb6vrVq1fv5ZUd/7041j6Uyx/+8Ifxpz/9Ccccc4x6r8t76v7779/tdlu2bMGll16qbiO/Wy0tLXjLW96yx34aPXVEXtuTTjoJV111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
"text/plain": [
"<Figure size 1000x600 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"import numpy as np\n",
"import skfuzzy as fuzz\n",
"import matplotlib.pyplot as plt\n",
"\n",
"# Минимальные и максимальные значения из данных\n",
"open_min = 0.005208\n",
"open_max = 81.040001\n",
"volume_min = 0\n",
"close_min = 0.005208\n",
"close_max = 81.400002\n",
"\n",
"# Определение диапазонов для переменных\n",
"x_open = np.linspace(open_min, open_max, 100) # Диапазон для цены открытия\n",
"x_volume = np.linspace(volume_min, volume_max, 100) # Диапазон для объема торгов\n",
"x_close = np.linspace(close_min, close_max, 100) # Диапазон для цены закрытия\n",
"\n",
"# Определение функций принадлежности для цены открытия\n",
"low_open = fuzz.trapmf(x_open, [open_min, open_min, 20, 40]) # Низкая цена открытия\n",
"medium_open = fuzz.trimf(x_open, [30, 50, 70]) # Средняя цена открытия\n",
"high_open = fuzz.trapmf(x_open, [60, 70, open_max, open_max]) # Высокая цена открытия\n",
"\n",
"# Определение функций принадлежности для объема торгов\n",
"low_volume = fuzz.trapmf(x_volume, [volume_min, volume_min, 100000000, 150000000]) # Низкий объем\n",
"medium_volume = fuzz.trimf(x_volume, [100000000, 200000000, 300000000]) # Средний объем\n",
"high_volume = fuzz.trapmf(x_volume, [250000000, 300000000, volume_max, volume_max]) # Высокий объем\n",
"\n",
"# Определение функций принадлежности для цены закрытия\n",
"low_close = fuzz.trapmf(x_close, [close_min, close_min, 20, 40]) # Низкая цена закрытия\n",
"medium_close = fuzz.trimf(x_close, [30, 50, 70]) # Средняя цена закрытия\n",
"high_close = fuzz.trapmf(x_close, [60, 70, close_max, close_max]) # Высокая цена закрытия\n",
"\n",
"# Определение нечетких правил\n",
"fuzzy_rules = [\n",
" (\"Низкая\", \"Низкий\", \"Низкая\"),\n",
" (\"Низкая\", \"Средний\", \"Средняя\"),\n",
" (\"Низкая\", \"Высокий\", \"Средняя\"),\n",
" (\"Средняя\", \"Низкий\", \"Средняя\"),\n",
" (\"Средняя\", \"Средний\", \"Высокая\"),\n",
" (\"Средняя\", \"Высокий\", \"Высокая\"),\n",
" (\"Высокая\", \"Низкий\", \"Средняя\"),\n",
" (\"Высокая\", \"Средний\", \"Высокая\"),\n",
" (\"Высокая\", \"Высокий\", \"Высокая\"),\n",
"]\n",
"\n",
"# Вывод правил\n",
"print(\"Нечеткие правила:\")\n",
"for rule in fuzzy_rules:\n",
" print(f\"Если Цена открытия {rule[0]} И Объем {rule[1]}, Тогда Цена закрытия {rule[2]}.\")\n",
"\n",
"# Визуализация функций принадлежности\n",
"fig, axs = plt.subplots(3, 1, figsize=(10, 12))\n",
"\n",
"# Цена открытия\n",
"axs[0].plot(x_open, low_open, label='Низкая (Low)', color='blue')\n",
"axs[0].plot(x_open, medium_open, label='Средняя (Medium)', color='green')\n",
"axs[0].plot(x_open, high_open, label='Высокая (High)', color='red')\n",
"axs[0].set_title('Функции принадлежности для цены открытия')\n",
"axs[0].set_xlabel('Цена открытия')\n",
"axs[0].set_ylabel('Степень принадлежности')\n",
"axs[0].legend()\n",
"axs[0].grid()\n",
"\n",
"# Объем торгов\n",
"axs[1].plot(x_volume, low_volume, label='Низкий (Low)', color='blue')\n",
"axs[1].plot(x_volume, medium_volume, label='Средний (Medium)', color='orange')\n",
"axs[1].plot(x_volume, high_volume, label='Высокий (High)', color='green')\n",
"axs[1].set_title('Функции принадлежности для объема торгов')\n",
"axs[1].set_xlabel('Объем торгов')\n",
"axs[1].set_ylabel('Степень принадлежности')\n",
"axs[1].legend()\n",
"axs[1].grid()\n",
"\n",
"# Цена закрытия\n",
"axs[2].plot(x_close, low_close, label='Низкая', color='blue')\n",
"axs[2].plot(x_close, medium_close, label='Средняя', color='green')\n",
"axs[2].plot(x_close, high_close, label='Высокая', color='red')\n",
"axs[2].set_title('Функции принадлежности для цены закрытия')\n",
"axs[2].set_xlabel('Цена закрытия')\n",
"axs[2].set_ylabel('Степень принадлежности')\n",
"axs[2].legend()\n",
"axs[2].grid()\n",
"\n",
"plt.tight_layout()\n",
"plt.show()\n",
"\n",
"# Визуализация нечетких правил (пример)\n",
"fig, ax = plt.subplots(figsize=(10, 6))\n",
"x_rule = np.linspace(open_min, open_max, 100)\n",
"\n",
"# Пример нечеткого вывода для визуализации (примерные значения)\n",
"for rule in fuzzy_rules:\n",
" # Определение степени уверенности для каждого правила\n",
" if rule[0] == \"Низкая\" and rule[1] == \"Низкий\":\n",
" ax.fill_between(x_open, low_open, low_close, color='lightblue', alpha=0.5, label='Низкий #1')\n",
" elif rule[0] == \"Низкая\" and rule[1] == \"Средний\":\n",
" ax.fill_between(x_open, medium_open, medium_close, color='lightgreen', alpha=0.5, label='Средний #2')\n",
" elif rule[0] == \"Низкая\" and rule[1] == \"Высокий\":\n",
" ax.fill_between(x_open, low_open, medium_close, color='lightcoral', alpha=0.5, label='Высокий #3')\n",
" elif rule[0] == \"Средняя\" and rule[1] == \"Низкий\":\n",
" ax.fill_between(x_open, medium_open, medium_close, color='orange', alpha=0.5, label='Низкий #4')\n",
" elif rule[0] == \"Высокая\" and rule[1] == \"Высокий\":\n",
" ax.fill_between(x_open, high_open, high_close, color='salmon', alpha=0.5, label='Высокий #5')\n",
"\n",
"ax.set_title('Визуализация нечетких правил')\n",
"ax.set_xlabel('Цена открытия')\n",
"ax.set_ylabel('Цена закрытия')\n",
"ax.legend()\n",
"ax.grid()\n",
"\n",
"plt.tight_layout()\n",
"plt.show()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Оценка качества полученной нечеткой системы, используя метрики регрессии"
]
},
{
"cell_type": "code",
"execution_count": 22,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Цена открытия | Объем торгов | Фактическая цена закрытия | Полученная цена закрытия \n",
"============================================================================================\n",
"20 | 100000000 | 30 | 15.40 \n",
"50 | 200000000 | 60 | 49.70 \n",
"70 | 300000000 | 80 | 71.45 \n",
"40 | 150000000 | 50 | 25.00 \n",
"\n",
"Средняя абсолютная ошибка (MAE): 14.61\n",
"Среднеквадратичная ошибка (RMSE): 15.95\n"
]
}
],
"source": [
"import numpy as np\n",
"import skfuzzy as fuzz\n",
"import matplotlib.pyplot as plt\n",
"\n",
"# Определение диапазонов для переменных\n",
"x_open = np.linspace(open_min, open_max, 100) # Диапазон для цены открытия\n",
"x_volume = np.linspace(volume_min, volume_max, 100) # Диапазон для объема торгов\n",
"x_close = np.linspace(close_min, close_max, 100) # Диапазон для цены закрытия\n",
"\n",
"# Определение функций принадлежности для цены открытия\n",
"low_open = fuzz.trapmf(x_open, [open_min, open_min, 20, 40]) # Низкая цена открытия\n",
"medium_open = fuzz.trimf(x_open, [30, 50, 70]) # Средняя цена открытия\n",
"high_open = fuzz.trapmf(x_open, [60, 70, open_max, open_max]) # Высокая цена открытия\n",
"\n",
"# Определение функций принадлежности для объема торгов\n",
"low_volume = fuzz.trapmf(x_volume, [volume_min, volume_min, 100000000, 150000000]) # Низкий объем\n",
"medium_volume = fuzz.trimf(x_volume, [100000000, 200000000, 300000000]) # Средний объем\n",
"high_volume = fuzz.trapmf(x_volume, [250000000, 300000000, volume_max, volume_max]) # Высокий объем\n",
"\n",
"# Определение функций принадлежности для цены закрытия\n",
"low_close = fuzz.trapmf(x_close, [close_min, close_min, 20, 40]) # Низкая цена закрытия\n",
"medium_close = fuzz.trimf(x_close, [30, 50, 70]) # Средняя цена закрытия\n",
"high_close = fuzz.trapmf(x_close, [60, 70, close_max, close_max]) # Высокая цена закрытия\n",
"\n",
"# Создаем тестовые данные (цена открытия, объем, эталонная цена закрытия)\n",
"test_data = [\n",
" (20, 100000000, 30), # Низкая цена открытия, низкий объем и цена закрытия\n",
" (50, 200000000, 60), # Средняя цена открытия, средний объем и цена закрытия\n",
" (70, 300000000, 80), # Высокая цена открытия, высокий объем и цена закрытия\n",
" (40, 150000000, 50) # Средняя цена открытия, средний объем и цена закрытия\n",
"]\n",
"\n",
"# Функция для вычисления нечеткой оценки\n",
"def fuzzy_inference(open_price, volume):\n",
" open_low = fuzz.interp_membership(x_open, low_open, open_price)\n",
" open_medium = fuzz.interp_membership(x_open, medium_open, open_price)\n",
" open_high = fuzz.interp_membership(x_open, high_open, open_price)\n",
"\n",
" volume_low = fuzz.interp_membership(x_volume, low_volume, volume)\n",
" volume_medium = fuzz.interp_membership(x_volume, medium_volume, volume)\n",
" volume_high = fuzz.interp_membership(x_volume, high_volume, volume)\n",
"\n",
" close_low = np.fmin(open_low, volume_low)\n",
" close_medium = np.fmin(open_medium, volume_medium)\n",
" close_high = np.fmin(open_high, volume_high)\n",
"\n",
" close0 = fuzz.defuzz(x_close, low_close, 'centroid') * close_low if close_low > 0 else 0\n",
" close1 = fuzz.defuzz(x_close, medium_close, 'centroid') * close_medium if close_medium > 0 else 0\n",
" close2 = fuzz.defuzz(x_close, high_close, 'centroid') * close_high if close_high > 0 else 0\n",
"\n",
" return max(close0, close1, close2)\n",
"\n",
"# Список для хранения результатов\n",
"results = []\n",
"\n",
"# Оценка системы на тестовом наборе данных\n",
"for open_price, volume, actual_close in test_data:\n",
" inferred_close = fuzzy_inference(open_price, volume)\n",
" results.append((open_price, volume, actual_close, inferred_close))\n",
"\n",
"# Вывод результатов\n",
"print(f\"{'Цена открытия':<18} | {'Объем торгов':<10} | {'Фактическая цена закрытия':<30} | {'Полученная цена закрытия':<30}\")\n",
"print(\"=\" * 92)\n",
"\n",
"for open_price, volume, actual_close, inferred_close in results:\n",
" print(f\"{open_price:<18} | {volume:<10} | {actual_close:<30} | {inferred_close:<30.2f}\")\n",
"\n",
"# Вычисление метрик качества\n",
"actual_closes = [actual for _, _, actual, _ in results]\n",
"inferred_closes = [inferred for _, _, _, inferred in results]\n",
"\n",
"mae = np.mean(np.abs(np.array(actual_closes) - np.array(inferred_closes)))\n",
"rmse = np.sqrt(np.mean((np.array(actual_closes) - np.array(inferred_closes)) ** 2))\n",
"\n",
"# Вывод метрик\n",
"print(f\"\\nСредняя абсолютная ошибка (MAE): {mae:.2f}\")\n",
"print(f\"Среднеквадратичная ошибка (RMSE): {rmse:.2f}\")"
]
}
],
"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.13.2"
}
},
"nbformat": 4,
"nbformat_minor": 2
}