Почему именно прогноз акций Apple?
Если ты школьник и хочешь сделать крутой проект по машинному обучению, прогноз акций — идеальный вариант. Почему? Во-первых, это реальная задача, которую решают хедж-фонды и трейдеры по всему миру. Во-вторых, данные по акциям Apple (AAPL) доступны бесплатно и в огромных количествах. В-третьих, это отличный способ понять, как работает обучение с учителем и бинарная классификация — две ключевые концепции ML.
Важно: Этот проект — образовательный. Не используй его для реальных инвестиций! Рынок акций сложнее, чем кажется, и наш простой ИИ не учитывает множество факторов.
Проблема: как превратить исторические данные в прогноз?
Основная задача — научить компьютер предсказывать, вырастет ли цена акций Apple завтра, основываясь на данных за последние дни. Это задача бинарной классификации: модель должна ответить «да» (1) или «нет» (0).
Сложность в том, что:
- Цены акций зависят от сотен факторов (новости, экономика, настроения инвесторов)
- Рынок нестабилен и подвержен случайным колебаниям
- Нужно правильно подготовить данные и выбрать признаки (features)
Решение: простой пайплайн машинного обучения
Мы создадим классический ML-пайплайн из 5 шагов:
- Сбор и загрузка данных
- Предобработка и создание признаков
- Разделение на обучающую и тестовую выборки
- Обучение моделей (логистическая регрессия, Random Forest)
- Оценка точности и визуализация результатов
1 Подготовка среды и установка библиотек
Для начала создай виртуальное окружение и установи необходимые библиотеки:
# Создаем виртуальное окружение
python -m venv apple_stock_env
# Активируем (Windows)
apple_stock_env\Scripts\activate
# Или Mac/Linux
source apple_stock_env/bin/activate
# Устанавливаем библиотеки
pip install pandas numpy matplotlib seaborn scikit-learn yfinance jupyter
Предупреждение: Если у тебя уже установлен Python, убедись, что версия 3.8 или выше. Старые версии могут не поддерживать некоторые библиотеки.
2 Сбор данных с Yahoo Finance
Используем библиотеку yfinance для загрузки исторических данных Apple. Это бесплатно и легально:
import yfinance as yf
import pandas as pd
import numpy as np
# Загружаем данные Apple за последние 5 лет
data = yf.download('AAPL', start='2019-01-01', end='2024-12-31')
# Сохраняем в CSV на всякий случай
data.to_csv('apple_stock_data.csv')
# Посмотрим на первые строки
print(data.head())
print(f"\nВсего строк: {len(data)}")
Ты получишь DataFrame с колонками:
| Колонка | Описание |
|---|---|
| Open | Цена открытия |
| High | Максимальная цена дня |
| Low | Минимальная цена дня |
| Close | Цена закрытия |
| Volume | Объем торгов |
3 Создание целевой переменной и признаков
Наша цель — предсказать, вырастет ли цена завтра. Создадим целевую переменную:
# Создаем целевую переменную: 1 если цена завтра выше сегодняшней, иначе 0
data['Target'] = (data['Close'].shift(-1) > data['Close']).astype(int)
# Удаляем последнюю строку (у нее нет целевого значения)
data = data[:-1]
# Создаем технические индикаторы как признаки
data['SMA_5'] = data['Close'].rolling(window=5).mean() # Скользящее среднее за 5 дней
data['SMA_10'] = data['Close'].rolling(window=10).mean()
data['Price_Change'] = data['Close'].pct_change() # Процентное изменение
data['High_Low_Pct'] = (data['High'] - data['Low']) / data['Close'] * 100
data['Volume_Change'] = data['Volume'].pct_change()
# Удаляем строки с NaN (первые дни, где нет скользящих средних)
data_clean = data.dropna().copy()
print(f"Данных после очистки: {len(data_clean)}")
print(data_clean[['Close', 'Target', 'SMA_5', 'Price_Change']].head(10))
4 Подготовка данных для обучения
Разделим данные на признаки (X) и целевую переменную (y), а затем на обучающую и тестовую выборки:
from sklearn.model_selection import train_test_split
# Выбираем признаки
features = ['Open', 'High', 'Low', 'Close', 'Volume',
'SMA_5', 'SMA_10', 'Price_Change',
'High_Low_Pct', 'Volume_Change']
X = data_clean[features]
y = data_clean['Target']
# Разделяем данные: 80% на обучение, 20% на тестирование
X_train, X_test, y_train, y_test = train_test_split(
X, y, test_size=0.2, random_state=42, shuffle=False
)
print(f"Обучающая выборка: {len(X_train)} записей")
print(f"Тестовая выборка: {len(X_test)} записей")
print(f"Процент роста в обучающей: {y_train.mean():.2%}")
print(f"Процент роста в тестовой: {y_test.mean():.2%}")
Важный нюанс: Мы используем shuffle=False, потому что временные ряды имеют последовательность. Перемешивание разрушит временные зависимости.
5 Обучение моделей машинного обучения
Попробуем две простые модели: логистическую регрессию и Random Forest:
from sklearn.linear_model import LogisticRegression
from sklearn.ensemble import RandomForestClassifier
from sklearn.metrics import accuracy_score, classification_report
# Модель 1: Логистическая регрессия
lr_model = LogisticRegression(max_iter=1000, random_state=42)
lr_model.fit(X_train, y_train)
lr_predictions = lr_model.predict(X_test)
# Модель 2: Random Forest
rf_model = RandomForestClassifier(n_estimators=100, random_state=42, max_depth=5)
rf_model.fit(X_train, y_train)
rf_predictions = rf_model.predict(X_test)
# Оценка точности
lr_accuracy = accuracy_score(y_test, lr_predictions)
rf_accuracy = accuracy_score(y_test, rf_predictions)
print(f"Точность логистической регрессии: {lr_accuracy:.2%}")
print(f"Точность Random Forest: {rf_accuracy:.2%}")
print("\nОтчет по классификации (Random Forest):")
print(classification_report(y_test, rf_predictions))
6 Визуализация результатов
Создадим графики, чтобы лучше понять результаты:
import matplotlib.pyplot as plt
import seaborn as sns
# Настройка стиля графиков
plt.style.use('seaborn-v0_8-whitegrid')
sns.set_palette("husl")
fig, axes = plt.subplots(2, 2, figsize=(14, 10))
# 1. Фактическая цена и прогнозы
axes[0, 0].plot(data_clean.index[-len(y_test):], data_clean['Close'].iloc[-len(y_test):],
label='Фактическая цена', alpha=0.7)
axes[0, 0].set_title('Цена акций Apple (тестовый период)')
axes[0, 0].set_xlabel('Дата')
axes[0, 0].set_ylabel('Цена ($)')
axes[0, 0].legend()
axes[0, 0].tick_params(axis='x', rotation=45)
# 2. Сравнение точности моделей
models = ['Логистическая регрессия', 'Random Forest']
accuracies = [lr_accuracy, rf_accuracy]
axes[0, 1].bar(models, accuracies, color=['skyblue', 'lightcoral'])
axes[0, 1].set_title('Сравнение точности моделей')
axes[0, 1].set_ylabel('Точность')
axes[0, 1].set_ylim(0, 1)
for i, v in enumerate(accuracies):
axes[0, 1].text(i, v + 0.02, f'{v:.2%}', ha='center')
# 3. Важность признаков в Random Forest
feature_importance = pd.DataFrame({
'feature': features,
'importance': rf_model.feature_importances_
}).sort_values('importance', ascending=True)
axes[1, 0].barh(feature_importance['feature'], feature_importance['importance'])
axes[1, 0].set_title('Важность признаков (Random Forest)')
axes[1, 0].set_xlabel('Важность')
# 4. Матрица ошибок для Random Forest
from sklearn.metrics import confusion_matrix
import seaborn as sns
cm = confusion_matrix(y_test, rf_predictions)
sns.heatmap(cm, annot=True, fmt='d', cmap='Blues', ax=axes[1, 1])
axes[1, 1].set_title('Матрица ошибок (Random Forest)')
axes[1, 1].set_xlabel('Предсказанный класс')
axes[1, 1].set_ylabel('Фактический класс')
axes[1, 1].set_xticklabels(['Не рост', 'Рост'])
axes[1, 1].set_yticklabels(['Не рост', 'Рост'])
plt.tight_layout()
plt.savefig('apple_stock_predictions.png', dpi=300, bbox_inches='tight')
plt.show()
Возможные ошибки и как их избежать
| Ошибка | Причина | Решение |
|---|---|---|
| Точность около 50% | Модель не учится, признаки не информативны | Добавь больше признаков (RSI, MACD, волатильность) |
| Переобучение | Модель запоминает шум, а не закономерности | Уменьши сложность модели, используй регуляризацию |
| Data leakage | Использование будущих данных для прогноза прошлого | Всегда разделяй данные хронологически |
| Низкая точность на новых данных | Рынок изменился, модель устарела | Регулярно переобучай модель на свежих данных |
Как улучшить проект для школы?
Чтобы получить отличную оценку, добавь эти элементы:
- Веб-интерфейс: Создай простой сайт на Flask или Streamlit, где можно ввести дату и получить прогноз
- Больше данных: Добавь данные по конкурентам Apple (Microsoft, Google) или макроэкономические показатели
- Ансамбли моделей: Объедини прогнозы нескольких моделей для повышения точности
- Анализ ошибок: Проанализируй, в какие дни модель ошибается чаще всего и почему
- Бэктестинг: Смоделируй, сколько денег можно было бы заработать, следуя прогнозам модели
Часто задаваемые вопросы (FAQ)
1. Почему точность не 100%?
Рынок акций — сложная система со множеством случайных факторов. Даже профессиональные трейдеры не могут предсказывать с абсолютной точностью. Точность 55-65% уже считается хорошей для простой модели.
2. Можно ли использовать эту модель для реальных инвестиций?
Нет! Это образовательный проект. Реальные инвестиции требуют учета сотен факторов, анализа рисков и глубокого понимания рынка. Начни с бумажной торговли (simulated trading), если хочешь попрактиковаться.
3. Какие еще модели можно попробовать?
После освоения базовых моделей попробуй:
- Градиентный бустинг (XGBoost, LightGBM)
- Простые нейронные сети (MLP)
- Модели для временных рядов (ARIMA, LSTM)
4. Как представить проект на школьной конференции?
Создай презентацию с:
- Постановкой проблемы (зачем прогнозировать акции?)
- Описанием данных и их источников
- Визуализацией процесса (графики из кода выше)
- Результатами и выводами
- Демонстрацией работающего прототипа (если сделал веб-интерфейс)
Заключение
Ты только что создал свой первый ИИ для прогноза акций! Это отличный старт в машинном обучении. Помни:
- Начинай с простого и постепенно усложняй
- Экспериментируй с разными признаками и моделями
- Визуализируй всё — это помогает понять данные
- Делись кодом на GitHub (это отличное портфолио)
Следующий шаг — попробовать предсказывать не просто рост/падение, а процент изменения. Или добавить анализ новостей о Apple с помощью NLP. Возможности безграничны!