Вы когда-нибудь хотели получить базу данных по акциям Nifty 50 от NSE, которую можно регулярно обновлять с минимальными усилиями? Для этого я буду использовать Python (точнее, Spyder IDE из дистрибутива Anaconda).

  1. Получите список акций Nifty 50.

Список из 50 акций можно получить по ссылке ниже.



Загрузите файл CSV. В столбце «Символ» отображается тикер соответствующей акции.

2. Финансы Yahoo как источник данных.

Доступно множество сторонних API, но я остановлюсь на Yahoo Finance, чтобы упростить его использование. Вы должны добавить «.NS» к названию тикера, чтобы получить данные NSE. Аналогичным образом добавьте «.BS» к названию тикера, чтобы получить данные BSE (Бомбейской фондовой биржи). Например, тикер Infosys, INFY, на Yahoo Finance называется INFY.NS. Yahoo Finance предоставляет бесплатные данные с минимальными временными рамками ежедневных данных. В этой статье мы сосредоточимся только на ежедневных данных.

3. Библиотеки Python.

Для этой настройки вам понадобится всего три библиотеки.

  1. панды
  2. pandas-datareader
  3. дата и время

pandas и datetime доступны в дистрибутиве Anaconda. Вам необходимо установить pandas-datareader, используя следующую команду в интерактивной консоли.

!pip install pandas-datareader

4. Пошаговые инструкции по загрузке данных.

Импортируйте необходимые библиотеки

import pandas as pd

Прочтите загруженный файл CSV в фрейм данных

nifty_file=pd.read_csv('ind_niftynext50list.csv')

Ранее мы заметили, что для получения данных для INFY соответствующий тикер на Yahoo Finance - INFY.NS. Итак, мы создадим новый столбец под названием «Yahoo_Symbol».

nifty_file['Yahoo_Symbol']='Hello World'

Давайте добавим «.NS» к каждому тикеру в столбце «Символ» и назначим его столбцу «Yahoo_Symbol».

nifty_file.Yahoo_Symbol= nifty_file.Symbol + '.NS'

Выполненные до сих пор задачи не повторяются. Поэтому я сохраню этот сценарий, сохранив обновленный фрейм данных в файл CSV. Давайте сохраним этот скрипт Python как basic_wrangling.py

Полный код для basic_wrangling.py

import pandas as pd
nifty_file=pd.read_csv('ind_niftynext50list.csv')
nifty_file['Yahoo_Symbol']='Hello World'
nifty_file.Yahoo_Symbol= nifty_file.Symbol + '.NS'
nifty_file.to_csv('Nifty_yahoo_ticker.csv')

Откройте новый файл сценария Python и импортируйте необходимые библиотеки и файл CSV, содержащий тикеры Yahoo. Переменная nifty_list содержит названия тикеров Yahoo.

import pandas as pd
from pandas_datareader import data as pdr
from datetime import datetime
nifty_tickers=pd.read_csv('Nifty_yahoo_ticker.csv')
nifty_list=nifty_tickers['Yahoo_Symbol'].tolist()

Мы будем использовать пакет datetime, чтобы получить самые свежие доступные данные. Переменная ‘begin обозначает начальный период исторических данных. В следующем примере я выбрал 15 лет (365 * 15). Следующие две строки преобразуют переменные начала и конца в стандартный формат даты.

end = datetime.today()
begin=end-pd.DateOffset(365*15)
st=begin.strftime('%Y-%m-%d') 
ed=end.strftime('%Y-%m-%d')

Давайте сохраним данные в списке фреймов данных, который называется данными. Иногда возможен сбой при загрузке данных для определенных тикеров, поэтому давайте воспользуемся обработкой исключений. Я определил новую переменную под названием «niftyd_list», в которой хранится имя тикера из «nifty_list» только в случае успешной загрузки данных.

Несмотря на то, что обработка исключений сообщает нам о неудачной загрузке данных, полезно выполнить проверку курсора, сравнив nifty_list с niftyd_list.

data=[]
niftyd_list=[]
for i,k in enumerate(nifty_list):
    
    try:
        data.append(pdr.get_data_yahoo(k,st,ed))
        niftyd_list.append(k)
        
    except Exception:
        print('Not found',k)
        
        pass

После завершения загрузки сохраните список фреймов данных в файле Excel. Следующий фрагмент кода сохраняет данные в файле Excel, где каждый лист имеет соответствующее имя тикера.

writer=pd.ExcelWriter("Nifty50_Data.xlsx")
for i, A in enumerate(data):
    A.to_excel(writer,sheet_name="{0}".format(niftyd_list[i]))
writer.save()

Полный код пока что.

import pandas as pd
from pandas_datareader import data as pdr
from datetime import datetime
nifty_tickers=pd.read_csv('Nifty_yahoo_ticker.csv')
nifty_list=nifty_tickers['Yahoo_Symbol'].tolist()
end = datetime.today()
begin=end-pd.DateOffset(365*15)
st=begin.strftime('%Y-%m-%d') 
ed=end.strftime('%Y-%m-%d')
data=[]
niftyd_list=[]
for i,k in enumerate(nifty_list):
try:
data.append(pdr.get_data_yahoo(k,st,ed))
        niftyd_list.append(k)
        
    except Exception:
        print('Not found',k)
        
        pass
writer=pd.ExcelWriter("Nifty50_Data.xlsx")
for i, A in enumerate(data):
    A.to_excel(writer,sheet_name="{0}".format(niftyd_list[i]))
writer.save()

Сохраните приведенный выше сценарий с именем. Я выбрал «nifty_historical_data.py». Обратите внимание, что пока мы успешно загружаем исторические данные до последней доступной даты. Неэффективно запускать «nifty_historical_data.py» каждый день для ежедневного добавления данных. Мы напишем несколько строк кода в дополнение к изменению предыдущего кода, чтобы обновить нашу историческую базу данных в новом скрипте Python. Большая часть кода останется прежней, мы изменим начальный период и имя файла, в который записываются данные.

Я выбрал «начать» равным 5, что произвольно. В последний раз я запускал сценарий «nifty_historical_data.py» 4 дня назад, поэтому я загружу исторические данные за 5 дней с текущей даты и сохраню их в новый файл с именем «Nifty50_Datanew.xlsx». Вы можете выбрать большее число, чтобы убедиться, что между ними нет недостающих данных. Не беспокойтесь о наложении данных, мы удалим все повторяющиеся данные, если они есть. Сохраните этот сценарий как «nifty_daily.py».

import pandas as pd
from pandas_datareader import data as pdr
from datetime import datetime
nifty_tickers=pd.read_csv('Nifty_yahoo_ticker.csv')
nifty_list=nifty_tickers['Yahoo_Symbol'].tolist()
end = datetime.today()
begin=end-pd.DateOffset(5)
st=begin.strftime('%Y-%m-%d') 
ed=end.strftime('%Y-%m-%d')
data=[]
niftyd_list=[]
for i,k in enumerate(nifty_list):
try:
data.append(pdr.get_data_yahoo(k,st,ed))
        niftyd_list.append(k)
        
    except Exception:
        print('Not found',k)
        
        pass
writer=pd.ExcelWriter("Nifty50_Datanew.xlsx")
for i, A in enumerate(data):
    A.to_excel(writer,sheet_name="{0}".format(niftyd_list[i]))
writer.save()

Помните, мы сохранили исторические данные как «Nifty50_Data.xlsx» с помощью скрипта «nifty_historical_data.py»? Мы импортируем эти данные и новые данные для создания непрерывной базы данных. В следующих строках кода исторические данные за 15 лет и за 5 дней сохраняются в переменных «data_old» и «data_new» соответственно. Эти две переменные относятся к словарям типа.

data_old=pd.read_excel("Nifty50_Data.xlsx",sheet_name=None,index_col=0)
data_new=pd.read_excel("Nifty50_Datanew.xlsx",sheet_name=None,index_col=0)

Следующий фрагмент кода объединяет два словаря в один и сохраняет его в переменной «результат», которая является типом словаря. Биржевые тикеры являются «ключами», а списки фреймов данных «data_old» и «data_new» - «элементами» словаря «result».

for key in (data_old.keys() | data_new.keys()):
    if key in data_old: result.setdefault(key, []).append(data_old[key])
    if key in data_new: result.setdefault(key, []).append(data_new[key])

Нам нужно объединить «data_old» и «data_new» каждого тикера, чтобы получить единый непрерывный фрейм данных временного ряда. Следующая функция выполняет это вместе с преобразованием словаря «результата» в «список».

def convert_dict_to_list(result):
    name_list=[]
    df_list=[]
    for key in result.keys():
        name_list.append(key)
        
    for name in name_list:
        kk=result[name]
        kf=pd.concat(kk,axis=0)
        df3 = kf.loc[~kf.index.duplicated(keep='first')]
        df3.name=name
        df_list.append(df3)
        
    return df_list

Давайте воспользуемся функцией, определенной выше, для создания непрерывной базы данных.

df_list=[]
df_list=convert_dict_to_list(result)
writer=pd.ExcelWriter("Nifty50_Data.xlsx")
for i, A in enumerate(df_list):
    A.to_excel(writer,sheet_name="{0}".format(df_list[i].name))
writer.save()

Поздравляю! У вас есть код Python для создания базы данных непрерывных временных рядов для акций Nifty 50. Помните, что вам просто нужно изменить переменную begin в nifty_daily.py, чтобы обновить данные.

Для вашего удобства я перечисляю все 3 сценария, которые мы использовали до сих пор. Удачного кодирования!

data_wrangling.py

import pandas as pd
nifty_file=pd.read_csv('ind_niftynext50list.csv')
nifty_file['Yahoo_Symbol']='Hello World'
nifty_file.Yahoo_Symbol= nifty_file.Symbol + '.NS'
nifty_file.to_csv('Nifty_yahoo_ticker.csv')

nifty_historical_data.py

import pandas as pd
from pandas_datareader import data as pdr
from datetime import datetime
nifty_tickers=pd.read_csv('Nifty_yahoo_ticker.csv')
nifty_list=nifty_tickers['Yahoo_Symbol'].tolist()
end = datetime.today()
begin=end-pd.DateOffset(365*15)
st=begin.strftime('%Y-%m-%d') 
ed=end.strftime('%Y-%m-%d')
data=[]
niftyd_list=[]
for i,k in enumerate(nifty_list):
try:
data.append(pdr.get_data_yahoo(k,st,ed))
        niftyd_list.append(k)
        
    except Exception:
        print('Not found',k)
        
        pass
writer=pd.ExcelWriter("Nifty50_Data.xlsx")
for i, A in enumerate(data):
    A.to_excel(writer,sheet_name="{0}".format(niftyd_list[i]))
writer.save()

nifty_daily.py

import pandas as pd
from pandas_datareader import data as pdr
from datetime import datetime
nifty_tickers=pd.read_csv('Nifty_yahoo_ticker.csv')
nifty_list=nifty_tickers['Yahoo_Symbol'].tolist()
end = datetime.today()
begin=end-pd.DateOffset(5) #Change this number
st=begin.strftime('%Y-%m-%d') 
ed=end.strftime('%Y-%m-%d')
data=[]
niftyd_list=[]
for i,k in enumerate(nifty_list):
    try:
        data.append(pdr.get_data_yahoo(k,st,ed))
        niftyd_list.append(k)
        
    except Exception:
        print('Not found',k)
        
        pass
writer=pd.ExcelWriter("Nifty50_Datanew.xlsx")
for i, A in enumerate(data):
    A.to_excel(writer,sheet_name="{0}".format(niftyd_list[i]))
writer.save()
data_old=pd.read_excel("Nifty50_Data.xlsx",sheet_name=None,index_col=0)
data_new=pd.read_excel("Nifty50_Datanew.xlsx",sheet_name=None,index_col=0)
for key in (data_old.keys() | data_new.keys()):
    if key in data_old: result.setdefault(key, []).append(data_old[key])
    if key in data_new: result.setdefault(key, []).append(data_new[key])
def convert_dict_to_list(result):
    name_list=[]
    df_list=[]
    for key in result.keys():
        name_list.append(key)
        
    for name in name_list:
        kk=result[name]
        kf=pd.concat(kk,axis=0)
        df3 = kf.loc[~kf.index.duplicated(keep='first')]
        df3.name=name
        df_list.append(df3)
        
    return df_list
df_list=[]
df_list=convert_dict_to_list(result)
writer=pd.ExcelWriter("Nifty50_Data.xlsx")
for i, A in enumerate(df_list):
    A.to_excel(writer,sheet_name="{0}".format(df_list[i].name))
writer.save()