记下自己的研究成果是件开心的事情,本文介绍用Python3将股票历史行情画成K线图,以及添加5日,10日,N日均线。
首先,是获取数据源,一般分两种,一是直接从财经类网站读取;二是读取本地数据文件。我是先从财经网站下载历史行情数据csv文件,然后放到工程文件夹里。
-
-
- from matplotlib.finance import quotes_historical_yahoo_ohlc
-
- start = (2017, 1, 1)
-
- end = (2017, 7, 12)
-
- stock = quotes_historical_yahoo_ohlc("399300.ss", start, end)
-
- if len(stock) == 0:
-
- raise SystemExit
-
-
-
- import datetime
-
- import pandas_datareader.data as web
-
-
- start = datetime.datetime(2016, 10, 1)
-
- end = datetime.date.today()
-
- goog = web.DataReader("GOOG", "yahoo", start, end)
方式二,读取本地数据文件
- import pandas as pd
-
- stock = pd.read_csv("hs300_399300.csv")
csv文件如下:
然后,进行数据预处理,或者说数据清洗。
-
-
-
-
- print(sys.getdefaultencoding)
-
-
-
- stock = pd.read_csv("hs300_399300.csv",nrows=28, parse_dates=[0], index_col=0, encoding="ANSI")
-
-
-
- stock = stock[::-1]
-
- print(stock.info())
-
- print(stock.head())
-
- print(stock.columns)
可以看到数据信息,总共28行,时间索引为2017-05-26到2017-07-06,没有空值,以及各列的数据类型。若数据有缺损或者有多余空格,就要进行调整。
数据没问题后就可以开始画图的了,首先用自带的plot()画单列数据的图:
-
-
- stock["收盘价"].plot(grid=True)
-
- stock["最高价"].plot()
可以看到它的横坐标竟然是以时间为刻度从2017-05-28到2017-07-02,原因是我们之前将csv文件第一列解析成时间格式,并且设为索引。如果没这么做,那么横坐标将为0,1,2,3....28.这一点在后面将不同坐标系的图绘入同一坐标系中非常重要。
K线图又称蜡烛图,起源于日本德川幕府时代,当时的商人用此图来记录米市的行情和价格波动,后来K线图被引入到股票市场。每天的四项指标数据用如下蜡烛形状的图形来记录,不同的颜色代表涨跌情况。
基本背景知识介绍完,上主菜:
- import matplotlib.pyplot as plt
-
- from matlplotlib.dates import DateFormatter,WeekdayLocator, DayLocator, MONDAY
-
- import pandas as pd
-
- import matplotlib.dates as mdates
-
- from matplotlib.finance import candlestick_ohlc,quotes_historical_yahoo_ohlc
-
- import numpy as np
-
-
- def candle(stock, stocks, others=None):
-
-
-
- stock['日期'] = pd.to_datetime(stock['日期'])
-
-
-
- stock['日期'] = stock['日期'].apply(lambdad: mdates.date2num(d.to_pydatetime()))
-
-
-
- tuples = [tuple(x)for x in stock[['日期', '开盘价', '最高价', '最低价', '收盘价']]]
-
-
-
-
- fig, ax =plt.subplots()
-
-
-
- fig.subplots_adjust(bottom=0.2)
-
-
-
- mondays =WeekdayLocator(MONDAY)
-
- ax.xaxis.set_major_locator(mondays)
-
- mondays_formatter = DateFormatter("%Y-%m-%d")
-
- ax.xaxis.set_major_formatter(mondays_formatter)
-
-
-
-
- days =DayLocator()
-
- ax.xaxis.set_minor_locator(days)
-
-
-
-
-
-
-
-
-
-
-
-
- ax.grid(True)
-
-
-
-
- candlestick_ohlc(ax,tuples, width=0.6, colorup='r', colordown='g')
-
-
-
- if others isnot None:
-
- for each inothers:
-
- plt.plot(stocks[each], label=each)
-
- plt.legend()
-
- ax.xaxis_date()
- ax.autoscale_view()
-
-
-
-
- plt.setp(plt.gca().get_xticklabels(), rotation=45,horizontalalignment='right')
-
- plt.title("hs300_399300")
-
-
-
-
-
- plt.show()
5日均线:5天的收盘价的平均值
10日均线:10天的收盘价的平均值
依次类推。
给数据文件加一列“5日均线”,和‘10日均线’
stocks["5days"] = np.round(stocks["收盘价"].rolling(window=5, center=False).mean(), 2)
stocks["10days"] = np.round(stocks["收盘价"].rolling(window=10, center=False).mean(), 2)
现在打印下前60行
可见现在5,10日均线的数据都以计算并添加进数据文件中,接下来就是将其绘制入K线图上
-
-
- stock = pd.read_csv("hs300_399300", nrows=60,encoding="ANSI")
-
- stock = stock[::-1]
-
-
-
- stock = pd.read_csv("hs300_399300", nrows=60,parse_dates=[0], index_col=0, encoding="ANSI")
-
- stock = stock[::-1]
-
-
-
- stock.index.rename('日期', inplace=True)
-
- stock.rename(columns={}, inplace=True)
-
- candle(stock, stocks, ["5days","10days"])
运行输出: