【问题标题】:how to plot candlesticks in python如何在python中绘制烛台
【发布时间】:2018-12-09 23:13:57
【问题描述】:

我正在尝试用烛台创建一个简单的图。为此,我从 Yahoo 获取数据并使用函数 candstick2_ohlc 绘制它。目标是使用 jpg 文件导出图像。

这是我正在使用的代码:

from pandas_datareader import data
import matplotlib.pyplot as plt
from mpl_finance import candlestick2_ohlc
import matplotlib.dates as mdates
import fix_yahoo_finance as yf
import datetime

start = datetime.date(2018, 1, 1)
end = datetime.date.today()

aapl = yf.download("AAPL",start,end) 
aapl.reset_index(inplace=True)

aapl['Date'] = aapl.index.map(mdates.date2num)

fig, ax = plt.subplots()
plt.xlabel("Date")
plt.ylabel("Price")

candlestick2_ohlc(ax, aapl.Open, aapl.High, aapl.Low, aapl.Close, width=1, colorup='g')
plt.savefig('my_figure.png')
plt.show()

我的第一个问题是:还有另一种简单的方法吗?你能给我举个例子来处理财务数据吗?我通常在 R 中使用 quantmod。

第二个问题是:在我的示例中,X 轴中没有 Date。我该怎么做才能在 X 轴上显示带有日期的情节?我应该将 Date 转换为 AX 格式,但我不知道一种简单的方法。

谢谢

【问题讨论】:

  • 不,在我的情况下,我使用的是日期,没有盘中,我要求更多的想法。谢谢:)
  • 我认为频率无关紧要,您和 dup 的问题涉及日期时间。还有简单的方法是什么意思?您有一条绘图线和 4-5 个 plt 设置(典型的 matplotlib 解决方案)。

标签: python plot finance candlestick-chart


【解决方案1】:

有很多方法可以在 python 中使用不同的包绘制烛台,例如:

  1. 财务
  2. 阴谋
  3. finplot

您还可以使用matplotlib 包创建自己的专用烛台版本。

mplfinance 包

您可以使用以下命令安装该软件包:

pip install mplfinance

那么,你应该像下面这样使用它:

  1. 索引应采用DatetimeIndex 格式。
  2. 数据集应包含名为:HighOpenCloseLow 的列。 (区分大小写)
  3. (可选)如果要显示卷,Volume 命名列是必需的。

PS 1:您可以使用 pandas to_datetime 方法创建 DatetimeIndex。 PS 2:您可以在数据框上使用rename 方法重命名列。

示例:

import pandas as pd
import mplfinance as mpf

df = pd.read_csv("<dataframe-path>", index_col=0)
mpf.plot(df, type='candle', style='yahoo', volume=True)

情节包

首先您需要使用以下命令安装plotly 包:

pip install plotly

然后,您可以像以下代码一样简单地绘制蜡烛图:

import plotly.graph_objects as go

import pandas as pd
from datetime import datetime

df = pd.read_csv('your_file_address')

fig = go.Figure(data=[go.Candlestick(x=df['name_of_time_column'],
                open=df['name_of_open_column'],
                high=df['name_of_high_column'],
                low=df['name_of_low_column'],
                close=df['name_of_close_column'])])

fig.show()

finplot 包

您可以使用以下命令安装 finplot 包:

pip install finplot

那么,构建烛台图真的很容易。

示例:

import finplot as fplt
import pandas as pd
df = pd.read_csv("<data-path.csv>")

fplt.candlestick_ochl(df[['Open', 'Close', 'High', 'Low']])
fplt.show()

【讨论】:

    【解决方案2】:

    finplot 有工作日期:

    import finplot as fplt
    import yfinance
    df = yfinance.download('AAPL')
    fplt.candlestick_ochl(df[['Open', 'Close', 'High', 'Low']])
    fplt.show()
    

    它不仅显示您的日期,而且还有许多改进(这里不一一列举)。

    免责声明:我不喜欢 matplotlib 和 plotly 的 API(以及性能和功能不足),因此创建了 finplot。它已经拥有 mpl_finance 的 9% 的 pypi 星,所以检查一下!

    【讨论】:

    • 我刚刚更新了(我的回答)[stackoverflow.com/a/59256790/7310077],尝试一下会是一次不错的体验。我希望它有所帮助。
    • 谢谢@MostafaGhadimi!我试图强调易用性和性能,这就是我首先制作它的原因。
    • 是的。非常感谢你,乔纳斯。是的,你是对的,我赞成你,伙计。这是一个非常好的答案。
    • 嗨@JonasByström!我刚刚安装了 finplot,并尝试了您的示例(完全复制了您的代码)。我收到以下错误:[IndexError: index 4 is out of bounds for axis 0 with size 4]。你遇到过这个吗?
    • @the_drug 不,听起来很奇怪。您是否尝试过包含的十几个示例中的任何一个?如果问题仍然存在,请在 github 上提出问题。
    【解决方案3】:

    使用 Plotly,您可以用一行代码绘制烛台图。

    df[['Open', 'High', 'Low', 'Close']]['2018-01-01':'20XX-XX-XX'].iplot(kind="candle")
    

    在使用 plotly 之前,您需要在命令行中使用 pip 安装 plotly 和袖扣:

    pip install plotly
    
    pip install cufflinks
    

    您还需要在 Jupiter Notebook 顶部导入以下内容:

    from plotly import __version__
    
    import cufflinks as cf
    
    from plotly.offline import download_plotlyjs, init_notebook_mode, plot, iplot
    
    init_notebook_mode (connected=True)
    
    cf.go_offline()
    

    【讨论】:

      【解决方案4】:

      你可以用 matplot 做任何事情(使用 Boxplot)

      df = pdr.data.get_data_yahoo(ticker, start='2012-01-01', end='2012-10-10')
      df = df[['Open', 'High', 'Low', 'Close']]
      
      fig, ax1 = plt.subplots(figsize=(14,7), num='figure name')
      
      ax1.set_title('box title')
      ax1.yaxis.grid(True, linestyle='-', which='major', color='lightgrey', alpha=0.5)
      ax1.xaxis.grid(True, linestyle='-', which='major', color='lightgrey', alpha=0.5)
      
      bp = ax1.boxplot(df, patch_artist=True, labels=df.index.astype(str))
      
      # green up, red down
      for count_box in range(len(df.index)):
          if (df.iloc[count_box,0]-df.iloc[count_box,3])>=0:
             plt.setp(bp['boxes'][count_box], color='red')
          else:
             plt.setp(bp['boxes'][count_box], color='green')
      
       plt.xticks(rotation=30)
       plt.show() #or plt.savefig()
      

      【讨论】:

      • 得到错误:plt.setp(bp['boxes'][count_box], color='green') IndexError: list index out of range
      猜你喜欢
      • 2018-12-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-02-28
      • 2018-12-16
      • 2022-10-02
      • 1970-01-01
      • 2013-11-03
      相关资源
      最近更新 更多