Construction du Dataset
Ce document décrit le processus complet de collect, nettoyage et intégration des données utilisées pour la prédiction du prix du Bitcoin sur une période de 6 ans (2019-03-15 à 2025-03-15).
Sources de Données
Données de Marché (OHLCV - Open, High, Low, Close, Volume) - Source: CoinGecko API
Période: 2019-03-15 à 2025-03-15
Fréquence: Quotidienne
Code de collecte:
import requests import pandas as pd import time def fetch_ohlcv(): """ Récupère les données OHLCV historiques du Bitcoin depuis CoinGecko API """ url = "https://api.coingecko.com/api/v3/coins/bitcoin/ohlc" params = { 'vs_currency': 'usd', 'days': 'max' # Période maximale disponible } response = requests.get(url, params=params) if response.status_code != 200: raise Exception(f"Erreur API: {response.status_code}") data = response.json() # Conversion en DataFrame ohlc = pd.DataFrame(data, columns=['timestamp', 'open', 'high', 'low', 'close']) ohlc['date'] = pd.to_datetime(ohlc['timestamp'], unit='ms') ohlc.drop('timestamp', axis=1, inplace=True) # Récupération séparée du volume volume_url = "https://api.coingecko.com/api/v3/coins/bitcoin/market_chart" volume_params = { 'vs_currency': 'usd', 'days': 'max', 'interval': 'daily' } volume_response = requests.get(volume_url, params=volume_params) volume_data = volume_response.json()['total_volumes'] volume_df = pd.DataFrame(volume_data, columns=['timestamp', 'volume']) volume_df['date'] = pd.to_datetime(volume_df['timestamp'], unit='ms') # Fusion des données full_data = ohlc.merge(volume_df[['date', 'volume']], on='date', how='left') return full_data.set_index('date').sort_index() # Exécution btc_data = fetch_ohlcv() print(btc_data.head())
Indice Fear & Greed - Source: Alternative.me API
Description: Mesure du sentiment du marché (0-100)
Code de collecte:
def fetch_fear_greed(): """ Récupère l'historique de l'indice Fear & Greed """ url = "https://api.alternative.me/fng/?limit=0" # limit=0 pour toutes les données response = requests.get(url) if response.status_code != 200: raise Exception(f"Erreur API Fear & Greed: {response.status_code}") data = response.json()['data'] df = pd.DataFrame(data) # Conversion des types df['timestamp'] = df['timestamp'].astype(int) df['value'] = df['value'].astype(int) # Formatage des dates df['date'] = pd.to_datetime(df['timestamp'], unit='s') return df[['date', 'value']].rename(columns={'value': 'fear_greed'})
Données On-Chain - Source: Glassnode API - Fonctionnalités:
AdrActCnt: Nombre d’adresses actives
TxTfrCnt: Nombre de transactions
Code de collecte:
def fetch_glassnode_metrics(): """ Récupère les métriques on-chain depuis Glassnode Nécessite une clé API """ API_KEY = "votre_cle_api_glassnode" metrics = { 'adractcnt': 'AdrActCnt', 'txtfrcnt': 'TxTfrCnt' } dfs = [] start_date = int(pd.Timestamp('2019-03-15').timestamp()) end_date = int(pd.Timestamp('2025-03-15').timestamp()) for metric, col_name in metrics.items(): url = f"https://api.glassnode.com/v1/metrics/network/{metric}" params = { 'api_key': API_KEY, 'a': 'BTC', 'i': '24h', 's': start_date, 'u': end_date } response = requests.get(url, params=params) if response.status_code != 200: print(f"Erreur pour {metric}: {response.status_code}") continue data = response.json() df = pd.DataFrame(data) df['t'] = pd.to_datetime(df['t'], unit='s') df = df.rename(columns={'v': col_name}) dfs.append(df.set_index('t')[[col_name]]) # Fusion de toutes les métriques return pd.concat(dfs, axis=1) if dfs else pd.DataFrame()
Features Utilisées
Colonne |
Description |
|---|---|
Date |
Date de l’observation (format YYYY-MM-DD) |
Open |
Prix d’ouverture du Bitcoin (USD) |
High |
Prix maximum quotidien (USD) |
Low |
Prix minimum quotidien (USD) |
Close |
Prix de clôture du Bitcoin (USD) |
Volume |
Volume d’échanges quotidien (USD) |
Fear_Greed |
Indice de sentiment du marché (0-100) |
AdrActCnt |
Nombre d’adresses actives (participant aux transactions) |
TxTfrCnt |
Nombre total de transferts de valeur (en BTC) |
Statistiques Clés
Période couverte: 6 ans (2019-2025)
Nombre d’observations: 2,191 jours
Nombre de features: 15
Fréquence: Quotidienne
Taux de complétion: 99.2% avant imputation
Note
Note : Le dataset final contient également des caractéristiques dérivées comme les moyennes mobiles et les retards temporels qui ne sont pas listés ici pour plus de clarté.