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

Спасибо, что являетесь частью нашего сообщества! Перед тем, как ты уйдешь: