Понадобились мне минутки по SPY в формате csv для проверки некоторых теорий. Ожидаемо дневки любой Yahoo выдает, а с минутками все сложнее. Платных подписок на Market Data от eSignal, Iqfeed у меня нет, поэтому пошел за советом к ChatGPT.
Отлично, нам бесплатно — идем по ссылке по п.2.
Там База данных с интерфейсом в мир по API. За бесплатно дают: Our standard API call frequency is
5 calls per minute and 500 calls per day. Меня устраивает, только вот интрадейные данные выдает порциями по 1 месяцу и максимальной глубиной в 2 года. Глубина норм, а собирать 24 файла для каждого тикера не очень.
Two years of minute-level intraday data contains over 2 million data points, which can take up to Gigabytes of memory. To ensure optimal API response speed, the trailing 2 years of intraday data is evenly divided into 24 «slices» — year1month1
, year1month2
, year1month3
, ..., year1month11
, year1month12
, year2month1
, year2month2
, year2month3
, ..., year2month11
, year2month12
. Each slice is a 30-day window, with year1month1
being the most recent and year2month12
being the farthest from today. By default, slice=year1month1
.
Идем назад к ChatGPT и просим помочь:
Потом еще 3-4 часа на пошаговое уточнение постановки задачи, исправление багов и в результате получаем вполне рабочий код для Pyton:
import csv
import requests
import time
from datetime import datetime, timedelta
api_key = "YOUR_API_KEY"
symbols = ["SPY", "MSFT", "AMZN"]
interval = "1min"
now = datetime.now()
start_date = (now.replace(year=now.year-2)+timedelta(days=1)).strftime("%Y-%m-%d")
end_date = now.strftime("%Y-%m-%d")
for symbol in symbols:
file_name = f"{symbol}_{start_date}_{end_date}.csv"
with open(file_name, mode='w', newline='') as csv_file:
writer = csv.writer(csv_file)
for year in range(1, 3):
for month in range(1, 13):
if year == 2 and month > 12:
break
csv_url = f"https://www.alphavantage.co/query?function=TIME_SERIES_INTRADAY_EXTENDED&symbol={symbol}&interval={interval}&slice=year{year}month{month}&apikey={api_key}"
with requests.Session() as s:
while True:
download = s.get(csv_url)
decoded_content = download.content.decode('utf-8')
if "Our standard API call frequency is 5 calls per minute and 500 calls per day" in decoded_content:
print("API call limit exceeded, waiting for 60 seconds...")
time.sleep(60)
else:
break
cr = csv.reader(decoded_content.splitlines(), delimiter=',')
my_list = list(cr)
writer.writerows(my_list)
time.sleep(15)
При запуске через некоторое время получаем csv файлы с минутками по указанным тикерам. Ну там еще нужно немного их причесать, лишние заголовки поубирать и доп. торги отсеять если не нужны, но работать уже можно.
PS: возможно это «велосипед» и кто-то поделится более изящным решением данной задачи
А можешь приоткрыть завесу: чего ты проверяешь сейчас?
Есть закон перехода количественных изменений в качественные и на сегодняшний день их накопилось столько, что любая логика (если она там и была, что не факт!☝️), а равно статистическая взаимосвязь разрушается по экспоненте…
Разве только ты хочешь проанализировать короткие данные в критические дни, как то черный понедельник 1987 или август 2011.
Но скорее всего все это и так разобрано под микроскопом.
Извини, что не даю совета🤷♂️
Но правда интересно: что там хочешь найти на старых минутках?
Чатбот, к сожалению, угадывает какой кусок интернета, что мог бы вам помочь. Само оно ничего толком, к сожалению, не может.
Но да, 90% населения «тупы как дубина», и что с этим делать понятно не очень.
Вы уже бегаете за советами в гугл. Вот только гугл не в состоянии дать качественных ответов почти ни в каких областях.
п.с. нейронными сетями я тоже интересовался, тогда, когда это еще не было мейнстримом, 95-98 гг.