Я создал свечную диаграмму, которая отображает процентное отклонение от скользящей средней с процентным значением в качестве параметра левой оси Y.Я хочу построить цену закрытия, которая соответствует этим процентам (полученным по формуле, представленной в моем коде) на правой стороне оси Y.Однако я не ищу двойную ось.Как я могу это сделать?
В настоящее время я могу сделать 2 субплота, со свечой на верхнем графике и соответствующими ценами закрытия на нижнем графике.Это мой код:
import datetime as dt
import matplotlib.pyplot as plt
from matplotlib import style
import pandas as pd
pd.core.common.is_list_like = pd.api.types.is_list_like
import pandas_datareader.data as web
import numpy as np
from mpl_finance import candlestick_ohlc
import matplotlib.dates as mdates
from matplotlib.dates import DateFormatter, MonthLocator, YearLocator, DayLocator
style.use( 'ggplot' )
start_year = int( input( 'Start year: ' ) )
start_month = int( input( 'Start month: ' ) ) #for months before October, only type in the corresponding digit without the 0
start_day = int( input( 'Start day: ' ) )
print()
end_year = int( input( 'End year: ' ) )
end_month =int( input( 'End month: ' ) ) #for months before October, only type in the corresponding digit without the 0
end_day = int( input( 'End day: ' ) )
start = dt.datetime( start_year, start_month, start_day )
end = dt.datetime( end_year, end_month, end_day )
print()
ticker = input( 'Ticker: ' ) #should be in Uppercase
ticker = ticker.upper()
df = web.DataReader( ticker, 'morningstar', start, end )
print()
file_name = input( 'What\'s the csv file name that is stored on your device? ( ticker.csv ): ' ) #input should be in Lowercase .csv format
file_name = file_name.lower()
df.to_csv( file_name )
df = pd.read_csv( file_name, parse_dates=True, index_col=0 )
alldays = DayLocator() # minor ticks on the days
weekFormatter = DateFormatter('%b %d %Y') # e.g., Jan 12 2018
dayFormatter = DateFormatter('%d') # e.g., 12
plt.subplot( 2, 1, 1 )
ax = plt.gca()
#fig.subplots_adjust(bottom=0.2)
ax.xaxis.set_minor_locator(alldays)
ax.xaxis.set_major_formatter(weekFormatter)
# ax.xaxis.set_minor_formatter(dayrmatter)
print()
reply = input( 'How many days\' exponential moving average do you want?: ' )
n = int( reply )
df[ 'EMA' ] = df[ 'Close' ].ewm( span = n, adjust=False ).mean()
df[ 'H' ] = ( df[ 'High' ] - df[ 'EMA' ] ) / df[ 'EMA' ]
df[ 'L' ] = ( df[ 'Low' ] - df[ 'EMA' ] ) / df[ 'EMA' ]
df[ 'C' ] = ( df[ 'Close' ] - df[ 'EMA' ] ) / df[ 'EMA' ]
df[ 'OP' ] = ( df[ 'Open' ] - df[ 'EMA' ] ) / df[ 'EMA' ]
#
df.dropna( inplace=True )
df_corr = pd.DataFrame()
#nbr_days = len( df[ 'Date' ] )
max_h = df[ 'H' ].max()
max_input = int( max_h * 2.4 * 100 )
min_l = df[ 'L' ].min()
min_input = int( min_l * 2.4 * 100 )
#print( int( min_input ), int( max_input ) )
l = []
for i in range( min_input, max_input ):
value = i / 200
l.append( value )
df_corr['corr'] = l
df_corr.dropna( inplace=True )
df_merged = pd.concat([df.reset_index(), df_corr ], axis=1).set_index("Symbol")
df_merged.to_csv( 'combine2.csv', index=False )
df_ohlc = df_merged
latest_ema = df_ohlc[ 'EMA' ].tail( 1 )
print( latest_ema )
df_ohlc[ 'Price' ] = ( df_ohlc[ 'corr' ] * latest_ema ) + latest_ema #you need to take the latest EMA
print( df_ohlc )
# plot_day_summary(ax, quotes, ticksize=3)
date_list = df_ohlc[ 'Date' ].map( mdates.datestr2num )
candlestick_ohlc(ax, zip(df_ohlc[ 'Date' ].map( mdates.datestr2num ),
df['OP'], df['H' ],
df['L'], df['C']),
width=0.6, colorup= 'g' )
ax.xaxis_date()
##ax2 = ax.twinx()
##s2 = df_ohlc[ 'Price' ]
##ax2.plot( date_list, s2 )
##plt.figure( 2 )
##plt.subplot()
##plt.plot( df_ohlc[ 'corr' ], df_ohlc[ 'Price' ] )
#ax2.plot( df_ohlc[ 'corr' ], df_ohlc[ 'Price' ] )
plt.subplot( 2, 1, 2 )
plt.plot( df_ohlc[ 'corr' ], df_ohlc[ 'Price' ], '.-' )
ax.autoscale_view()
plt.setp(plt.gca().get_xticklabels(), rotation=45, horizontalalignment='right')
plt.show()
Это вывод:
Date Close High ... OP corr Price
Symbol ...
SPY 2017-05-30 241.50 241.7900 ... -0.000663 -0.075 248.783803
SPY 2017-05-31 241.44 241.8800 ... 0.001416 -0.070 250.128581
Кроме того, вот как выглядит график:
В идеале я хочу что-то вроде этого, где цены на правой оси Y соответствуют процентам слева, а не датам.(сделано в Excel):
Даже если невозможно построить несколько осей, есть ли способ связать два графика?Например, если я рассматриваю 6% как критическую точку на верхнем графике и хочу проверить соответствующую цену на нижнем графике, есть ли более быстрый способ, чем ручная проверка соответствующей цены на нижнем графике?