TL;DR: Мы сделаем хороший график волатильности и доходности и встроим его в наше приложение!
Смотри последнюю историю:
Мы хотим создать несколько представлений для анализа риска и доходности различных акций по секторам и периодам. Мы хотим создать это представление ниже для нашего приложения.
Создать новый сюжетный вид
В нашем plotly_layouts.py мы определяем новую функцию, которую называем create_plotly_xy(). Для функции нам нужно импортировать plotly.express.
import plotly.express as px # we pass our data from the database and the period length def create_plotly_xy(data, period = "1y"): fig = px.scatter(data, x="vola_"+ period, y=period, color="Sector", hover_data=["Ticker", "Name", "Sector"]) fig = fig_layout(fig, ytitle = "Return "+ period, ytickfromat = ".0%", x title = "Volatility "+ period, xtickfromat = ".0%", ticker = period , legendtitle = "Sector", type_of_plot = "Return and Risk" ) fig.update_yaxes(showgrid=True, zeroline=True) fig.update_xaxes(showgrid=True, zeroline=False) ## just for testing fig.show()
Измените наш fig_layout(). Нам нужно добавить форматирование для нашей процентной шкалы по оси X.
def fig_layout(fig, ytitle, ytickfromat, xtitle, xtickfromat, ticker, legendtitle, type_of_plot, yaxis_tickprefix=None): fig.update_layout( yaxis={ "title": ytitle, "tickformat": ytickfromat, "showticklabels": True, }, ## this is new xaxis={ "title": xtitle, "tickformat": xtickfromat, "showticklabels" :True, }, ################################################### yaxis_tickprefix = yaxis_tickprefix, paper_bgcolor="#FFFFFF", # rgba(0,0,0,0)', plot_bgcolor="#FFFFFF", # 'rgba(0,0,0,0)', # autosize=True, legend=dict( title=legendtitle, yanchor="top", y=0.99, xanchor="left", x=0.01 ), title={ 'text': '{} - {} <br><sup>tenxassets.com</sup>'.format(type_of_plot,ticker), 'y': 1.1, 'x': 0.5, 'xanchor': 'center', 'yanchor': 'top'}, titlefont=dict( size=12, color="black"), template="simple_white", showlegend=True, font=dict( # family="Courier New, monospace", size=12, color="black" ), ) return fig
Подготовьте данные
В нашем plotly_layouts.py мы создаем несколько тестовых строк в разделе if __name__ == ‘__main__’. Таким образом, мы можем протестировать часть нашего кода, прежде чем поместить его в наш основной файл run.py.
if __name__ == '__main__': import sqlite3 as sq import pandas as pd ## Open the performance and volatility calculations table_name = "performance_and_vola" # table and file name conn = sq.connect('{}.sqlite'.format("database")) df = pd.read_sql('select * from {}'.format(table_name), conn) ## Open our stock infos table df_infos = pd.read_sql('select * from {}'.format("stock_infos"), conn) ## We merge them to get our infos later in the diagram df = pd.merge(df, df_infos[["Ticker", "Name", "Sector"]], on="Ticker", how="right") create_plotly_xy(df) conn.close()
Если вы запустите это, вы должны увидеть график выше в своем браузере.
Взаимодействие с сюжетом
Приятно то, что вы взаимодействуете с сюжетом. Например, вы можете включать и выключать элементы легенды.
Если вы отключите что-то еще, кроме энергетического сектора, вы увидите, что этот сектор показал хорошие результаты в прошлом году:
Если вы отключите что-либо еще в потребительском дискреционном секторе, вы увидите противоположную картину. Итак, из-за высокой инфляции (например, высоких цен на энергоносители) потребитель решил не покупать товары, которые на самом деле ему не нужны:
Википедия
Что такое Потребительское усмотрение? Дискреционные потребительские товары – это термин для классификации товаров и услуг, которые потребители считают второстепенными, но желательными, если их доступный доход достаточен для их покупки.
Вот почему хорошо сбалансированный портфель актуален.
Интегрировать в приложение
Мы добавляем вызов таблицы данных в начале нашего run.py.
## Database for stocks conn = sq.connect('helpers/{}.sqlite'.format("database"),check_same_thread=False) df = pd.read_sql('select * from {}'.format("stock_database"), conn) stock_infos = pd.read_sql("select * from {}".format("stock_infos"), conn) ######### new ################ return_and_volatility = pd.read_sql("select * from {}".format("performance_and_vola"), conn) ###################################
Мы добавляем к нашему домашнему маршруту подготовку данных для графика и вызов графика.
@app.route("/", methods=['GET', 'POST']) def index(): if current_user.is_authenticated: greetings = f'Hello {current_user.email} !' df = pd.merge(return_and_volatility, stock_infos[["Ticker", "Name", "Sector"]], on="Ticker", how="right") plot = plt.create_plotly_xy(df, "3y") plotly_plot = json.dumps(plot, cls=plotly.utils.PlotlyJSONEncoder) return render_template("home.html", greetings=greetings, plotly_plot=plotly_plot) else: greetings = 'Hello, please login' return render_template("home.html", greetings=greetings)
Обновить home.html
<div> <div id="plotly-stock-candle"></div> <script> //Parse your Json variable here var graphs = {{ plotly_plot | safe }}; Plotly.plot('plotly-stock-candle', graphs, {}); </script> </div>
Мы получаем этот результат:
Мы должны скрыть легенду. В противном случае это выглядит некрасиво. Поэтому мы добавляем кнопку, чтобы скрыть легенду в наш макет графика (fig_layout).
fig.update_layout( updatemenus=[ dict( type="buttons", direction="left", buttons=list([ dict( args=['showlegend', False], args2=['showlegend', True], label="≡", method="relayout" ) ]), pad={"r": 2, "t": 2}, showactive=True, x=-0.1, xanchor="left", y=1.2, yanchor="top" ), ])
Это лучше :)
Включить раскрывающийся селектор
Добавляем в наш home.html
<form method="get" action="/"> <label for="period">Choose a period to compare:</label> <select id="period" name="period"> {%for i in period_tickers%} <option value="{{i}}">{{i}}</option> {% endfor %} <input type="submit" value="Show Data"> </form>
чтобы получить наши значения из нашей формы, мы просто добавляем эти строки:
@app.route("/", methods=['GET', 'POST']) def index(): if current_user.is_authenticated: period = request.args.get("period") if period is None: period = "3y" period_tickers = ["1d","7d", "1m","3m","6m","1y","2y","3y","5y"]
Это все на данный момент! Мы будем продолжать развивать это приложение дальше.
Просто измените этот пример под свои нужды и загрузите его на pythonanywhere.com*. Вот репо: https://github.com/AntonioBlago/Webpage_Tutorial_4. Проверьте ветку part3 для этой версии.
Спасибо, что прочитали мою историю. Надеюсь, вам понравилось. Пожалуйста, не стесняйтесь аплодировать, делиться и комментировать это. Подписывайтесь на меня, чтобы получать больше информации о криптовалютах, акциях, анализе данных и веб-разработке. Я размещаю свои приложения на pythonanywhere.com* (5 долларов США в месяц).
- Читайте мою другую статью о создании финансового дашборда в flask, смотрите ниже!
- Посетите мою веб-страницу и свяжитесь со мной в Linkedin: antonioblago.com
- Создайте бесплатную учетную запись в моем инструменте отслеживания акций и криптовалют: www.tenxassets.com
- Если вам нравится разрабатывать веб-приложения, я рекомендую вам pythonanywhere.com* в качестве хостинга.
Отказ от ответственности:
- *это партнерские ссылки
Сообщение от InsiderFinance
Спасибо, что являетесь частью нашего сообщества! Перед тем, как ты уйдешь:
- 👏 Хлопайте за историю и подписывайтесь на автора 👉
- 📰 Смотрите больше контента в InsiderFinance Wire
- 📚 Пройдите наш БЕСПЛАТНЫЙ мастер-класс
- 📈 Откройте для себя Мощные торговые инструменты