Блог им. Mixashow
Всем привет!
В этом топике напишу способ, как можно отобразить свои сделки на графике у брокера сбербанк.
Есть способы сделать это через Excel, есть, наверное через quik или какой либо другой сторонний сервис. Я буду делать через Python, так как по сравнению с экселем, питон будет давать нам актуальные данные, а эксель придется забивать руками(да я знаю, что можно и в него авто подгрузку вкрутить, но это на мой взгляд еще сложнее чем на python).
Коротко:
На входе нам нужен файл с тикерами(смотри на яндекс диске https://yadi.sk/d/hpfgtS1BEiVRiQ) и история сделок с сайта сбербанка.
На выходе мы получим вот такую вот карикатуру
Да, тут кривой текст, и нет столбиков объема, которые я так бы хотел, но кому и в таком формате пойдет, тот может читать дальше, а если тут есть добрые люди, то возможно, они смогут в комментариях кинуть исправленный фрагмент кода, чтобы была картинка по круче, особенно столбики объема добавить, как ни корячился, не допер, ибо опыт программирования у меня = школьный паскаль.
Собственно по факту у нас будет 2 программы. Первая создает базу с котировками для режима торгов, вторая программа по файлу со сделками и базе с котировками строит график.
Первая программа:
import requests<br />import apimoex<br />import pandas as pd<br />import pathlib<br />from datetime import datetime, date<br /><br />board = 'TQBR'<br /><br />#Открываем файл с тикерами<br />with open("C:/PYEX/TICK.txt", "r") as TICKs:<br /> TICKs = [line.rstrip() for line in TICKs]<br /><br />#Дату лучше не менять иначе ошибка в последнем цикле<br />DATE = date(2013, 1, 1)<br />i=0<br /><br />#Создание основного фрейма и заполнение первой колонки сквозной датой<br />maindate = pd.DataFrame()<br />datei = datetime.toordinal(DATE)<br />for datei in range(datetime.toordinal(DATE), datetime.toordinal(datetime.now())):<br /> maindate = maindate.append({'TRADEDATE':datei}, ignore_index=True)<br /><br />#Скачивание котировок и заполнение фрейма<br />process = 0<br />for TICK in TICKs:<br /> process = process + 1<br /> print((process / len(TICKs))*100,' %') #Прогресс выполнения<br /> data = apimoex.get_board_history(requests.Session(), TICK, board=board) #Получение данных с биржи<br /> if data == []: #Пропуск если по данному тикеру нет данных<br /> continue<br /> df = pd.DataFrame(data) #Перенос данных с биржи во фрейм<br /> maindate[TICK] = None #На всякий случай предварительно создаем столбик тикера и заполняем пустыми значениями<br /> j=0<br /> for i in range(0,datetime.toordinal(datetime.now())-datetime.toordinal(DATE)): #Пробег по датам основного фрейма<br /> if maindate['TRADEDATE'][i] == datetime.toordinal(datetime.strptime(df['TRADEDATE'][j], '%Y-%m-%d')): #Если дата основного фрейма и базы с биржи совпадают, то в столбик тикера записывается цена закрытия<br /> maindate.loc[maindate.TRADEDATE == maindate['TRADEDATE'][i], TICK] = df['CLOSE'][j] #Собственно запись цены закрытия в строчку совпадения столбик тикера<br /> j=j+1<br /> if j == (len(df.index)-1): #чтобы не выходить за размер данных с биржи в случае если инструмент до наших дней не дожил<br /> break<br /><br /><br />#запись базы в эксель<br />pathlib.Path("C:/PYEX/Database").mkdir(parents=True, exist_ok=True)<br />maindate.to_excel("C:/PYEX/Database/{}.xlsx".format(board), index=False)
Вторая программа:
import pandas as pd<br />import matplotlib.pyplot as plt<br />from matplotlib.ticker import (AutoMinorLocator)<br />from datetime import datetime<br /><br /><br />print("Введите ТИКЕР акции(например SBER)")<br />TICK = input()<br />print("Введите режим торгов для акций (TQBR), для etf (TQTF)")<br />board = input()<br />i=0<br /><br />#подготовка баз<br />trade=pd.DataFrame()<br />tradeBUY=pd.DataFrame()<br />tradeSELL=pd.DataFrame()<br />main = pd.read_excel("C:/PYEX/Database/{}.xlsx".format(board), sheet_name=0)<br />tr = pd.read_excel("C:/PYEX/Trade.xlsx", sheet_name=0)<br />for i in range(0, len(tr['Дата заключения'])):<br /> trade = trade.append({'INDEX':i}, ignore_index=True)<br /> tradeBUY = trade.append({'INDEX':i}, ignore_index=True)<br /> tradeSELL = trade.append({'INDEX': i}, ignore_index=True)<br /><br />#построение массива<br />j=0<br />for i in range(0,len(tr['Код финансового инструмента'])):<br /> if TICK == tr['Код финансового инструмента'][i]:<br /> if tr['Операция'][i] == 'Покупка':<br /> tradeBUY.loc[tradeBUY.INDEX == tradeBUY['INDEX'][j], TICK] = tr['Код финансового инструмента'][i]<br /> tradeBUY.loc[tradeBUY.INDEX == tradeBUY['INDEX'][j], 'TRADEDATE'] = int(datetime.toordinal(tr['Дата заключения'][i]))<br /> tradeBUY.loc[tradeBUY.INDEX == tradeBUY['INDEX'][j], 'PRICE'] = (tr['Цена'][i])<br /> tradeBUY.loc[tradeBUY.INDEX == tradeBUY['INDEX'][j], 'CV'] = tr['Количество'][i]<br /> tradeBUY.loc[tradeBUY.INDEX == tradeBUY['INDEX'][j], 'TYPE'] = tr['Операция'][i]<br /> tradeBUY.loc[tradeBUY.INDEX == tradeBUY['INDEX'][j], 'VOLUME'] = tr['Операция'][i] * tr['Количество'][i]<br /> j = j + 1<br /> else:<br /> tradeSELL.loc[tradeSELL.INDEX == tradeSELL['INDEX'][j], TICK] = tr['Код финансового инструмента'][i]<br /> tradeSELL.loc[tradeSELL.INDEX == tradeSELL['INDEX'][j], 'TRADEDATE'] = datetime.toordinal(tr['Дата заключения'][i])<br /> tradeSELL.loc[tradeSELL.INDEX == tradeSELL['INDEX'][j], 'PRICE'] = tr['Цена'][i]<br /> tradeSELL.loc[tradeSELL.INDEX == tradeSELL['INDEX'][j], 'CV'] = tr['Количество'][i]<br /> tradeSELL.loc[tradeSELL.INDEX == tradeSELL['INDEX'][j], 'TYPE'] = tr['Операция'][i]<br /> tradeSELL.loc[tradeSELL.INDEX == tradeSELL['INDEX'][j], 'VOLUME'] = tr['Операция'][i] * tr['Количество'][i]<br /> j=j+1<br /><br />#Дата из цифрового формата в нормальный<br />for i in range(0, len(main['TRADEDATE'])):<br /> main.loc[main.TRADEDATE == main['TRADEDATE'][i], 'TRADEDATE'] = datetime.fromordinal(main['TRADEDATE'][i])<br /><br />#построение графика<br />x1 = main['TRADEDATE']<br />y1 = main[TICK]<br />x2 = tradeBUY['TRADEDATE']<br />y2 = tradeBUY['PRICE']<br />x3 = tradeSELL['TRADEDATE']<br />y3 = tradeSELL['PRICE']<br />fig, ax = plt.subplots(figsize=(5, 1))<br />tradeBUY.apply(lambda x: ax.annotate(x['CV'],xy = (x['TRADEDATE'], x['PRICE']), color='green', fontsize=11,arrowprops=(dict(color='green'))), axis=1)<br />tradeSELL.apply(lambda x: ax.annotate(x['CV'], (x['TRADEDATE'], x['PRICE']), color='red', fontsize=11,arrowprops=(dict(color='red',headlength = - 10 ))), axis=1)<br />ax.plot(x1, y1)<br />ax.xaxis.set_minor_locator(AutoMinorLocator())<br />ax.yaxis.set_minor_locator(AutoMinorLocator())<br />ax.tick_params(which='major', length=10, width=2)<br />ax.tick_params(which='minor', length=5, width=1)<br />ax.set_xlabel('ДАТА')<br />ax.set_ylabel('ЦЕНА')<br />ax.set_title(TICK)<br />plt.grid()<br />plt.show()
Не забывайте проверять путифайлов!
Теперь нужно с помощью первой программы получить или обновить котировки по режиму торгов, а потом через вторую программу нам просто остается вписывать интересующий нас тикер и режим торгов в котором он торгуется и получаем график со сделками.
Если кто не понимает что происходит, смотрите видео, постарался объяснить:
______________________________________
П.С.
Не кидайте камнями за кривой код, я не программист, просто карантин — время попробовать что-то новое :)
______________________________________
Капиталист, Привет, я так понял сделки отображаются только за торговую сессию.
1) Сделки которые показывает квик.
2)То что показывает программа
в эксель