Ценовой центр НРД – это автоматизированная система оценки справедливых цен облигаций и других финансовых инструментов, рассчитанных по Методике НРД
Агрегированная информация об итогах торгов ценными бумагами с зарубежных торговых площадок
Скачать описание Список торговых площадок
{ "title": "JSON-схема Итоги торгов", "description": "JSON-схема для продукта Итоги торгов", "type": "array", "items": { "anyOf":[ "bonds": { "type": "object", "title": "Информация по облигациям", "description": "Основная информация по облигациям", "properties": { "isin": { "type": "string", "title": "ISIN", "description": "Код ISIN" }, "name": { "type": "string", "title": "Наименование облигации", "description": "Наименование облигации" }, "currency": { "type": "string", "title": "Код валюты", "description": "Валюта номинала" }, "maturity": { "type": "string", "title": "Дата погашения", "description": "Дата погашения облигации" }, "coupon": { "type": "number", "title": "Купон (в % годовых)", "description": "Купон (в % годовых)" }, "security_type": { "type": "string", "title": "Тип купона", "description": "Тип купона" }, "security_category": { "type": "string", "title": "Категория ценной бумаги", "description": "Категория ценной бумаги" }, "last_trade_date": { "type": "string", "title": "Последняя доступная торговая дата", "description": "Последняя доступная торговая дата" }, "ytm": { "type": "number", "title": "Доходность до погашения", "description": "Доходность до погашения" }, "price_bid": { "type": "number", "title": "Цена bid", "description": "Цена bid" }, "price_ask": { "type": "number", "title": "Цена ask", "description": "Цена ask" }, "duration": { "type": "number", "title": "Дюрация", "description": "Дюрация" }, "price_open": { "type": "number", "title": "Цена открытия", "description": "Цена открытия для торгового дня" }, "price_high": { "type": "number", "title": "Максимальная цена", "description": "Максимальная цена для торгового дня" }, "price_low": { "type": "number", "title": "Минимальная цена", "description": "Минимальная цена для торгового дня" }, "price_close": { "type": "number", "title": "Цена закрытия", "description": "Цена закрытия для торгового дня" }, "mic": { "type": "string", "title": "Код биржи", "description": "Идентификационный код биржи-провайдера ценовой информации" }, "sic_name": { "type": "string", "title": "Классификация SIC", "description": "Стандартная отраслевая классификация (наименование)" }, "issuer_name": { "type": "string", "title": "Эмитент", "description": "Эмитент" } }, "required": [ "isin", "name", "currency", "maturity", "coupon", "security_type", "security_category", "last_trade_date", "ytm", "price_bid", "price_ask", "duration", "price_open", "price_high", "price_low", "price_close", "mic", "sic_name", "issuer_name" ] }, "stocks": { "type": ["object", "null"], "title": "Информация по акциям", "description": "Ценовая информация по всем типам бумаг, кроме облигаций", "properties": { "isin": { "type": "string", "title": "ISIN", "description": "Код ISIN" }, "security_type": { "type": "string", "title": "Тип ценной бумаги", "description": "Тип ценной бумаги" }, "security_category": { "type": "string", "title": "Категория ценной бумаги", "description": "Категория ценной бумаги" }, "last_trade_date": { "type": "string", "title": "Последняя доступная торговая дата", "description": "Последняя доступная торговая дата" }, "price_open": { "type": "number", "title": "Цена открытия", "description": "Цена открытия для торгового дня" }, "price_high": { "type": "number", "title": "Максимальная цена", "description": "Максимальная цена для торгового дня" }, "price_low": { "type": "number", "title": "Минимальная цена", "description": "Минимальная цена для торгового дня" }, "price_close": { "type": "number", "title": "Цена закрытия", "description": "Цена закрытия для торгового дня" }, "volume_trade": { "type": "integer", "title": "Объем", "description": "Объем торгов ценной бумагой за день" }, "price_bid": { "type": "number", "title": "Цена bid", "description": "Цена bid" }, "price_ask": { "type": "number", "title": "Цена ask", "description": "Цена ask" }, "currency": { "type": "string", "title": "Код валюты", "description": "Валюта номинала" }, "mic": { "type": "string", "title": "Код биржи", "description": "Идентификационный код биржи-провайдера ценовой информации" }, "exchange_name": { "type": "string", "title": "Наименование биржи", "description": "Наименование биржи-провайдера ценовой информации" }, "primary_exchange_mic": { "type": "string", "title": "Код первичной биржи", "description": "Идентификационный код первичной биржи" }, "primary_exchange_name": { "type": "string", "title": "Наименование первичной биржи", "description": "Наименование первичной биржи" }, "sic_name": { "type": "string", "title": "Классификация SIC", "description": "Стандартная отраслевая классификация (наименование)" }, "gics_name": { "type": "string", "title": "Классификация GICS", "description": "Глобальный стандарт отраслевой классификации (наименование)" }, "lei": { "type": "string", "title": "Идентификатор юридического лица", "description": "Идентификатор юридического лица" }, "issuer_name": { "type": "string", "title": "Эмитент", "description": "Эмитент" } }, "required": [ "isin", "security_type", "security_category", "last_trade_date", "price_open", "price_high", "price_low", "price_close", "volume_trade", "price_bid", "price_ask", "currency", "mic", "exchange_name", "primary_exchange_mic", "primary_exchange_name", "sic_name", "gics_name", "lei", "issuer_name" ] } ] } }
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()