【发布时间】:2019-04-05 04:50:09
【问题描述】:
我正在运行以下网站的代码:
https://ntguardian.wordpress.com/2018/07/17/stock-data-analysis-python-v2/
生成蜡烛图。我在 Spyder 中运行过类似的代码,我对代码所做的唯一修改是
import numpy as np
from matplotlib.dates import DateFormatter, WeekdayLocator,DayLocator,MONDAY
from mpl_finance import candlestick_ohlc
from matplotlib.dates import date2num
他们的图表在网页上是这样的:
这是我在 Spyder 中运行时的图表
我似乎无法理解为什么我没有更改代码为什么会看到如此明显的差异。
Spyder 中是否存在一些导致此问题的怪癖,还是我需要多几行代码?
请帮我解决这个问题,因为我是 matplotlib 的新手。
非常感谢,非常感谢您对此提供的帮助。
我的整体代码
import pandas as pd
import numpy as np
pd.set_option('display.max_rows', 500)
pd.set_option('display.max_columns', 500)
pd.set_option('display.width', 1000)
import quandl
import datetime
# We will look at stock prices over the past year, starting at January
start = datetime.datetime(2016,1,1)
end =datetime.date.today()
#Fist define the security for which you are extracting the Series
s = "AAPL"
apple = quandl.get("WIKI/" + s, start_date=start, end_date=end)
print (type(apple))
print (apple.head())
#print (apple.tail())
import matplotlib
import matplotlib.pyplot as plt
import pylab
#Lines of Code for Jupyter
# This line is necessary for the plot to appear in a Jupyter notebook
#%matplotlib inline
# Control the default size of figures in this Jupyter notebook
#%pylab inline
pylab.rcParams['figure.figsize'] = (15, 9) # Change the size of plots
print (apple["Adj. Close"].plot(grid = True))
from matplotlib.dates import DateFormatter, WeekdayLocator, DayLocator,
MONDAY
from mpl_finance import candlestick_ohlc
from matplotlib.dates import date2num
def pandas_candlestick_ohlc(dat, stick = "day", adj = False, otherseries =
None):
"""
:param dat: pandas DataFrame object with datetime64 index, and float columns
"Open", "High", "Low", and "Close", likely created via DataReader from
"yahoo"
:param stick: A string or number indicating the period of time covered by a
single candlestick. Valid string inputs include "day", "week", "month", and
"year", ("day" default), and any numeric input indicates the number of
trading days included in a period
:param adj: A boolean indicating whether to use adjusted prices
:param otherseries: An iterable that will be coerced into a list, containing
the columns of dat that hold other series to be plotted as lines
This will show a Japanese candlestick plot for stock data stored in dat,
also plotting other series if passed.
"""
mondays = WeekdayLocator(MONDAY) # major ticks on the mondays
alldays = DayLocator() # minor ticks on the days
dayFormatter = DateFormatter('%d') # e.g., 12
# Create a new DataFrame which includes OHLC data for each period specified
by stick input
fields = ["Open", "High", "Low", "Close"]
if adj:
fields = ["Adj. " + s for s in fields]
transdat = dat.loc[:,fields]
transdat.columns = pd.Index(["Open", "High", "Low", "Close"])
if (type(stick) == str):
if stick == "day":
plotdat = transdat
stick = 1 # Used for plotting
elif stick in ["week", "month", "year"]:
if stick == "week":
transdat["week"] = pd.to_datetime(transdat.index).map(lambda x:
x.isocalendar()[1]) # Identify weeks
elif stick == "month":
transdat["month"] = pd.to_datetime(transdat.index).map(lambda x:
x.month) # Identify months
transdat["year"] = pd.to_datetime(transdat.index).map(lambda x:
x.isocalendar()[0]) # Identify years
grouped = transdat.groupby(list(set(["year",stick]))) # Group by
year and other appropriate variable
plotdat = pd.DataFrame({"Open": [], "High": [], "Low": [], "Close":
[]}) # Create empty data frame containing what will be plotted
for name, group in grouped:
plotdat = plotdat.append(pd.DataFrame({"Open": group.iloc[0,0],
"High": max(group.High),
"Low": min(group.Low),
"Close": group.iloc[-1,3]},
index = [group.index[0]]))
if stick == "week": stick = 5
elif stick == "month": stick = 30
elif stick == "year": stick = 365
elif (type(stick) == int and stick >= 1):
transdat["stick"] = [np.floor(i / stick) for i in
range(len(transdat.index))]
grouped = transdat.groupby("stick")
plotdat = pd.DataFrame({"Open": [], "High": [], "Low": [], "Close": []})
# Create empty data frame containing what will be plotted
for name, group in grouped:
plotdat = plotdat.append(pd.DataFrame({"Open": group.iloc[0,0],
"High": max(group.High),
"Low": min(group.Low),
"Close": group.iloc[-1,3]},
index = [group.index[0]]))
else:
raise ValueError('Valid inputs to argument "stick" include the strings "day", "week", "month", "year", or a positive integer')
# Set plot parameters, including the axis object ax used for plotting
fig, ax = plt.subplots()
fig.subplots_adjust(bottom=0.2)
if plotdat.index[-1] - plotdat.index[0] < pd.Timedelta('730 days'):
weekFormatter = DateFormatter('%b %d') # e.g., Jan 12
ax.xaxis.set_major_locator(mondays)
ax.xaxis.set_minor_locator(alldays)
else:
weekFormatter = DateFormatter('%b %d, %Y')
ax.xaxis.set_major_formatter(weekFormatter)
ax.grid(True)
# Create the candelstick chart
candlestick_ohlc(ax, list(zip(list(date2num(plotdat.index.tolist())),
plotdat["Open"].tolist(), plotdat["High"].tolist(),
plotdat["Low"].tolist(), plotdat["Close"].tolist())),
colorup = "black", colordown = "red", width = stick * .4)
# Plot other series (such as moving averages) as lines
if otherseries != None:
if type(otherseries) != list:
otherseries = [otherseries]
dat.loc[:,otherseries].plot(ax = ax, lw = 1.3, grid = True)
ax.xaxis_date()
ax.autoscale_view()
plt.setp(plt.gca().get_xticklabels(), rotation=45,
horizontalalignment='right')
plt.show()
pandas_candlestick_ohlc(apple, adj=True, stick="month")
【问题讨论】:
-
如果你运行 exact 相同的代码,你会得到与文章相同的结果吗?如果没有,那么您可能正在使用各种库的不同版本..
-
我使用生成烛台图的完全相同的代码
-
我似乎无法理解为什么 x 轴对我来说如此拥挤。感谢@DavidG 试图帮助我。
-
您能否使用minimal reproducible example 编辑您的问题,即我们可以运行一段代码来重现问题?
-
你好@DavidG。我已经尽我所能。我知道它看起来并不小,但我不知道如何进一步缩短它,因为我对导致问题的原因一无所知并且已经放置了我的代码。如果这不是简短的,我深表歉意。
标签: python matplotlib candlestick-chart