Блог им. Albus
На языке программирования Питон качаем с finam.ru и строим график валютной пары доллар-рубль. Текст написан так, чтобы смог повторить даже новичок. Продвинутые питонисты переходите сразу к коду. Вот он.
Цель поста: построить вот такой график:
1. Качаем Питон с сайта python.org. Это позволит вам запускать скрипты на этом языке программирования.
2. Открываем командную строку cmd.exe (чёрное окошко). С его помощью подключим библиотеку matplotlib, которая рисует графики. В командной строке пишем pip install matplotlib
Ждём, когда библиотека установится. Когда это произойдёт, в конце будет строчка Successfully installed matplotlib
После этого открываем среду разработки. Она установилась автоматически, когда вы поставили себе Питон:
Это среда разработки для самых маленьких, но для запуска скрипта этого хватит. По сути это блокнот, обычный текстовый редактор.
Качаем файл скрипта: https://yadi.sk/d/mjmwnkqjz_bj7w
Открываем его питоновским блокнотом:
Запускаем, нажав на F5 или через меню:
Получаем желаемый график!
# -*- coding: utf-8 -*- #скрипт умеет работать только с доллар-рублём. Как смотреть акции, смотрите в моей статье на Смарт Лабе "Качаем котировки с Финама" https://smart-lab.ru/blog/514941.php import matplotlib #подключаем библиотеку matplotlib целиком import matplotlib.pyplot as plt #подключаем из большой библиотеки модуль pyplot, который является аналогом МАТЛАБА. МАТЛАБ - это язык программирования и набор программ для математиков. Этот модуль питона пытается её заменить. Присваиваем ему короткое имя plt. from datetime import datetime #подключаем функцию для преобразования дат в нужный формат. from urllib.parse import urlencode #urlencode требуется для формирования строки, которая улетит на Финам в качестве запроса. from urllib.request import urlopen #с помощью urlopen будем отсылать запрос на Финам и получать текстовый ответ. print("Подключили библиотеки") symbol='USD000UTSTOM' #Тикер желаемого инструмента. В данном случае это доллар-рубль на валютном рынке Московской биржи. period=8 #Период графика. 8 - это дневки. Один кирпичик данных описывает картину 1 дня: открытие, закрытие, максимум, минимум. Другие варианты: {'tick': 1, 'min': 2, '5min': 3, '10min': 4, '15min': 5, '30min': 6, 'hour': 7, 'daily': 8, 'week': 9, 'month': 10} start_date_str = "01.01.2010" #с какой даты качаем данные end_date_str = datetime.today().strftime('%d.%m.%Y') #по какую дату качаем данные. Здесь указано: "по сегодня" #выполняем преобразование дат, чтобы их понял Финам. start_date = datetime.strptime(start_date_str, "%d.%m.%Y").date() start_date_rev=datetime.strptime(start_date_str, '%d.%m.%Y').strftime('%Y%m%d') end_date = datetime.strptime(end_date_str, "%d.%m.%Y").date() end_date_rev=datetime.strptime(end_date_str, '%d.%m.%Y').strftime('%Y%m%d') print("Строим график с "+ start_date_rev+" по "+end_date_rev) #Все параметры упаковываем в единую структуру. Эти данные улетят от нас на Финам. #Как сделать тонкую настройку этого запроса, смотрите в моей статье на Смарт Лабе "Качаем котировки с Финама" https://smart-lab.ru/blog/514941.php params = urlencode([('market', 0), ('em', 182400), ('code', symbol), ('apply',0), ('df', start_date.day), ('mf', start_date.month - 1), ('yf', start_date.year), ('from', start_date_str), ('dt', end_date.day), ('mt', end_date.month - 1), ('yt', end_date.year), ('to', end_date_str), ('p', period), ('f', symbol+"_" + start_date_rev + "_" + end_date_rev), ('e', ".csv"), ('cn', symbol), ('dtf', 1), ('tmf', 1), ('MSOR', 0), ('mstime', "on"), ('mstimever', 1), ('sep', 1), ('sep2', 1), ('datf', 1), ('at', 0)]) #итоговый урл (строка), который улетит на сервер Финама: url = "http://export.finam.ru/" + symbol+"_" + start_date_rev + "_" + end_date_rev + ".csv?" + params print("Этот урл сформировали мы. Он улетает на Финам!") print(url) txt=urlopen(url, timeout=10).readlines() #На сайт Финама улетел урл. Оттуда прилетел ответ и записался в переменную txt x=[] #Здесь будут даты на горизонтальной оси. y=[] #Здесь будут цены на вертикальной оси. for line in txt: #бегаем в цикле по прилетевшим значениям. Разносим их по x и y tmp=str(line).split(",") #читаем строчку за строчкой и выбираем из неё данные (значения разделены запятой) date=tmp[2] #дата - это третье поле в строке x.append(matplotlib.dates.date2num(datetime.strptime(date, '%Y%m%d'))) #запишем дату в понятном для библиотеки matplotlib виде (она станет числом) y.append((float(tmp[5])+float(tmp[6])+float(tmp[7]))/3) #посчитаем типическую цену за день и добавим в chart_y. Типическая цена=(цена закрытия+максимум+минимум)/3. print("Оси x и y заполнены! На них "+str(len(x))+" значений!") print("Приступаем к построению графика!") fig, ax = plt.subplots() #начинаем работать с библиотекой matplotlib. Создаём фигуру. ymax = max(y) #находим максимальное значение, до которого доходил доллар. xmax = x[y.index(ymax)] #находим дату максимального значения. ymax=round(ymax,2)#округляем максимум до копеек. print("Максимум по доллару был "+str(ymax)) ax.annotate('MAX:'+str(ymax), #на график поместим аннотацию: максимальное значение доллара. xy=(xmax, ymax*(1.005)), #место куда поместим аннотацию: визуально чуть-чуть повыше максимума. horizontalalignment='center', #выровняем метку максимума по центру. ) ax.plot(x, y, color="g") #наносим график доллара: оси x и y. Цвет зелёный. plt.title("USD/RUB", fontsize=20) ax.xaxis.set_major_locator(matplotlib.dates.YearLocator(1)) #делаем так, чтобы на оси дат были не числа типа 10.12.2018, а только годы ax.xaxis.set_major_formatter(matplotlib.dates.DateFormatter('%Y')) #формат оси x - годы. plt.grid() #наносим сетку. plt.show() #показываем график!
Мой блог на Яндексе.
Мой канал на Ютубе.
https://yadi.sk/d/mjmwnkqjz_bj7w
курс доллара был как сегодня
и с каких пор купившие доллары по той же цене что и сегодня
не выиграли ни копейки
ЗЫ. для публикации кода лучше использовать гитхаб
Меня интересует именно вопрос — зачем? Математическая идея с кодом должна давать какую-то пользу. Финансовую. Иначе это пост для хабра.
colab.research.google.com