Вы когда-нибудь хотели получить базу данных по акциям Nifty 50 от NSE, которую можно регулярно обновлять с минимальными усилиями? Для этого я буду использовать Python (точнее, Spyder IDE из дистрибутива Anaconda).
- Получите список акций Nifty 50.
Список из 50 акций можно получить по ссылке ниже.
Загрузите файл CSV. В столбце «Символ» отображается тикер соответствующей акции.
2. Финансы Yahoo как источник данных.
Доступно множество сторонних API, но я остановлюсь на Yahoo Finance, чтобы упростить его использование. Вы должны добавить «.NS» к названию тикера, чтобы получить данные NSE. Аналогичным образом добавьте «.BS» к названию тикера, чтобы получить данные BSE (Бомбейской фондовой биржи). Например, тикер Infosys, INFY, на Yahoo Finance называется INFY.NS. Yahoo Finance предоставляет бесплатные данные с минимальными временными рамками ежедневных данных. В этой статье мы сосредоточимся только на ежедневных данных.
3. Библиотеки Python.
Для этой настройки вам понадобится всего три библиотеки.
- панды
- pandas-datareader
- дата и время
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()