数据
数据是上证指数日行情数据,股票代码000002.sz,原始数据shdata示例如下:
读取数据:
import numpy as np
import pandas as pd
import mplfinance as mpf
import matplotlib.pyplot as plt
from datetime import datetime
import matplotlib.ticker as ticker
import talib
from mplfinance.original_flavor import candlestick_ohlc
#from matplotlib.ticker import MaxNLocator, FuncFormatter
shdata = pd.read_csv("D:/my_files/sh_index.csv")
shdata['date'] = pd.to_datetime(shdata['trade_date'], format="%Y%m%d") #设置date列格式为年月日
shdata_beiyong = shdata.copy()
shdata.set_index('date',inplace=True) #设置索引
日数据转周数据
有时候需要以周为单位对数据进行分析或观测,数据转换代码如下:
p='w'
pshdata = shdata.resample(p).last() #转换,周线的每个变量都等于那一周中最后一个交易日的变量值
pshdata['open'] = shdata['open'].resample(p).first() #周线的open等于那一周中第一个交易日的open
pshdata['high'] = shdata['high'].resample(p).max() #周线的high等于那一周中的high的最大值
pshdata['low'] = shdata['low'].resample(p).min() #周线的low等于那一周中的low的最大值
pshdata['vol'] = shdata['vol'].resample(p).sum() #周线的vol和amount等于那一周中vol和amount各自的和
pshdata['amount'] = shdata['amount'].resample(p).sum()
pshdata = pshdata[pshdata['open'].notnull()] #删除一整周没有数据的周
K线
K线图又称蜡烛图、日本线、阴阳线、棒线等,常用说法是“K线”,K线是一条柱状的线条,由影线和实体组成,影线在实体上方的部分叫上影线,下方的部分叫下影线,实体分阳线和阴线。其中影线表明当天交易的最高和最低价,而实体表明当天的开盘价和收盘价。为了展示更清晰,这里只用12个数据画K线:
shdata12 = shdata.iloc[-12: , : ] #只保留最近12个数据
mpf.plot(shdata12, type='candle', style='yahoo') #做K线图
均线(MA)
移动平均线 又称为 均线(Moving Average ), 也常简称MA,代表过去一段时间里的平均成交价格,均线最主要目的是用来判断趋势通常是预期市场现在跟未来可能的走势。一般会用两条均线(短期均线和长期均线)结合来分析股票走势,这里绘制5日均线与20日均线,同时用灰色绘制日收盘价:
#计算5日均线、10日均线数据
shdaily = pd.DataFrame(shdata['close']) #提取收盘价列
ma_list = [5, 20] # 要绘制的均线列表
for ma in ma_list:
shdaily['ma_' + str(ma)] = shdaily['close'].rolling(ma).mean() #计算均线数据
plt.plot(shdaily['close'], '-', label = 'close',color = 'gray') #收盘价作图
for ma in ma_list:
plt.plot(shdaily['ma_' + str(ma)], '-', label = 'ma_' + str(ma)) #ma作图
plt.gcf().autofmt_xdate()
plt.legend() #显示图例
#plt.savefig('all.png')
plt.show()#显示图片
MACD与RSI图
MACD是平滑异同移动平均线(Moving Average Convergence / Divergence) 的缩写,为 Gerald Appel于1979年所创,包括两条线和1个柱形图共3种信号,分别为DIFF线、DEA线和MACD红绿柱线。当MACD从负数转向正数,是买的信号。当MACD从正数转向负数,是卖的信号。当MACD以大角度变化,表示快的移动平均线和慢的移动平均线的差距非常迅速的拉开,代表了一个市场大趋势的转变。
相对强弱指标(RSI)又叫力度指标,其英文全称为“Relative Strength Index”,由威尔斯•魏尔德所创造的,是目前股市技术分析中比较常用的中短线指标。RSI是一定时期内市场的涨幅与涨幅加上跌幅的比值,它是买卖力量在数量上和图形上的体现,投资者可根据其所反映的行情变动情况及轨迹来预测未来股价走势。在实践中,人们通常将其与移动平均线相配合使用,借以提高行情预测的准确性。
VOL是一个成交量指标,是指个股或者大盘一定时间内的成交数量,一般的炒股软件中都是指成交总手数(1手=100股)。成交量体现在炒股软件上就是一根竖着的柱子,成交量越大,柱子越高,反之越矮,成交量反映的就是一段时间内市场热不热闹,投资者交易的热情高不高。
MACD、RSI与成交量绘图代码如下:
data = shdata_beiyong
data=data.reset_index() #重置index
data=data.iloc[:,1:]
data["macd"], data["macd_signal"], data["macd_hist"] = talib.MACD(data['close']) #获取macd
data["ma8"] = talib.MA(data["close"], timeperiod=8) #获取8日均线
data["ma25"] = talib.MA(data["close"], timeperiod=25) #获取25日均线
data["rsi"] = talib.RSI(data["close"]) #获取rsi
fig = plt.figure() #创建绘图区,包含四个子图
fig.set_size_inches((20, 16))
ax_candle = fig.add_axes((0, 0.72, 1, 0.32)) #蜡烛图子图
ax_macd = fig.add_axes((0, 0.48, 1, 0.2), sharex=ax_candle) #macd子图
ax_rsi = fig.add_axes((0, 0.24, 1, 0.2), sharex=ax_candle) #rsi子图
ax_vol = fig.add_axes((0, 0, 1, 0.2), sharex=ax_candle) #成交量子图
ohlc = [] #存放数据,candlestick_ohlc需要传入固定格式的数据
row_number = 0
for date, row in data.iterrows():
date, openp, highp, lowp, closep = row[2:7]
ohlc.append([row_number, openp, highp, lowp, closep])
row_number = row_number + 1
date_tickers = data.date.values #获取Date数据
def format_date(x, pos=None): #数据在date这个位置传入的是int类型,使date_tickers是所有日期的字符串形式列表
if x < 0 or x > len(date_tickers) - 1:
return ''
return date_tickers[int(x)]
#绘制带均线的K线图
ax_candle.plot(data.index, data["ma8"], label="MA8")
ax_candle.plot(data.index, data["ma25"], label="MA25")
candlestick_ohlc(ax_candle, ohlc, colorup="g", colordown="r", width=0.8)
ax_candle.xaxis.set_major_formatter(ticker.FuncFormatter(format_date))
ax_candle.xaxis.set_major_locator(ticker.MultipleLocator(8)) #设置间隔为6个交易日
ax_candle.grid(True)
ax_candle.set_title("title", fontsize=20)
ax_candle.legend()
#绘制MACD
ax_macd.plot(data.index, data["macd"], label="macd")
ax_macd.bar(data.index, data["macd_hist"] * 3, label="hist")
ax_macd.plot(data.index, data["macd_signal"], label="DIF")
ax_macd.set_title('MACD')
ax_macd.legend()
#绘制RSI
ax_rsi.set_ylabel("(%)")
ax_rsi.plot(data.index, [70] * len(data.index), label="overbought")
ax_rsi.plot(data.index, [30] * len(data.index), label="oversold")
ax_rsi.plot(data.index, data["rsi"], label="rsi")
ax_rsi.set_title('rsi')
ax_rsi.legend()
#绘制成交量
ax_vol.bar(data.index, data["vol"] / 1000000)
ax_vol.set_ylabel("(Million)")
plt.show()