Ценовой центр НРД

Ценовой центр НРД – это аккредитованная Банком России автоматизированная система оценки справедливых цен финансовых инструментов, рассчитанных по Методике НРД

Итоги торгов через API

Агрегированная информация об итогах торгов ценными бумагами с зарубежных торговых площадок

URL


            
using System;
using System.Data;
using ClosedXML.Excel; // NuGet
using Newtonsoft.Json; // NuGet
using Newtonsoft.Json.Linq; // NuGet
using System.Collections.Generic;
using System.Net.Http;

namespace EODCSHARP
{
    public class Program
    {
        private const string ApiUrl = "https://nsddata.ru/api/get/eod";
        private const string ApiKey = "";
        private const int Limit = 100;
        private const string FileName = "eod.xlsx";

        public static void Main(string[] args)
        {
            var isins = new List()
            {
                "LU1834988278",
                "US29664W1053",
                "XS2432286974"
            };
            var dateFrom = DateTime.Now.AddDays(-30);
            var dateTo = DateTime.Now;

            var dt = GetEodDt(isins, dateFrom, dateTo);

            var dv = dt.DefaultView;
            dv.Sort = "Isin ASC, LastTradeDate DESC";
            dt = dv.ToTable();

            dt = RenameDtColumns(dt);

            var excelWorkBook = FormExcel(dt);

            excelWorkBook.SaveAs(FileName);
        }

        private static DataTable GetEodDt(List isins, DateTime dateFrom, DateTime dateTo)
        {
            var dtEod = new DataTable();

            foreach (var isin in isins)
            {
                var dtIsin = GetRequestResultForIsin(isin, dateFrom, dateTo);
                dtEod.Merge(dtIsin);
            }

            return dtEod;
        }

        private static DataTable GetRequestResultForIsin(string isin, DateTime dateFrom, DateTime dateTo)
        {
            var dateFormat = "yyyy-MM-dd";

            var apiFilter = new JObject
            {
                ["$and"] = new JArray
                {
                    new JObject
                    {
                        ["isin"] = isin
                    },
                    new JObject
                    {
                        ["last_trade_date"] = new JObject
                        {
                            ["$gte"] = dateFrom.ToString(dateFormat),
                            ["$lte"] = dateTo.ToString(dateFormat)
                        }
                    }
                }
            };

            var requestUrl = ApiUrl
                            + $"?filter={apiFilter.ToString(Formatting.None)}"
                            + $"&limit={Limit}"
                            + $"&apikey={ApiKey}";

            var httpClient = new HttpClient();
            var jsonString = httpClient.GetStringAsync(requestUrl).GetAwaiter().GetResult();

            var paperType = JArray.Parse(jsonString)[0]["security_category"].ToString();

            if (paperType == "акции")
            {
                var stocks = JsonConvert.DeserializeObject>(jsonString);
                return ListToDataTable(stocks);
            }
            else
            {
                var bonds = JsonConvert.DeserializeObject>(jsonString);
                return ListToDataTable(bonds);
            }
        }

        public static DataTable ListToDataTable(List items)
        {
            var dataTable = new DataTable();

            var properties = typeof(T).GetProperties();

            foreach (var property in properties)
                dataTable.Columns.Add(property.Name, property.PropertyType);

            foreach (var item in items)
            {
                var values = new object[properties.Length];

                for (int i = 0; i < properties.Length; i++)
                    values[i] = properties[i].GetValue(item, null);

                dataTable.Rows.Add(values);
            }

            return dataTable;
        }

        private static DataTable RenameDtColumns(DataTable dt)
        {
            var columnNamesDict = new Dictionary()
            {
                ["Isin"] = "Код ISIN",
                ["Name"] = "Наименование облигации",
                ["IssuerName"] = "Наименование эмитента",
                ["Currency"] = "Код валюты",
                ["Maturity"] = "Дата погашения",
                ["Coupon"] = "Купон (в % годовых)",
                ["SecurityType"] = "Тип инструмента",
                ["SecurityCategory"] = "Категория ценной бумаги",
                ["LastTradeDate"] = "Последняя доступная торговая дата",
                ["Ytm"] = "Доходность до погашения",
                ["PriceBid"] = "Цена bid",
                ["PriceAsk"] = "Цена ask",
                ["Duration"] = "Дюрация",
                ["PriceOpen"] = "Цена открытия",
                ["PriceHigh"] = "Максимальная цена",
                ["PriceLow"] = "Минимальная цена",
                ["PriceClose"] = "Цена закрытия",
                ["Mic"] = "Код биржи",
                ["SicName"] = "Классификация SIC",
                ["VolumeTrade"] = "Объем",
                ["ExchangeName"] = "Наименование биржи",
                ["PrimaryExchangeMic"] = "Код первичной биржи",
                ["PrimaryExchangeName"] = "Наименование первичной биржи",
                ["GicsName"] = "Классификация GICS",
                ["Lei"] = "Идентификатор юридического лица",
            };

            foreach (DataColumn column in dt.Columns)
            {
                if (!columnNamesDict.TryGetValue(column.ColumnName, out var translatedColumnName))
                    throw new Exception($"Неизвестный столбец, {column.ColumnName}");

                column.ColumnName = translatedColumnName;
            }

            return dt;
        }

        private static XLWorkbook FormExcel(DataTable dt)
        {
            var workBook = new XLWorkbook();

            var workSheet = workBook.Worksheets.Add("Eod");
            workSheet.FirstCell().InsertTable(dt);

            return workBook;
        }
    }

    public class Bond
    {
        [JsonProperty("isin")]
        public string Isin { get; set; }
        [JsonProperty("name")]
        public string Name { get; set; }
        [JsonProperty("security_category")]
        public string SecurityCategory { get; set; }
        [JsonProperty("security_type")]
        public string SecurityType { get; set; }
        [JsonProperty("currency")]
        public string Currency { get; set; }
        [JsonProperty("last_trade_date")]
        public DateTime LastTradeDate { get; set; }
        [JsonProperty("price_open")]
        public double PriceOpen { get; set; }
        [JsonProperty("price_high")]
        public double PriceHigh { get; set; }
        [JsonProperty("price_low")]
        public double PriceLow { get; set; }
        [JsonProperty("price_close")]
        public double PriceClose { get; set; }
        [JsonProperty("price_ask")]
        public double PriceAsk { get; set; }
        [JsonProperty("price_bid")]
        public double PriceBid { get; set; }
        [JsonProperty("mic")]
        public string Mic { get; set; }
        [JsonProperty("maturity")]
        public DateTime Maturity { get; set; }
        [JsonProperty("coupon")]
        public double Coupon { get; set; }
        [JsonProperty("sic_name")]
        public string SicName { get; set; }
        [JsonProperty("ytm")]
        public double Ytm { get; set; }
        [JsonProperty("duration")]
        public double Duration { get; set; }
        [JsonProperty("issuer_name")]
        public string IssuerName { get; set; }
    }
    public class Stock
    {
        [JsonProperty("isin")]
        public string Isin { get; set; }
        [JsonProperty("security_category")]
        public string SecurityCategory { get; set; }
        [JsonProperty("security_type")]
        public string SecurityType { get; set; }
        [JsonProperty("Currency")]
        public string Currency { get; set; }
        [JsonProperty("Mic")]
        public string Mic { get; set; }
        [JsonProperty("last_trade_date")]
        public DateTime LastTradeDate { get; set; }
        [JsonProperty("price_open")]
        public double PriceOpen { get; set; }
        [JsonProperty("price_high")]
        public double PriceHigh { get; set; }
        [JsonProperty("price_low")]
        public double PriceLow { get; set; }
        [JsonProperty("price_close")]
        public double PriceClose { get; set; }
        [JsonProperty("volume_trade")]
        public int VolumeTrade { get; set; }
        [JsonProperty("price_bid")]
        public double PriceBid { get; set; }
        [JsonProperty("price_ask")]
        public double PriceAsk { get; set; }
        [JsonProperty("sic_name")]
        public string SicName { get; set; }
        [JsonProperty("exchange_name")]
        public string ExchangeName { get; set; }
        [JsonProperty("primary_exchange_mic")]
        public string PrimaryExchangeMic { get; set; }
        [JsonProperty("primary_exchange_name")]
        public string PrimaryExchangeName { get; set; }
        [JsonProperty("gics_name")]
        public string GicsName { get; set; }
        [JsonProperty("lei")]
        public string Lei { get; set; }
        [JsonProperty("issuer_name")]
        public string IssuerName { get; set; }
    }
}
            
        
            
import requests
import json
from datetime import date, timedelta
import pandas as pd
import openpyxl

REQUEST_URL = 'https://nsddata.ru/api/get/eod'
API_KEY = ''
LIMIT = 100
FILE_NAME = 'eod.xlsx'


def main():
    isins = [
        'LU1834988278',
        'US29664W1053',
        'XS2432286974'
    ]
    date_to = date.today()
    date_from = date_to - timedelta(days=30)

    df = get_eod_df(date_from, date_to, isins)
    df = df.sort_values(by=['isin', 'last_trade_date'], ascending=[True, False])
    df = rename_df_columns(df)
    df.to_excel(FILE_NAME, index=False)


def get_eod_df(date_from, date_to, isins):
    df_eod = pd.DataFrame()
    for isin in isins:
        df_isin = get_request_result_for_isin(isin, date_from, date_to)
        df_eod = pd.concat([df_eod, df_isin])
    return df_eod


def get_request_result_for_isin(isin, date_from, date_to):
    api_filter = {
        '$and': [
            {
                'isin': isin
            },
            {
                'last_trade_date':
                    {
                        '$gte': f'{date_from}',
                        '$lte': f'{date_to}'
                    }
            }
        ]
    }

    params = {
        'filter': f'{json.dumps(api_filter)}',
        'limit': LIMIT,
        'apikey': API_KEY,
    }

    r = requests.get(REQUEST_URL, params=params)
    df_response = pd.DataFrame(r.json())
    return df_response


def rename_df_columns(df):
    column_names_dict = {
        'isin': 'Код ISIN',
        'name': 'Наименование облигации',
        'issuer_name': 'Наименование эмитента',
        'currency': 'Код валюты',
        'maturity': 'Дата погашения',
        'coupon': 'Купон (в % годовых)',
        'security_type': 'Тип инструмента',
        'security_category': 'Категория ценной бумаги',
        'last_trade_date': 'Последняя доступная торговая дата',
        'ytm': 'Доходность до погашения',
        'price_bid': 'Цена bid',
        'price_ask': 'Цена ask',
        'duration': 'Дюрация',
        'price_open': 'Цена открытия',
        'price_high': 'Максимальная цена',
        'price_low': 'Минимальная цена',
        'price_close': 'Цена закрытия',
        'mic': 'Код биржи',
        'sic_name': 'Классификация SIC',
        'volume_trade': 'Объем',
        'exchange_name': 'Наименование биржи',
        'primary_exchange_mic': 'Код первичной биржи',
        'primary_exchange_name': 'Наименование первичной биржи',
        'gics_name': 'Классификация GICS',
        'lei': 'Идентификатор юридического лица'
    }
    return df.rename(columns=column_names_dict)


if __name__ == '__main__':
    main()