Получение списка акций, входящих в индекс S&P 500

Рассмотрим два способа, которые позволяют программно получить список тикеров акций, входящих в индекс S&P 500.

В первом случае будем использовать специально для этого предназначенный пакет finsymbols, а во втором случае сделаем всё сами, выполнив разбор страницы Википедии.

Пакет finsymbols

Пакет finsymbols позволяет в программе, написанной на языке Python, получить список акций, которые торгуются на биржах NASDAQ, AMEX и NYSE. Для этого он определяет соответствующие функции get_amex_symbols(), get_nyse_symbols() и get_nasdaq_symbols(). Кроме того, имеется функция get_sp500_symbols(), возвращающая список акций, входящих в индекс S&P 500.

Для установки пакета в Linux надо выполнить в терминале команду:

sudo pip install finsymbols

В консольном окне Microsoft Windows используется та же команда, только без sudo:

pip install finsymbols

Для проверки работы пакета можно выполнить простую программу на языке Python:

import finsymbols
import pprint   # для печати сложных структур данных
sp500 = finsymbols.get_sp500_symbols()
pprint.pprint(sp500[:2])  # вывели 2 первых элемента

Здесь мы для примера вывели информацию о первых двух акциях, входящих в индекс S&P500:

[{'company': '3M Co.',
  'headquaters': 'St Paul, Minnesota',
  'industry': 'Industrial Conglomerates',
  'sector': 'Industrials',
  'symbol': 'MMM'},
 {'company': 'Abbott Laboratories',
  'headquaters': 'North Chicago, Illinois',
  'industry': 'Health Care Equipment & Services',
  'sector': 'Health Care',
  'symbol': 'ABT'}]

Разбор страницы Википедии

В англоязычной Википедии имеется страница List of S&P 500 companies, на которой перечислены все компании, акции которых на текущий момент учитываются при расчёте индекса S&P500.

Чтобы прочитать Web-страницу, будем использовать стандартную библиотеку urllib.

Приведём здесь пример для Python 3:

import urllib.request
url = "http://en.wikipedia.org/wiki/List_of_S%26P_500_companies"
response = urllib.request.urlopen(url)
html = response.read()

Для разбора (парсинга) документов в формате HTML и XML в языке Python 2 или 3 имеется пакет Beautiful Soup:

from bs4 import BeautifulSoup
soup = BeautifulSoup(html)

# Найдём таблицу:
table = soup.find('table', {'class': 'wikitable sortable'})

# Словарь для тикеров, сгруппированных по секторам экономики:
tickers = dict()

for r in table.findAll('tr'): # Цикл по строкам таблицы.
   col = r.findAll('td')      # Колонки таблицы.
   if len(col)>0:

      # В 4-й колонке таблицы - название сектора экономики:
      sector = str(col[3].string.strip()).lower().replace(' ', '_')

      # В 1-й колонке таблицы - тикер акции:
      ticker = str(col[0].string.strip())

      # Если пока нет такого сектора, добавляем к словарю новый список для тикеров:
      if sector not in tickers:
         tickers[sector] = list()

      # Добавляем тикер акции в список соответствующего сектора:
      tickers[sector].append(ticker)

Посмотрим, что получилось:

import pprint
pp = pprint.PrettyPrinter(indent=2)
pp.pprint(tickers)

Результат (для наглядности мы заменили длинные списки многоточием):

{ 'consumer_discretionary': [ 'AAP',
                              'AMZN',
                              'AN',
                              'AZO',
                               ...
'consumer_staples': [ 'MO',
                      'ADM',
                      'BF-B',
                       ...
 ...
'telecommunications_services': ['T', 'CTL', 'FTR', 'LVLT', 'VZ'],
'utilities': [ 'AES',
               'GAS',
               'AEE',
                ...
               'WEC',
               'XEL']}

Теперь полученный список тикеров можно использовать, например, для загрузки котировок.


Тетрадка IPython Notebook для этого примера.


Теги: Python


 




Комментарии

Комментариев пока нет.

* Обязательные поля
(Не публикуется)
 
Жирный Курсив Подчеркнутый Перечеркнутый Степень Индекс Код PHP Код Кавычки Вставить линию Вставить маркированный список Вставить нумерованный список Вставить ссылку Вставить e-mail Вставить изображение Вставить видео
 
Улыбка Печаль Удивление Смех Злость Язык Возмущение Ухмылка Подмигнуть Испуг Круто Скука Смущение Несерьёзно Шокирован
 
1000
Captcha
Refresh
 
Введите код:
 
Запомнить информацию введенную в поля формы.