Предыстория:

Я инженер-программист, заинтересованный в создании собственного алгоритмического торгового бота вместе с методами обучения с подкреплением и машинного обучения. Этот блог включает в себя мои обновления о моих последних открытиях и знаниях.

Наша конечная цель — не машина для печатания денег, а безрисковая стратегия инвестирования денег в условиях растущей инфляции. Пожалуйста, посетите https://mlalgotrading.com/ для получения дополнительной информации о машинном обучении и алгоритмическом трейдинге.

Бесплатные наборы данных/API фондового рынка, которые я недавно тестировал

Начнем с того, что в Интернете можно найти действительно много источников данных, и я был поражен тем, как много компаний просто зарабатывают деньги, продавая данные. Я почти уверен, что читал, что этот рынок стоит около 3 миллиардов и увеличивается с каждым годом.
В любом случае, в исследовательских целях я экспериментировал с бесплатными источниками данных, такими как Alpaca, AlphaVantage, YahooFinance, IEXFinance, Investing, Quandl(Nasdaq) и MarketStack.

Отказ от ответственности: в этом сообщении не используется партнерский маркетинг.

1) Рынки Альпака

Сначала я начал с Альпаки, так как уже имел опыт работы с их API.
Для целей Paper Trading это действительно отличный сервис, поскольку их документация хорошо написана и полностью бесплатна.
TL/DR: Данные можно использовать в минутах, часах и дневных тикерах, НО можно использовать только начиная с 2015 года И необходимо произвести очистку данных, так как дробление акций не учитывается :(

Начните со следующего кода после создания бесплатной учетной записи.

def AlpacaData(Symbols=['AAPL']):
    BASE_URL = "https://paper-api.alpaca.markets"
    KEY_ID = "YOUR-ID"
    # Instantiate REST API Connection
    SECRET_KEY = "YOUR-KEY"
    api = tradeapi.REST(key_id=KEY_ID,secret_key=SECRET_KEY,base_url="https://paper-api.alpaca.markets")
    barTimeframe = "1D"  # 1Min, 5Min, 15Min, 1H, 1D

    # Fetch Account
    account = api.get_account()
    # Print Account Details
    print(account.id, account.equity, account.status)

    iteratorPos = 0  # Tracks position in list of symbols to download

    for Symbol in Symbols:
        # Fetch Apple data from last 100 days
        Alpaca_DataFrame = api.get_bars(Symbol, barTimeframe, start="2010-01-01", adjustment='raw').df
        Alpaca_DataFrame['Symbol'] = Symbol
        # Preview Data
        #Alpaca_DataFrame.to_csv('Alpaca_Data.csv', mode='a', index=False, header=False) #Appending mode
        Alpaca_DataFrame.to_csv('01_Alpaca_Data.csv')

2) Яху! Финансы (YFinance)

Пока я использовал таблицы Google, я часто сталкивался с Google Finance, который, что интересно, получает данные из Yahoo! Финансы. YFinance — один из лучших источников данных, который вы можете найти, и он очень популярен в сообществе. Разделение акций учитывается, но, к сожалению, имеет только данные OHLCV на конец дня (Open-High-Low-Close-Volume).

Я могу просто сказать вам, если YFinance будет иметь данные минутного или часового тикера, это станет стандартом на всем рынке.

Проверьте это с помощью следующего кода, вам даже не нужно создавать учетную запись:

def YfinanceData(Symbols):
    # Interval required 5 minutes
    start = datetime.datetime(2015, 12, 1)
    for Symbol in Symbols:
        Yfinance_DataFrame = yf.download(tickers=Symbol, interval='1d', start= start)
        Yfinance_DataFrame['Symbol'] = Symbol
        Yfinance_DataFrame.to_csv('02_Yfinance_Data.csv')

3) КВАНДЛ/НАСДАК

Quandl был приобретен Nasdaq, поскольку он предлагает альтернативные данные, которых у Nasdaq раньше не было. У него довольно старые данные, которые могут начинаться с 2000-х годов, но, к сожалению, дробление акций также не учитывается. Без предварительной обработки этих наборов данных наша модель машинного обучения дала бы нам плохие результаты, на которые нельзя было бы положиться. Кроме того, имена символов не совпадают с теми, которые используются Yahoo Finance или другими компаниями, но содержат некоторые интересные названия, такие как «WIKI/AAPL.4»…

def QuandlData(Symbols): # Or NasdaqData since it is acquired by nasdaq

    #Unfortunately, it has it's own naming convention for symbols :(
    Symbols = ['WIKI/AAPL.4']
    for Symbol in Symbols:
        Nasdaq_Dataframe = nasdaqdatalink.get(Symbol, start_date="2001-12-31", end_date="2021-12-31")
        Nasdaq_Dataframe['Symbol'] = Symbol
        Nasdaq_Dataframe.to_csv('DataSets/CSVs/03_Nasdaq_Data.csv')


        # df.index = mdates.date2num(df.index)
        # data = df.reset_index().values # Convert dataframe into 2-D list

4) IEXФинансы

Данные IEXCloud также являются одним из самых популярных наборов данных на рынке. Он содержит данные максимум за 15 лет, учитывает дробление акций и имеет хорошо написанную документацию по API. Недостатки в том, что вы получаете кредитные баллы за каждый месяц (учетная запись Freemium), и пока я тестировал API, у меня уже закончились кредитные баллы… Тем не менее, у него те же данные OHLCV И дополнительно некоторые другие показатели, такие как процентное изменение Opens и т. д. Доступны ежедневные, часовые и минутные тикеры.
Кроме того, в нем также есть альтернативные данные, которые вам обязательно нужно посмотреть.

После создания бесплатной учетной записи не стесняйтесь протестировать ее с помощью следующего кода:

def IEXCloudData(Symbols):

    for Symbol in Symbols:
        IEXCloud_Dataframe = get_historical_data(Symbol, output_format='pandas',token="YOUR-KEY",
                                                 start='01/01/2007',
                                                 end='23/06/2022'
                                                 )
        IEXCloud_Dataframe.to_csv('DataSets/CSVs/05_IEXCloud_Data.csv')

5) Рыночный стек

Этот сервис предлагает те же данные, что и Yahoo! Finance, но действительно нуждается в улучшении документации и использования API. Посмотрите код, и вы поймете, что я имею в виду.

def MarketStackData(Symbols):
    r = requests.get('http://api.marketstack.com/v1/tickers/AAPL/intraday?access_key=YOURKEY&date_from=2015-01-01&date_to=2022-06-23')
    x = r.json()
    data = r.json()['data']

    MarketStack_Dataframe = pd.DataFrame.from_dict(data['intraday'])
    MarketStack_Dataframe.to_csv('DataSets/CSVs/06_MarketStackData_Data.csv')

Заключение:

Я выбираю Yahoo! Финансы, так как моя модель ML/RL будет основываться только на ежедневных тикерах. Если вам нужны почасовые или минутные биржевые данные, Alpaca Market или IEXCloud, так как оба имеют хорошую ценовую политику.

Пожалуйста, держите меня в курсе, если у вас есть другие бесплатные наборы данных, используемые для фондового рынка и алгоритмической торговли.

Вы можете подписаться на меня в Twitter
посмотреть MLAlgotrading