Quant0 commited on
Commit
b26e4c8
·
verified ·
1 Parent(s): 5e569f0

Create data.py

Browse files
Files changed (1) hide show
  1. data.py +115 -0
data.py ADDED
@@ -0,0 +1,115 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # -*- coding: utf-8 -*-
2
+ # Módulo para descarga y preparación de datos desde APIs y web
3
+
4
+ import pandas as pd
5
+ import numpy as np
6
+ import requests
7
+ import time
8
+ import yfinance as yf
9
+ from datetime import datetime, timedelta
10
+
11
+ from config import CRYPTOCOMPARE_API_KEY, CRYPTOCOMPARE_BASE_URL
12
+ from utils import limpiar_texto, expand_money, descargar_tabla_web
13
+
14
+ # Diccionario global para almacenar datos históricos
15
+ all_historical_data = {}
16
+
17
+ def fetch_btc_data_cryptocompare():
18
+ """Descarga datos horarios de BTC desde CryptoCompare para los últimos 10 años."""
19
+ SYMBOL = "BTC"
20
+ CURRENCY = "USD"
21
+ LIMIT_PER_CALL = 2000
22
+
23
+ end_time = datetime.now()
24
+ start_time = end_time - timedelta(days=10 * 365)
25
+ to_timestamp = int(end_time.timestamp())
26
+ all_data = []
27
+
28
+ while True:
29
+ params = {
30
+ "fsym": SYMBOL,
31
+ "tsym": CURRENCY,
32
+ "limit": LIMIT_PER_CALL,
33
+ "toTs": to_timestamp,
34
+ "api_key": CRYPTOCOMPARE_API_KEY
35
+ }
36
+ try:
37
+ response = requests.get(CRYPTOCOMPARE_BASE_URL, params=params)
38
+ data = response.json()
39
+
40
+ if data['Response'] == 'Error':
41
+ print(f"API Error: {data['Message']}")
42
+ break
43
+
44
+ ohlcv_data = data['Data']['Data']
45
+ if not ohlcv_data:
46
+ break
47
+
48
+ all_data.extend(ohlcv_data)
49
+ to_timestamp = ohlcv_data[0]['time'] - 1
50
+ oldest_data_time = datetime.fromtimestamp(ohlcv_data[0]['time'])
51
+
52
+ if oldest_data_time <= start_time:
53
+ break
54
+
55
+ time.sleep(1)
56
+ except requests.exceptions.RequestException as e:
57
+ print(f"Network error: {e}")
58
+ time.sleep(5)
59
+ except Exception as e:
60
+ print(f"Unexpected error: {e}")
61
+ break
62
+
63
+ btc_df = pd.DataFrame(all_data)
64
+ btc_df['time'] = pd.to_datetime(btc_df['time'], unit='s')
65
+ btc_df.set_index('time', inplace=True)
66
+ btc_df.sort_index(inplace=True)
67
+ btc_df = btc_df[~btc_df.index.duplicated(keep='first')]
68
+ btc_df.index = btc_df.index.tz_localize('UTC').tz_convert('America/New_York')
69
+ btc_df = btc_df[btc_df.index.hour == 16]
70
+ btc_df.index = btc_df.index.date
71
+ btc_df.columns = btc_df.columns.str.title()
72
+ btc_df.index = pd.to_datetime(btc_df.index)
73
+
74
+ all_historical_data['BTC-USD'] = btc_df
75
+ return btc_df
76
+
77
+ def generar_tickers():
78
+ """Genera una lista global de tickers a partir de las tablas de stocks y ETFs."""
79
+ tickers = []
80
+ url_stocks = "https://bitcointreasuries.net/"
81
+ url_etfs = "https://bitcointreasuries.net/etfs-and-exchanges"
82
+
83
+ df_stocks = descargar_tabla_web(url_stocks, indice_tabla=3)
84
+ df_etfs = descargar_tabla_web(url_etfs, indice_tabla=3)
85
+
86
+ if df_stocks is not None and not df_stocks.empty:
87
+ df_stocks['Name'] = df_stocks[2].apply(limpiar_texto)
88
+ tickers.extend(df_stocks['Name'].dropna().tolist())
89
+
90
+ if df_etfs is not None and not df_etfs.empty:
91
+ df_etfs['Name'] = df_etfs[2].apply(limpiar_texto)
92
+ tickers.extend(df_etfs['Name'].dropna().tolist())
93
+
94
+ return tickers
95
+
96
+ def data_option(ticker, date, option_type, size_of_the_window=4):
97
+ """Obtiene datos de opciones para un ticker en una fecha específica."""
98
+ price = yf.Ticker(ticker).info['regularMarketPrice']
99
+ chain = yf.Ticker(ticker).option_chain(date)
100
+ data = chain.puts if option_type == 'put' else chain.calls
101
+ data = data.iloc[:, [0, 2, 3, 8, 10, 11, 13]]
102
+ data['impliedVolatility'] = data['impliedVolatility'].apply(lambda x: f"{x*100:.2f}%")
103
+ data = data.sort_values(by='strike', key=lambda x: abs(x - price))
104
+
105
+ price_row = pd.DataFrame([[
106
+ '░░░░░░░ Spot Price ░░░░░░░', price, '░'*13, '░'*10, '░'*18, '░'*11, '░'*10
107
+ ]], columns=data.columns)
108
+
109
+ date_row = pd.DataFrame([[
110
+ f"▓▓▓▓▓▓▓ {date} ▓▓▓▓▓▓▓", '▓'*7, '▓'*13, '▓'*10, '▓'*18, '▓'*11, '▓'*10
111
+ ]], columns=data.columns)
112
+
113
+ data = pd.concat([data.head(size_of_the_window), price_row]).sort_values(by='strike')
114
+ data = pd.concat([date_row, data])
115
+ return data.reset_index(drop=True)