266 KiB
Датасет: Tesla Insider Trading.¶
Описание датасета:¶
Датасет представляет собой выборку операций с ценными бумагами компании Tesla, совершённых инсайдерами, и является частью более крупного проекта "Insider Trading S&P500 – Inside Info". Данные охватывают транзакции с участием крупных акционеров и должностных лиц компании, включая такие операции, как покупка, продажа и опционы, начиная с 10 ноября 2021 года и до 27 июля 2022 года.
Анализ сведений:¶
Проблемная область: Проблемная область данного датасета касается анализа инсайдерских сделок в публичных компаниях, а также их влияния на ценообразование акций. Инсайдерские транзакции, совершаемые людьми с доступом к непубличной информации (такими как руководители, крупные акционеры или члены совета директоров), могут быть индикаторами будущих изменений стоимости акций. Исследование таких транзакций помогает понять, как информация внутри компании отражается в действиях ключевых участников, и может выявить паттерны поведения, которые влияют на рынки.
Актуальность: Анализ инсайдерских сделок становится особенно важным в условиях высокой волатильности рынка и неопределенности. Инвесторы, аналитики и компании используют такие данные, чтобы лучше понимать сигналы от крупных акционеров и должностных лиц. Действия инсайдеров, такие как покупки и продажи акций, нередко рассматриваются как индикаторы доверия к компании, что может оказывать значительное влияние на рыночные ожидания и прогнозы.
Объекты наблюдений: Объектами наблюдений в датасете являются инсайдеры компании Tesla — лица, имеющие значительное влияние на управление и информацию компании. Каждый объект характеризуется различными параметрами, включая должность, тип транзакции, количество акций и общую стоимость сделок.
Атрибуты объектов:
- Insider Trading: ФИО лица, совершившего транзакцию.
- Relationship: Должность или статус данного лица в компании Tesla.
- Date: Дата завершения транзакции.
- Transaction: Тип транзакции.
- Cost: Цена одной акции на момент совершения транзакции.
- Shares: Количество акций, участвующих в транзакции.
- Value ($): Общая стоимость транзакции в долларах США.
- Shares Total: Общее количество акций, принадлежащих этому лицу после завершения данной транзакции.
- SEC Form 4: Дата записи транзакции в форме SEC Form 4, обязательной для отчётности о сделках инсайдеров.
Выгрузка данных из файла в DataFrame:¶
import pandas as pd
from pandas import DataFrame
df: DataFrame = pd.read_csv("..//static//csv//TSLA.csv")
# Преобразование типов данных
df["Insider Trading"] = df["Insider Trading"].astype("category") # Преобразование в категорию
df["Relationship"] = df["Relationship"].astype("category") # Преобразование в категорию
df["Transaction"] = df["Transaction"].astype("category") # Преобразование в категорию
df["Cost"] = pd.to_numeric(df["Cost"], errors="coerce") # Преобразование в float
df["Shares"] = pd.to_numeric(df["Shares"].str.replace(",", ""), errors="coerce") # Преобразование в float с удалением запятых
df["Value ($)"] = pd.to_numeric(df["Value ($)"].str.replace(",", ""), errors="coerce") # Преобразование в float с удалением запятых
df["Shares Total"] = pd.to_numeric(df["Shares Total"].str.replace(",", ""), errors="coerce") # Преобразование в float с удалением запятых
Краткая информация о DataFrame:¶
# Краткая информация о DataFrame
df.info()
# Статистическое описание числовых столбцов
df.describe().transpose()
Выбор входных и выходных переменных:¶
Входные переменные:
На основании анализа датасета можно выделить следующие ключевые параметры, которые могут влиять на принятие решения об изменении стоимости акций:
- Transaction (Тип транзакции): Категориальная переменная, указывающая на тип операции (Sale, Option Exercise).
- Cost (Цена акции): Числовая переменная, показывающая стоимость одной акции на момент совершения транзакции.
- Shares (Количество акций): Числовая переменная, указывающая количество акций в транзакции.
- Value ($): Числовая переменная, представляющая общую стоимость транзакции.
Выходная переменная:
Impact on Stock Price (Влияние на цену акций): Лингвистическая переменная, описывающая потенциальное влияние транзакции на рыночную цену акций Tesla. Может принимать значения: "Low", "Medium", "High".
Определение лингвистических переменных:¶
Лингвистическая переменная – это переменная, значениями которой являются слова или фразы вместо чисел. Она используется в нечеткой логике и теории нечетких множеств для описания понятий, которые нельзя точно выразить числовыми значениями.
Для каждой переменной определим количество термов, типы и параметры функций принадлежности.
import numpy as np
from skfuzzy import control as ctrl
transaction = ctrl.Antecedent(np.arange(0, 2, 1), "Transaction")
cost = ctrl.Antecedent(np.arange(0, 1200, 1), "Cost")
shares = ctrl.Antecedent(np.arange(0, 12000000, 1), "Shares")
value = ctrl.Antecedent(np.arange(0, 2.3e9, 1e6), "Value")
impact = ctrl.Consequent(np.arange(0, 1, 0.01), "Impact")
Определение нечетких переменных:¶
import skfuzzy as fuzz
transaction["Option Exercise"] = fuzz.trimf(transaction.universe, [0, 0, 1])
transaction["Sale"] = fuzz.trimf(transaction.universe, [0, 1, 1])
transaction.view()
# cost["Low"] = fuzz.zmf(cost.universe, 0, 300)
# cost["Medium"] = fuzz.trimf(cost.universe, [250, 500, 750])
# cost["High"] = fuzz.smf(cost.universe, 700, 1200)
cost.automf(3, names=["Low", "Medium", "High"])
cost.view()
# shares["Few"] = fuzz.zmf(shares.universe, 0, 20000)
# shares["Moderate"] = fuzz.trimf(shares.universe, [10000, 50000, 500000])
# shares["Many"] = fuzz.smf(shares.universe, 400000, 12000000)
shares.automf(3, names=["Few", "Moderate", "Many"])
shares.view()
# value["Low"] = fuzz.zmf(value.universe, 0, 5e7)
# value["Medium"] = fuzz.trimf(value.universe, [5e7, 1e8, 1e9])
# value["High"] = fuzz.smf(value.universe, 1e9, 2.3e9)
value.automf(3, names=["Low", "Medium", "High"])
value.view()
impact["Low"] = fuzz.trimf(impact.universe, [0, 0.3, 0.5])
impact["Medium"] = fuzz.trimf(impact.universe, [0.3, 0.5, 0.7])
impact["High"] = fuzz.trimf(impact.universe, [0.5, 0.7, 1])
impact.view()
Определение нечётких правил:¶
rule1 = ctrl.Rule(transaction["Option Exercise"] & cost["Low"] & shares["Few"] & value["Low"], impact["Low"])
rule2 = ctrl.Rule(transaction["Option Exercise"] & cost["Low"] & shares["Few"] & value["Medium"], impact["Low"])
rule3 = ctrl.Rule(transaction["Option Exercise"] & cost["Low"] & shares["Few"] & value["High"], impact["Medium"])
rule4 = ctrl.Rule(transaction["Option Exercise"] & cost["Low"] & shares["Moderate"] & value["Low"], impact["Low"])
rule5 = ctrl.Rule(transaction["Option Exercise"] & cost["Low"] & shares["Moderate"] & value["Medium"], impact["Medium"])
rule6 = ctrl.Rule(transaction["Option Exercise"] & cost["Low"] & shares["Moderate"] & value["High"], impact["High"])
rule7 = ctrl.Rule(transaction["Option Exercise"] & cost["Low"] & shares["Many"] & value["Low"], impact["Medium"])
rule8 = ctrl.Rule(transaction["Option Exercise"] & cost["Low"] & shares["Many"] & value["Medium"], impact["High"])
rule9 = ctrl.Rule(transaction["Option Exercise"] & cost["Low"] & shares["Many"] & value["High"], impact["High"])
rule10 = ctrl.Rule(transaction["Option Exercise"] & cost["Medium"] & shares["Few"] & value["Low"], impact["Low"])
rule11 = ctrl.Rule(transaction["Option Exercise"] & cost["Medium"] & shares["Few"] & value["Medium"], impact["Medium"])
rule12 = ctrl.Rule(transaction["Option Exercise"] & cost["Medium"] & shares["Few"] & value["High"], impact["Medium"])
rule13 = ctrl.Rule(transaction["Option Exercise"] & cost["Medium"] & shares["Moderate"] & value["Low"], impact["Medium"])
rule14 = ctrl.Rule(transaction["Option Exercise"] & cost["Medium"] & shares["Moderate"] & value["Medium"], impact["High"])
rule15 = ctrl.Rule(transaction["Option Exercise"] & cost["Medium"] & shares["Moderate"] & value["High"], impact["High"])
rule16 = ctrl.Rule(transaction["Option Exercise"] & cost["Medium"] & shares["Many"] & value["Low"], impact["High"])
rule17 = ctrl.Rule(transaction["Option Exercise"] & cost["Medium"] & shares["Many"] & value["Medium"], impact["High"])
rule18 = ctrl.Rule(transaction["Option Exercise"] & cost["Medium"] & shares["Many"] & value["High"], impact["High"])
rule19 = ctrl.Rule(transaction["Option Exercise"] & cost["High"] & shares["Few"] & value["Low"], impact["Medium"])
rule20 = ctrl.Rule(transaction["Option Exercise"] & cost["High"] & shares["Few"] & value["Medium"], impact["High"])
rule21 = ctrl.Rule(transaction["Option Exercise"] & cost["High"] & shares["Few"] & value["High"], impact["High"])
rule22 = ctrl.Rule(transaction["Option Exercise"] & cost["High"] & shares["Moderate"] & value["Low"], impact["High"])
rule23 = ctrl.Rule(transaction["Option Exercise"] & cost["High"] & shares["Moderate"] & value["Medium"], impact["High"])
rule24 = ctrl.Rule(transaction["Option Exercise"] & cost["High"] & shares["Moderate"] & value["High"], impact["High"])
rule25 = ctrl.Rule(transaction["Option Exercise"] & cost["High"] & shares["Many"] & value["Low"], impact["High"])
rule26 = ctrl.Rule(transaction["Option Exercise"] & cost["High"] & shares["Many"] & value["Medium"], impact["High"])
rule27 = ctrl.Rule(transaction["Option Exercise"] & cost["High"] & shares["Many"] & value["High"], impact["High"])
rule28 = ctrl.Rule(transaction["Sale"] & cost["Low"] & shares["Few"] & value["Low"], impact["Low"])
rule29 = ctrl.Rule(transaction["Sale"] & cost["Low"] & shares["Few"] & value["Medium"], impact["Low"])
rule30 = ctrl.Rule(transaction["Sale"] & cost["Low"] & shares["Few"] & value["High"], impact["Medium"])
rule31 = ctrl.Rule(transaction["Sale"] & cost["Low"] & shares["Moderate"] & value["Low"], impact["Low"])
rule32 = ctrl.Rule(transaction["Sale"] & cost["Low"] & shares["Moderate"] & value["Medium"], impact["Medium"])
rule33 = ctrl.Rule(transaction["Sale"] & cost["Low"] & shares["Moderate"] & value["High"], impact["High"])
rule34 = ctrl.Rule(transaction["Sale"] & cost["Low"] & shares["Many"] & value["Low"], impact["Medium"])
rule35 = ctrl.Rule(transaction["Sale"] & cost["Low"] & shares["Many"] & value["Medium"], impact["High"])
rule36 = ctrl.Rule(transaction["Sale"] & cost["Low"] & shares["Many"] & value["High"], impact["High"])
rule37 = ctrl.Rule(transaction["Sale"] & cost["Medium"] & shares["Few"] & value["Low"], impact["Low"])
rule38 = ctrl.Rule(transaction["Sale"] & cost["Medium"] & shares["Few"] & value["Medium"], impact["Medium"])
rule39 = ctrl.Rule(transaction["Sale"] & cost["Medium"] & shares["Few"] & value["High"], impact["Medium"])
rule40 = ctrl.Rule(transaction["Sale"] & cost["Medium"] & shares["Moderate"] & value["Low"], impact["Medium"])
rule41 = ctrl.Rule(transaction["Sale"] & cost["Medium"] & shares["Moderate"] & value["Medium"], impact["High"])
rule42 = ctrl.Rule(transaction["Sale"] & cost["Medium"] & shares["Moderate"] & value["High"], impact["High"])
rule43 = ctrl.Rule(transaction["Sale"] & cost["Medium"] & shares["Many"] & value["Low"], impact["High"])
rule44 = ctrl.Rule(transaction["Sale"] & cost["Medium"] & shares["Many"] & value["Medium"], impact["High"])
rule45 = ctrl.Rule(transaction["Sale"] & cost["Medium"] & shares["Many"] & value["High"], impact["High"])
rule46 = ctrl.Rule(transaction["Sale"] & cost["High"] & shares["Few"] & value["Low"], impact["Medium"])
rule47 = ctrl.Rule(transaction["Sale"] & cost["High"] & shares["Few"] & value["Medium"], impact["High"])
rule48 = ctrl.Rule(transaction["Sale"] & cost["High"] & shares["Few"] & value["High"], impact["High"])
rule49 = ctrl.Rule(transaction["Sale"] & cost["High"] & shares["Moderate"] & value["Low"], impact["High"])
rule50 = ctrl.Rule(transaction["Sale"] & cost["High"] & shares["Moderate"] & value["Medium"], impact["High"])
rule51 = ctrl.Rule(transaction["Sale"] & cost["High"] & shares["Moderate"] & value["High"], impact["High"])
rule52 = ctrl.Rule(transaction["Sale"] & cost["High"] & shares["Many"] & value["Low"], impact["High"])
rule53 = ctrl.Rule(transaction["Sale"] & cost["High"] & shares["Many"] & value["Medium"], impact["High"])
rule54 = ctrl.Rule(transaction["Sale"] & cost["High"] & shares["Many"] & value["High"], impact["High"])
# Мне не понравилось
Создание нечеткой системы:¶
fuzzy_rules: list[ctrl.Rule] = [
rule1,
rule2,
rule3,
rule4,
rule5,
rule6,
rule7,
rule8,
rule9,
rule10,
rule11,
rule12,
rule13,
rule14,
rule15,
rule16,
rule17,
rule18,
rule19,
rule20,
rule21,
rule22,
rule23,
rule24,
rule25,
rule26,
rule27,
rule28,
rule29,
rule30,
rule31,
rule32,
rule33,
rule34,
rule35,
rule36,
rule37,
rule38,
rule39,
rule40,
rule41,
rule42,
rule43,
rule44,
rule45,
rule46,
rule47,
rule48,
rule49,
rule50,
rule51,
rule52,
rule53,
rule54,
]
# Создание системы управления
impact_ctrl = ctrl.ControlSystem(fuzzy_rules)
# Стимуляция системы управления
impact_sim = ctrl.ControlSystemSimulation(impact_ctrl)
fuzzy_rules
Тестирование нечёткой системы:¶
from sklearn.model_selection import train_test_split
# Функция для предсказания значений
def predict_value(row):
impact_sim.input["Transaction"] = row["Transaction"]
impact_sim.input["Cost"] = row["Cost"]
impact_sim.input["Shares"] = row["Shares"]
impact_sim.input["Value"] = row["Value ($)"]
impact_sim.compute()
return impact_sim.output["Impact"]
# Выбор нужных столбцов
data: DataFrame = df[["Transaction", "Cost", "Shares", "Value ($)"]]
# Разделение данных на обучающую и тестовую выборки (80% / 20%)
train_data, test_data = train_test_split(data, test_size=0.2, random_state=42)
# Применение модели к обучающей выборке
train_data["Predicted Impact"] = train_data.apply(predict_value, axis=1)
display(train_data.head(15))
# Применение модели к тестовой выборке
test_data["Predicted Impact"] = test_data.apply(predict_value, axis=1)
display(test_data.head(15))