Питон: рисуем график доллара USD/RUR
На языке программирования Питон качаем с finam.ru и строим график валютной пары доллар-рубль. Текст написан так, чтобы смог повторить даже новичок. Продвинутые питонисты переходите сразу к коду. Вот он.
Цель поста: построить вот такой график:
1. Качаем Питон с сайта python.org. Это позволит вам запускать скрипты на этом языке программирования.
2. Открываем командную строку cmd.exe (чёрное окошко). С его помощью подключим библиотеку matplotlib, которая рисует графики. В командной строке пишем pip install matplotlib
Ждём, когда библиотека установится. Когда это произойдёт, в конце будет строчка Successfully installed matplotlib
После этого открываем среду разработки. Она установилась автоматически, когда вы поставили себе Питон:
Это среда разработки для самых маленьких, но для запуска скрипта этого хватит. По сути это блокнот, обычный текстовый редактор.
Открываем его питоновским блокнотом:
Запускаем, нажав на 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 дня: открытие, закрытие, максимум, минимум. Другие варианты: 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() #показываем график!
Автоматизация отслеживания курса валют на Python
Всем привет. Напишем небольшую программу на Python для отслеживания курса валюты.
Программа будет работать следующим образом: данные будут скопированы из поисковой выдачи Google, после чего будет произведено сравнение изменения курса с момента запуска программы. В случае значительного изменения курса, программа будет автоматически отправлять уведомление в Telegram.
Первое, что нужно сделать — это решить, откуда брать курсы валют. Парсить данные будем с поисковой выдачи Google, чтобы не платить за API. Чтобы начать создавать программу, необходимо установить Python с официального сайта и загрузить IDE. Можно использовать PyCharm или любой другой редактор кода. Второе, нужно будет написать код для парсинга данных из поисковой выдачи Google, а затем сравнивать текущий курс с предыдущим.
Затем нам потребуются несколько библиотек. Первой из них является requests, которая позволит нам получать данные с сайтов. Второй библиотекой является BeautifulSoup, которая поможет нам парсить HTML-разметку и вытаскивать из нее нужные данные.
pip install requests pip install beautifulsoup4
import requests from bs4 import BeautifulSoup import time # Функция для получения курса валюты def get_currency_rate(): # Адрес сайта, с которого мы будем получать данные url = "https://www.google.com/search?q=курс+доллара+к+рублю" # Получаем содержимое страницы response = requests.get(url) # Создаем объект BeautifulSoup для парсинга HTML-разметки soup = BeautifulSoup(response.content, "html.parser") # Получаем элемент с курсом валюты result = soup.find("div", class_="BNeawe iBp4i AP7Wnd").get_text() # Возвращаем курс валюты как число return float(result.replace(",", ".")) # Основной код программы if __name__ == "__main__": # Получаем текущий курс валюты current_rate = get_currency_rate() print(f"Текущий курс валюты: ") # Запускаем бесконечный цикл while True: # Ждем 5 секунд time.sleep(5) # Получаем новый курс валюты new_rate = get_currency_rate() # Если произошло сильное изменение курса валюты, отправляем уведомление if abs(new_rate - current_rate) > 2: print(f"Сильное изменение курса валюты! Старое значение: , новое значение: ") current_rate = new_rate
Здесь мы получаем текущий курс валюты с помощью библиотек requests и BeautifulSoup и запускаем бесконечный цикл, который каждые 5 секунд получает новый курс валюты и проверяет, произошло ли сильное изменение курса.
Для отправки уведомлений через Telegram Bot API необходимо создать бота в Telegram и получить его токен. Для этого подойдёт библиотека python-telegram-bot, чтобы настроить отправку сообщений:
import telegram # Создаем объект бота и указываем токен bot = telegram.Bot(token='YOUR_TELEGRAM_BOT_TOKEN') # Получаем идентификатор чата, в который будем отправлять уведомление chat_id = 'YOUR_TELEGRAM_CHAT_ID' # Формируем текст сообщения с информацией о курсе валют message_text = 'Курс доллара превысил 75 рублей' # Отправляем сообщение bot.send_message(chat_id=chat_id, text=message_text)
Для добавления возможности отслеживания нескольких валют одновременно и установки пороговых значений изменения курса для отправки уведомлений напишем следующий код:
import time import requests from bs4 import BeautifulSoup import smtplib import matplotlib.pyplot as plt # Добавляем информацию о валютах и пороговых значениях currencies = , 'EUR': , 'GBP': > # Функция отправки уведомлений через Telegram Bot API def send_notification(currency, rate): token = 'your_token' chat_id = 'your_chat_id' message = f' rate is ' url = f'https://api.telegram.org/bot/sendMessage?chat_id=&text=' requests.get(url) # Функция создания графиков def create_graph(currency, rates): plt.plot(rates) plt.ylabel(f' rate') plt.show() while True: # Парсим данные с сайта Центробанка url = 'https://www.cbr.ru/' response = requests.get(url) soup = BeautifulSoup(response.content, 'html.parser') # Получаем информацию о каждой валюте и ее курсе for currency, data in currencies.items(): currency_rate = soup.find('div', '>) rate = float(currency_rate.find('div', ).text.replace(',', '.')) # Если курс изменился больше, чем пороговое значение, отправляем уведомление if abs(rate - data['rate']) > data['threshold']: send_notification(currency, rate) # Обновляем информацию о курсе валюты data['rate'] = rate # Добавляем курсы в список для создания графиков data.setdefault('rates_history', []).append(rate) # Создаем график, если есть достаточно данных if len(data['rates_history']) >= 10: create_graph(currency, data['rates_history']) # Ждем 1 минуту, чтобы не перегружать сервер Центробанка time.sleep(60)
В этом примере мы создаем словарь currencies с информацией о каждой валюте и ее пороговых значениях изменения курса + добавляем историю курсов каждой валюты в список rates_history . В конце мы создаем функцию create_graph() для создания графика курсов каждой валюты в течение нужного нам периода времени.
- Большая статья-руководство со списком полезных ссылок для начинающих
- Курс «Поколение Python» для начинающих
- Курс «Поколение Python» для продвинутых
- Видеоуроки от Тимофея Хирьянова
- Перевод популярной книги “A Byte of Python”
- Хороший видеоурок по requests
- Веб-скраппинг с помощью BeautifulSoup — пошаговое руководство
- Пост «Python и API: превосходное комбо для автоматизации работы с публичными данными»
- Статья «Визуализация данных с matplotlib»
- Пост на Хабре «Простой Telegram-бот на Python за 30 минут»
Как создать свечной график с помощью Matplotlib в Python
Свечной график — это тип финансового графика, который отображает движение цен ценных бумаг во времени.
В следующем примере показано, как создать свечную диаграмму с помощью библиотеки визуализации Matplotlib в Python.
Пример: создание свечного графика в Python
Предположим, у нас есть следующий кадр данных pandas, который показывает цены открытия, закрытия, максимума и минимума определенной акции в течение 8-дневного периода:
import pandas as pd #create DataFrame prices = pd.DataFrame(, index=pd.date_range (" 2021-01-01", periods=8, freq=" d ")) #display DataFrame print(prices) open close high low 2021-01-01 25 24 28 22 2021-01-02 22 20 27 16 2021-01-03 21 17 29 14 2021-01-04 19 23 25 17 2021-01-05 23 22 24 19 2021-01-06 21 25 26 18 2021-01-07 25 29 31 22 2021-01-08 29 31 37 26
Мы можем использовать следующий код для создания свечного графика, чтобы визуализировать движение цены этой акции в течение этого 8-дневного периода:
import matplotlib.pyplot as plt #create figure plt.figure() #define width of candlestick elements width = .4 width2 = .05 #define up and down prices up = prices[prices. close >=prices. open ] down = prices[prices. close
Каждая свеча представляет движение цены ценной бумаги в определенный день. Цвет свечи говорит нам, закрылась ли цена выше (зеленый) или ниже (красный), чем в предыдущий день.
Не стесняйтесь изменять ширину свечей и цвета, используемые для отображения графика, как вам хочется.
Например, мы могли бы сделать свечи еще тоньше и использовать разные цвета для обозначения дней «вверх» и «вниз»:
import matplotlib.pyplot as plt #create figure plt.figure() #define width of candlestick elements width = .2 width2 = .02 #define up and down prices up = prices[prices. close >=prices. open ] down = prices[prices. close
Дополнительные ресурсы
В следующих руководствах объясняется, как создавать другие распространенные диаграммы в Python: