如何动态添加多条移动平均线到 Plotly Candlestick
How to add multiple Moving Average lines DYNAMICALLY to Plotly Candlestick
我编写了这个函数来使用 plotly
绘制烛台。我想添加 动态添加 N
具有不同颜色的不同线条 的功能。现在它只添加了 1 行。我可以硬编码另一个 Scatter
但不是动态的。
代码如下:
def plot_candlesticks(df, names = ('DATE','OPEN','CLOSE','LOW','HIGH'), mv = 44):
'''
Plot a candlestick on a given dataframe
args:
df: DataFrame
names: Tuple of column names showing ('DATE','OPEN','HIGH','LOW','OPEN','CLOSE')
mv: Moving Average
'''
stocks = df.copy()
Date, Open, Close, Low, High = names
stocks.sort_index(ascending=False, inplace = True)
stocks[f'{str(mv)}-SMA'] = stocks[Close].rolling(mv, min_periods = 1).mean()
candle = go.Figure(data = [go.Candlestick(x = stocks[Date], name = 'Trade',
open = stocks[Open],
high = stocks[High],
low = stocks[Low],
close = stocks[Close]),
go.Scatter(name=f'{str(mv)} MA',x=stocks[Date], y=stocks[f'{str(mv)}-SMA'],
line=dict(color='blue', width=1)),])
candle.update_xaxes(
title_text = 'Date',
rangeslider_visible = True,
rangeselector = dict(
buttons = list([
dict(count = 1, label = '1M', step = 'month', stepmode = 'backward'),
dict(count = 6, label = '6M', step = 'month', stepmode = 'backward'),
dict(count = 1, label = 'YTD', step = 'year', stepmode = 'todate'),
dict(count = 1, label = '1Y', step = 'year', stepmode = 'backward'),
dict(step = 'all')])))
candle.update_layout(autosize = True,
title = {'text': all_stocks[stocks['SYMBOL'][0]],'y':0.97,'x':0.5,
'xanchor': 'center','yanchor': 'top'},
margin=dict(l=30,r=30,b=30,t=30,pad=2),
paper_bgcolor="lightsteelblue",)
candle.update_yaxes(title_text = 'Close Price', tickprefix = u"\u20B9" ) # Rupee symbol
candle.show()
我修改了代码,理解你的问题的目的是自动将多个移动平均线添加到烛台图,并将基值作为函数参数传递到列表。该点是通过 add_trace() 到烛台图来实现的。
import plotly.graph_objects as go
import pandas as pd
import yfinance as yf
data = yf.download("AAPL", start="2021-01-01", end="2021-03-01")
data = data.iloc[:,0:4]
data.reset_index(inplace=True)
def plot_candlesticks(df, names = ('Date','Open','High','Low','Close'), mv = [5,25,75]):
'''
Plot a candlestick on a given dataframe
args:
df: DataFrame
names: Tuple of column names showing ('DATE','OPEN','HIGH','LOW','OPEN','CLOSE')
mv: Moving Average
'''
stocks = df.copy()
Date, Open, Close, Low, High = names
stocks.sort_index(ascending=False, inplace = True)
colors = ['red', 'blue', 'yellow']
candle = go.Figure(data = [go.Candlestick(x = stocks[Date], name = 'Trade',
open = stocks[Open],
high = stocks[High],
low = stocks[Low],
close = stocks[Close]),])
for i in range(len(mv)):
stocks[f'{str(mv[i])}-SMA'] = stocks[Close].rolling(mv[i], min_periods = 1).mean()
candle.add_trace(go.Scatter(name=f'{str(mv[i])} MA',x=stocks[Date], y=stocks[f'{str(mv[i])}-SMA'],
line=dict(color=colors[i], width=2)))
candle.update_xaxes(
title_text = 'Date',
rangeslider_visible = True,
rangeselector = dict(
buttons = list([
dict(count = 1, label = '1M', step = 'month', stepmode = 'backward'),
dict(count = 6, label = '6M', step = 'month', stepmode = 'backward'),
dict(count = 1, label = 'YTD', step = 'year', stepmode = 'todate'),
dict(count = 1, label = '1Y', step = 'year', stepmode = 'backward'),
dict(step = 'all')])))
candle.update_layout(autosize = True,
title = {'text': "all_stocks[stocks['SYMBOL'][0]]",'y':0.97,'x':0.5,
'xanchor': 'center','yanchor': 'top'},
margin=dict(l=30,r=30,b=30,t=30,pad=2),
paper_bgcolor="lightsteelblue",)
candle.update_yaxes(title_text = 'Close Price', tickprefix = u"\u20B9" ) # Rupee symbol
candle.show()
plot_candlesticks(data)
我编写了这个函数来使用 plotly
绘制烛台。我想添加 动态添加 N
具有不同颜色的不同线条 的功能。现在它只添加了 1 行。我可以硬编码另一个 Scatter
但不是动态的。
代码如下:
def plot_candlesticks(df, names = ('DATE','OPEN','CLOSE','LOW','HIGH'), mv = 44):
'''
Plot a candlestick on a given dataframe
args:
df: DataFrame
names: Tuple of column names showing ('DATE','OPEN','HIGH','LOW','OPEN','CLOSE')
mv: Moving Average
'''
stocks = df.copy()
Date, Open, Close, Low, High = names
stocks.sort_index(ascending=False, inplace = True)
stocks[f'{str(mv)}-SMA'] = stocks[Close].rolling(mv, min_periods = 1).mean()
candle = go.Figure(data = [go.Candlestick(x = stocks[Date], name = 'Trade',
open = stocks[Open],
high = stocks[High],
low = stocks[Low],
close = stocks[Close]),
go.Scatter(name=f'{str(mv)} MA',x=stocks[Date], y=stocks[f'{str(mv)}-SMA'],
line=dict(color='blue', width=1)),])
candle.update_xaxes(
title_text = 'Date',
rangeslider_visible = True,
rangeselector = dict(
buttons = list([
dict(count = 1, label = '1M', step = 'month', stepmode = 'backward'),
dict(count = 6, label = '6M', step = 'month', stepmode = 'backward'),
dict(count = 1, label = 'YTD', step = 'year', stepmode = 'todate'),
dict(count = 1, label = '1Y', step = 'year', stepmode = 'backward'),
dict(step = 'all')])))
candle.update_layout(autosize = True,
title = {'text': all_stocks[stocks['SYMBOL'][0]],'y':0.97,'x':0.5,
'xanchor': 'center','yanchor': 'top'},
margin=dict(l=30,r=30,b=30,t=30,pad=2),
paper_bgcolor="lightsteelblue",)
candle.update_yaxes(title_text = 'Close Price', tickprefix = u"\u20B9" ) # Rupee symbol
candle.show()
我修改了代码,理解你的问题的目的是自动将多个移动平均线添加到烛台图,并将基值作为函数参数传递到列表。该点是通过 add_trace() 到烛台图来实现的。
import plotly.graph_objects as go
import pandas as pd
import yfinance as yf
data = yf.download("AAPL", start="2021-01-01", end="2021-03-01")
data = data.iloc[:,0:4]
data.reset_index(inplace=True)
def plot_candlesticks(df, names = ('Date','Open','High','Low','Close'), mv = [5,25,75]):
'''
Plot a candlestick on a given dataframe
args:
df: DataFrame
names: Tuple of column names showing ('DATE','OPEN','HIGH','LOW','OPEN','CLOSE')
mv: Moving Average
'''
stocks = df.copy()
Date, Open, Close, Low, High = names
stocks.sort_index(ascending=False, inplace = True)
colors = ['red', 'blue', 'yellow']
candle = go.Figure(data = [go.Candlestick(x = stocks[Date], name = 'Trade',
open = stocks[Open],
high = stocks[High],
low = stocks[Low],
close = stocks[Close]),])
for i in range(len(mv)):
stocks[f'{str(mv[i])}-SMA'] = stocks[Close].rolling(mv[i], min_periods = 1).mean()
candle.add_trace(go.Scatter(name=f'{str(mv[i])} MA',x=stocks[Date], y=stocks[f'{str(mv[i])}-SMA'],
line=dict(color=colors[i], width=2)))
candle.update_xaxes(
title_text = 'Date',
rangeslider_visible = True,
rangeselector = dict(
buttons = list([
dict(count = 1, label = '1M', step = 'month', stepmode = 'backward'),
dict(count = 6, label = '6M', step = 'month', stepmode = 'backward'),
dict(count = 1, label = 'YTD', step = 'year', stepmode = 'todate'),
dict(count = 1, label = '1Y', step = 'year', stepmode = 'backward'),
dict(step = 'all')])))
candle.update_layout(autosize = True,
title = {'text': "all_stocks[stocks['SYMBOL'][0]]",'y':0.97,'x':0.5,
'xanchor': 'center','yanchor': 'top'},
margin=dict(l=30,r=30,b=30,t=30,pad=2),
paper_bgcolor="lightsteelblue",)
candle.update_yaxes(title_text = 'Close Price', tickprefix = u"\u20B9" ) # Rupee symbol
candle.show()
plot_candlesticks(data)