Ho_Chu
Ho_Chu личный блог
Вчера в 18:42

где можно скачать котировки фьючерсов, кроме Финама?

Проблема в том, что Финам закрыл скачивание старых (ранее 2020 года) фьючерсов по отдельности, предлагая только «склеенные» инструменты.
А для ряда задач нужно иметь параллельные котировки в районе даты экспирации, т.е. котировки уходящего фьюча вместе с котировками «будущего» фьюча.
Может кто-то знает, где скачать такие данные? Потому как склеивание по методу Финама (в ночь за 2 дня до экпирации) не подходит для решения задачи в общем виде ((.

Вот, например, по недавней экспирации 19.09.24… Финам склеивает фьючи в ночь с 17 на 18 сентября, т.е. в 23:49:59 выдеается фьюч 9.24, а утром 18-го в 10:00:00 выдается котировка 12.24-го...

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

Можно организовать другую склейку, отличную от склейки финама… тогда тоже можно поставить последовательно 2 фьюча и в момент склейки переложиться… момент склейки мы знаем, значит можно закрыть прошлую по закрытию и открыть новую по открытию след.периода

например, склеиваем в день, предшествующий экспирации, т.е. не 19.09, не в ночь с 17 на 18.09 как это делает финам, а 18.09, например в 11:40 заканчивается 9.24, а в 11:45 начинается 12.24… дату/время склейки мы знаем, перезайти — только ночь не поспать ))

но для этого нужны котировки
а их нет ((

21 Комментарий
  • Влад Л.
    Вчера в 18:53
    Не помню точно, но что-то вроде до 11-12гг
    должно быть тут
    iss.moex.com/iss/reference/
    https://www.moex.com/a2193
      • Ramha
        Вчера в 20:29
        Ho_Chu,  сам догадаешься какие цифры в строках исправить 
          • Ramha
            Вчера в 21:04
            Ho_Chu, наверно в древних только дневки или через подписку отдадут историю. Напиши им в поддержку.
  • __rtx
    Вчера в 20:39

    «iss.moex.com/iss/engines.xml» — список рынков

    «iss.moex.com/iss/engines/stock/markets.xml» — список инструментов(фьючерсы, опционы и т.д.)

    (вот для срочного ошибочка выше вышла)«iss.moex.com/iss/engines/futures/markets.xml»


    это за текущий день

    «iss.moex.com/iss/engines/futures/markets/forts/trades.xml»

    чтобы историю качать, надо на сайте Вам смотреть(лет 10 назад отсюда качал не помню как называется и там выдаёт порциями максимум 5000 строк вроде как, надо отправлять запрос, получать данные и следующий запрос с аргументом +5000, так повторять пока не кончатся данные)

    так для свечей но раньше качал тики(весь срочный рынок), не знаю сейчас осталось или нет.
    iss.moex.com/iss/history/engines/futures/markets/forts/securities.xml?date=2010-11-22



      • __rtx
        Вчера в 20:59
        Ho_Chu, всё что соизволит. Если имеете ввиду что нужно писать код, это да, но есть чат гпт. Ему можно написать примерно так:

        Вадим вот ссылка — «iss.moex.com/iss/history/engines/futures/markets/forts/securities.xml?date=2010-11-22» напиши код на питоне чтобы он это всё превратил в текстовый/csv/или ещё какой файл.

          • __rtx
            Вчера в 21:09
            Ho_Chu, как запускать питон файл в терминале надо показывать?)
              • __rtx
                Вчера в 21:32
                Ho_Chu, сохраняете текст который я написал выше в файл с названием например iss.py открываете терминал и запускаете -->> python3 iss.py он создаст текстовый файл который можно открыть например в экселе. Эксель слишком умная программа поэтому чтобы она не форматировала время такое 19:00:00.073 в такое 19:00:00 можно переименовать файл .csv тогда по моему будет как надо.

                а в файле будет примерно такое:
                BOARDID TRADEDATE SECID OPEN LOW HIGH CLOSE OPENPOSITIONVALUE VALUE VOLUME OPENPOSITION SETTLEPRICE SWAPRATE WAPRICE SETTLEPRICEDAY CHANGE QTY NUMTRADES INDEX TOTAL PAGESIZE
                0 RFUD 2010-11-22 BRF1_2011 85.9900 83.7100 86.8600 83.9500 2.456042e+07 1.695376e+07 646.0 940.0 83.9900 NaN 84.3900 NaN -1.142 2.0 55.0 NaN NaN NaN
                1 RFUD 2010-11-22 BRG1_2011 84.6800 84.6800 85.5000 85.5000 1.680561e+06 1.857277e+05 7.0 64.0 84.4100 NaN 85.2900 NaN 0.105 1.0 4.0 NaN NaN NaN
                2 RFUD 2010-11-22 BRZ0_2010 84.5800 83.6800 85.4400 83.8900 2.841285e+09 1.358865e+09 51582.0 108874.0 83.8900 NaN 84.6800 NaN -1.073 6.0 2838.0 NaN NaN NaN
                3 RFUD 2010-11-22 CBX0_2010 NaN NaN NaN NaN 6.779808e+06 NaN NaN 114.0 826.0000 NaN NaN NaN NaN NaN 0.0 NaN NaN NaN
                4 RFUD 2010-11-22 CBZ0_2010 900.0000 890.0000 900.0000 890.0000 1.377293e+07 1.331760e+05 2.0 208.0 890.0000 NaN 895.0000 NaN -1.874 1.0 2.0 NaN NaN NaN
                5 RFUD 2010-11-22 CHH1_2011 NaN NaN NaN NaN 5.406120e+05 NaN NaN 12.0 45051.0000 NaN NaN NaN NaN NaN 0.0 NaN NaN NaN
                6 RFUD 2010-11-22 CHZ0_2010 45705.0000 45117.0000 45838.0000 45117.0000 2.239608e+08 1.096730e+07 241.0 4964.0 45117.0000 NaN 45507.0000 NaN 0.741 20.0 18.0 NaN NaN NaN
                7 RFUD 2010-11-22 CPX0_2010 960.0000 960.0000 967.0000 967.0000 6.169267e+06 1.315709e+06 93.0 434.0 967.0000 NaN 962.0000 NaN -0.719 2.0 19.0 NaN NaN NaN
                  • __rtx
                    Вчера в 22:41
                    Ho_Chu, если Вам нужен файл с данными, то это оно и есть. Скрипт скачивает в .csv файл данные берёте их и куда надо используете. Завтра посмотрю как тики качать(с параметром который указывать для получения более 5000 строк) и сюда положу. А так вообще нужно самому привыкать работать.
                      • __rtx
                        Сегодня в 01:43
                        Ho_Chu, свечи меньше дня не нашёл, возможно их там нет, можно делать самому(долго). Как делать если всё таки нужно:

                        скрипт ниже качает тиковые данные в файл из этого файла надо взять интересущий инструмент, скопировать(контрлц контрлв) в эксель и сохранить.

                        например можно назвать iss.py

                        import requests

                        import pandas as pd
                        from bs4 import BeautifulSoup

                        def get_trades(tradeno=0, date=«2015-11-24»):
                        ""«Получает сделки по инструменту с использованием пагинации.»""
                        """
                        url строку можно менять примеры рынков и инструментов:
                        iss.moex.com/iss/engines.xml, iss.moex.com/iss/engines/stock/markets.xml, iss.moex.com/iss/engines/futures/markets.xml
                        """
                        url = f«iss.moex.com/iss/history/engines/futures/markets/forts/trades.xml?date={date}&tradeno={tradeno}»

                        response = requests.get(url)
                        response.raise_for_status()
                        soup = BeautifulSoup(response.content, 'xml')

                        data = []
                        for row in soup.find_all('row'):
                        row_data = {}
                        for key in ['SESSIONDATE', 'TRADENO', 'TRADEDATE', 'TRADETIME', 'SECID', 'BOARDID', 'PRICE', 'QUANTITY', 'OFFMARKETDEAL', 'IQSDEAL', 'RFSDEAL']:
                        row_data[key] = row.get(key)
                        data.append(row_data)

                        df = pd.DataFrame(data)

                        # Преобразуем столбцы в нужные типы данных
                        for column in ['TRADEDATE', 'SESSIONDATE']:
                        df[column] = pd.to_datetime(df[column], errors='coerce')
                        for column in ['TRADENO', 'QUANTITY', 'OFFMARKETDEAL', 'IQSDEAL', 'RFSDEAL']:
                        df[column] = pd.to_numeric(df[column], errors='coerce', downcast='integer')
                        df['PRICE'] = pd.to_numeric(df['PRICE'], errors='coerce')

                        return df

                        # Параметры
                        date = «2015-11-24»

                        df = pd.DataFrame(columns=['SESSIONDATE', 'TRADENO', 'TRADEDATE', 'TRADETIME', 'SECID', 'BOARDID', 'PRICE', 'QUANTITY', 'OFFMARKETDEAL', 'IQSDEAL', 'RFSDEAL'])
                        start_tradeno = -1

                        # Сохраняем DataFrame в CSV
                        df.to_csv('trades.csv', mode='a', header=True, index=False) # Добавляем заголовки

                        while True:
                        df = get_trades(tradeno=start_tradeno + 1, date=date) # Увеличиваем tradeno

                        # Сохраняем DataFrame в CSV с добавлением
                        df.to_csv('trades.csv', mode='a', header=False, index=False)

                        if len(df) < 500:
                        break # Закончили парсинг, если получено меньше 500 строк

                        start_tradeno = df['TRADENO'].iloc[-1] # Устанавливаем новый start_tradeno

                        print(«Данные успешно сохранены в файл 'trades.csv'»)


                        этот скрипт делает свечи указанного периода из файла в который скопировали нужный инструмент и пишет их в файл(период можно указать от 1 секунды).

                        например можно назвать get_candles.py

                        import pandas as pd

                        def create_candles(df, interval_seconds=1):
                        ""«Создает свечи из данных о сделках.»""
                        df['TRADETIME'] = pd.to_datetime(df['TRADETIME'])
                        df['timestamp'] = df['TRADETIME'].dt.floor(f'{interval_seconds}S')
                        df = df.sort_values(by=['timestamp', 'TRADETIME'])

                        ohlc = df.groupby('timestamp').agg(
                        open=('PRICE', 'first'),
                        high=('PRICE', 'max'),
                        low=('PRICE', 'min'),
                        close=('PRICE', 'last'),
                        volume=('QUANTITY', 'sum')
                        )
                        return ohlc

                        # Загружаем данные из файла, преобразовав столбцы в datetime
                        df = pd.read_csv('trades.csv', sep=',',
                        parse_dates=['SESSIONDATE', 'TRADEDATE', 'TRADETIME'],
                        infer_datetime_format=True)

                        # Создаем свечи с интервалом x секунд
                        x = 10
                        ohlc_xsec = create_candles(df, interval_seconds=x)

                        # Сохраняем свечи в файл
                        ohlc_xsec.to_csv(f'candles_{x}sec.csv', index=True)

                        print(f«Свечи успешно созданы и сохранены в файл 'candles_{x}sec.csv'»)


                        Возможно из-за форматирования сообщений, код работать не будет в питоне важны отступы, поэтому, чтобы не заморачиваться, можно его просто скопировать чатгпт, он поправит.

                        если не будет работать надо установить библиотеки:
                        pip install --upgrade pip && pip install lxml && pip install beautifulsoup4 && pip install requests

                        запускать из терминала(командной строки) так -->> python3 iss.py

                        взять из файла trades.csv нужные данные ctrl+c ctrl+v в эксель файл сохранить его и в скрипте get_candles.py поправить имя чтобы он понимал какой файл смотреть

                        запускать из терминала(командной строки) так -->> python3 get_candles.py

      • __rtx
        Вчера в 21:08
        Ho_Chu, вот почти готовый код(попросил гпт написать, его надо чуть доделать)

        import requests
        import pandas as pd
        from bs4 import BeautifulSoup

        url = «iss.moex.com/iss/history/engines/futures/markets/forts/securities.xml?date=2010-11-22»

        response = requests.get(url)
        response.raise_for_status() # Проверяем на ошибки

        soup = BeautifulSoup(response.content, 'xml')

        data = []
        for row in soup.find_all('row'):
        row_data = {}
        for key, value in row.attrs.items():
        row_data[key] = value
        data.append(row_data)

        df = pd.DataFrame(data)

        # Преобразуем столбцы в нужные типы данных
        for column in ['OPEN', 'LOW', 'HIGH', 'CLOSE', 'OPENPOSITIONVALUE', 'VALUE', 'SETTLEPRICE', 'SWAPRATE', 'WAPRICE', 'SETTLEPRICEDAY', 'CHANGE']:
        df[column] = pd.to_numeric(df[column], errors='coerce')
        for column in ['VOLUME', 'OPENPOSITION', 'QTY', 'NUMTRADES']:
        df[column] = pd.to_numeric(df[column], errors='coerce', downcast='integer')

        # Сохраняем в CSV
        df.to_csv('securities.csv', index=False)

        # Сохраняем в текстовый файл
        with open('securities.txt', 'w') as f:
        f.write(df.to_string())

        print(«Данные успешно сохранены в файлы 'securities.csv' и 'securities.txt'»)

Активные форумы
Что сейчас обсуждают

Старый дизайн
Старый
дизайн