Как нарисовать красивый график оценки индекса с помощью Python?

анализ данных
Как нарисовать красивый график оценки индекса с помощью Python?

Публичный аккаунт WeChat: «Python Reading Finance»
Если у вас есть какие-либо вопросы или предложения, пожалуйста, оставьте сообщение в публичном аккаунте

Для друзей, которые используют индекс инвестиций в основной капитал для управления своими финансами, наиболее важным показателем, на который следует обратить внимание, является оценка каждого индекса.Покупайте, когда индекс недооценен, и продавайте, когда он переоценен.Как составить график оценки для отслеживания оценки индекса Что насчет ситуации? В этой статье рассказывается, как использовать от 0 до 1MatplotlibНарисуйте красивый график оценки индекса.

Подготовить данные

Прежде всего, подготовьте необходимые данные.Вообще говоря, историческая оценка после раунда бычьих и медвежьих циклов более значима.Поэтому вот рыночные данные индекса Шанхайской фондовой биржи за 2013 год в качестве примера, чтобы продемонстрировать В то же время, использование коэффициента скользящей цены к прибыли является показателем оценки. Источник данных — tushare.

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import tushare as ts
%matplotlib inline
#设置显示中文
plt.rcParams['font.sans-serif'] = 'FangSong'

pro = ts.pro_api()

index_df = pro.index_dailybasic(ts_code = "000001.SH",start_date = "20130101",
                                end_date = "20200311",fields="trade_date,pe_ttm")
index_df.sort_values(by="trade_date",inplace=True)
x = pd.to_datetime(index_df["trade_date"]).values
y = index_df["pe_ttm"].values

По полученным данным можно построить график тренда соотношения цена-прибыль Shanghai Composite Index:

fig,ax = plt.subplots(figsize=(12,8))
ax.plot(x,y)

中间-1.png

Далее оценку необходимо разделить на переоцененную область, нормальную область и недооцененную область по определенным правилам.

Разделение интервала оценки

Что касается более распространенных методов деления, в этой статье площадь, превышающая 80-процентный квантиль, считается интервалом переоценки, площадь ниже 20-процентного квантиля — интервалом недооценки, а площадь между ними — нормальным интервалом. Следующий код вычисляет эти ключевые точки данных

max = np.max(y)
pe_80 = np.percentile(y,80)
pe_20 = np.percentile(y,20)
min = np.min(y)
now = y[-1]   #为了后续标出当日估值

Рисование

В соответствии с разделенными точками данных можно построить график, который в основном используется здесь.fill_betweenФункция рисует цветовую сегментацию каждой области, заполняя завышенную область красными блоками, нормальный интервал - желтыми блоками, а заниженную область - зелеными блоками. При этом для отображения эффекта верхняя и нижняя границы графика устанавливаются на максимальное значение +1 и минимальное значение -1 соответственно.

fig,ax = plt.subplots(figsize=(12,8))
ax.plot(x,y,linewidth=3)
ax.fill_between(x,min-1,pe_20,facecolor = "#00ff80",alpha=0.2)
ax.fill_between(x,pe_20,pe_80,facecolor = "#ffff4d",alpha=0.2)
ax.fill_between(x,pe_80,max+1,facecolor = "#ff69b4",alpha=0.2)

中间-2.png

Вышла общая схема всего графика, для лучшего отображения эффекта график нужно еще доработать. Например:

  • Удалить масштаб оси и увеличить соответствующий шрифт -->ax.tick_params
  • Удалите пробел между графиком и осями -->ax.margins()
  • Отметьте текущее соотношение цена/прибыль на графике -->ax.text()
  • Удалить рамку с графика -->plt.box()
  • Добавьте заголовок к значку -->plt.title

Таким образом, на основе предыдущего кода, добавив следующий код настройки, можно получить итоговую карту готового продукта.

fig,ax = plt.subplots(figsize=(12,8))
ax.plot(x,y,linewidth=3)
ax.fill_between(x,min-1,pe_20,facecolor = "#00ff80",alpha=0.2)
ax.fill_between(x,pe_20,pe_80,facecolor = "#ffff4d",alpha=0.2)
ax.fill_between(x,pe_80,max+1,facecolor = "#ff69b4",alpha=0.2)
ax.tick_params(axis='both', which='both',length=0)
ax.tick_params(axis='both', which='major', labelsize=16)
ax.margins(0.01,0)
ax.text(0.75,0.9,"市盈率 = {}".format(now),transform=ax.transAxes,fontdict={'size':18})
plt.xticks(rotation=45)
plt.box(False)
plt.title("上证指数估值图",fontdict={'size':24})

上证指数.png

инкапсуляция функций

Кроме того, чтобы повторно использовать приведенный выше код, вы можете инкапсулировать все коды чертежа в функции, а затем вам нужно будет ввести только соответствующий код индекса (который может быть индексом на широкой основе, индексом отрасли) и диапазоном времени, вы можно быстро сгенерировать график Оценочная диаграмма.

from datetime import *
def pe_plot(ts_code = "",name="",period=5):
    #准备数据
    now = datetime.now()
    end_date = str(now.date()).replace("-","")
    start_date = str(now.year-period)+end_date[4:]
    index_df = pro.index_dailybasic(ts_code = ts_code,start_date = start_date,
                                    end_date = end_date,fields="trade_date,pe_ttm")
    index_df.sort_values(by="trade_date",inplace=True)
    x = pd.to_datetime(index_df["trade_date"]).values
    y = index_df["pe_ttm"].values

    #划定分割范围
    max = np.max(y)
    pe_80 = np.percentile(y,80)
    pe_20 = np.percentile(y,20)
    min = np.min(y)
    now = y[-1]

    #绘图
    fig,ax = plt.subplots(figsize=(12,8))
    ax.plot(x,y,linewidth=3)
    ax.fill_between(x,min-1,pe_20,facecolor = "#00ff80",alpha=0.2)
    ax.fill_between(x,pe_20,pe_80,facecolor = "#ffff4d",alpha=0.2)
    ax.fill_between(x,pe_80,max+1,facecolor = "#ff69b4",alpha=0.2)
    ax.tick_params(axis='both', which='both',length=0)
    ax.tick_params(axis='both', which='major', labelsize=16)
    ax.margins(0.01,0)
    ax.text(0.75,0.9,"市盈率 = {}".format(now),
            transform=ax.transAxes,fontdict={'size':18})
    plt.xticks(rotation=45)
    plt.box(False)
    plt.title("{}估值图".format(name),fontdict={'size':24})
    plt.show()

Например, создайте диаграмму оценки индекса ChiNext за последние 5 лет.

pe_plot(ts_code="399006.SZ",name="创业板指",period=5)

!

创业板指.png

Отсканируйте код, чтобы подписаться на официальный аккаунт"Питон Чтение Финансов", получите галантерею в первый раз!

底部二维码.png