1
from datetime import datetime, timedelta, date
import pandas_datareader as pdr
import mplfinance as mpf
    
df_history = pdr.get_data_yahoo(symbols='GOLD', 
                                    start=datetime(2020, 8, 30), 
                                    end=datetime(2021, 2, 23))
    
# Today is: 24.02.2021
two_points  = [(datetime(2020, 8, 30),28.72),(datetime(2021, 3, 26),23.49)]
mpf.plot(df_history, type='candle', alines=two_points)

我收到错误消息:

ValueError: User specified line date "2020-08-30 00:00:00" is before (less than) range of plotted data (2020-08-31 00:00:00 to 2021-02-23 00:00:00)

有没有办法在范围之外绘图?

4

1 回答 1

0

解决方法是设置show_nontrading=True

我用你的代码进行了测试,修改为:

mpf.plot(df_history, type='candle', alines=two_points, show_nontrading=True)

并得到

在此处输入图像描述

这不起作用的原因show_nontrading=False(默认值,如果未指定,值)是因为在这种情况下,x 轴值实际上只是表示数据框中行号的整数(尽管 x 轴标签被格式化为日期),因此,您传递给alinekwarg 的日期必须转换为行号(如果日期介于两行之间,则为其中的一部分)。该算法使用现有数据。会考虑是否可以轻松修改以进行推断(如果可以,可能不完全是线性的)。 代码可以在这里看到。我愿意接受建议。同时show_nontrading=True应该可以正常工作。


另一种解决方法是在数据框的开头和结尾放置一个额外的行,其中包含趋势线的日期。

您需要开始结束的原因是因为的趋势线日期都超出了您的数据范围。

这对于 可能并不明显datetime(2020, 8, 30),因为调用get_data_yahoo()使用相同的日期,但是API 返回 8.31.2020 作为第一个日期,因为 8.0 是星期日和非交易日。

因此:

from datetime import datetime, timedelta, date
import pandas_datareader as pdr
import mplfinance as mpf
    
df_history = pdr.get_data_yahoo(symbols='GOLD', 
                                    start=datetime(2020, 8, 30), 
                                    end=datetime(2021, 2, 23))

dfa = df_history.iloc[0:1].copy()     # copy first row
dfa.index = [datetime(2020, 8, 30)]   # switch the date

dfb = df_history.iloc[-2:-1].copy()   # copy last row
dfb.index = [datetime(2021, 3, 26)]   # switch the date

# Concatenate the three DataFrames
df_history = pd.concat([dfa,df_history,dfb])

# Now we the trend line dates are withing the range of data in df_history:

two_points  = [(datetime(2020, 8, 30),28.72),(datetime(2021, 3, 26),23.49)]
mpf.plot(df_history, type='candle', alines=two_points)

结果:

在此处输入图像描述

有关趋势线外推的更多详细信息,以及与您的趋势是否包括非交易日相关的问题,请单击此处。

于 2021-02-25T14:58:57.900 回答