用python量化分析股市:画K线图

时间:2022-04-25 00:40:00

为了方便查看数据分析结果可视化,我们可以画出K线图。

K线图简介

股市及期货市场中的K线图的画法包含四个数据,即开盘价、最高价、最低价、收盘价,所有的k线都是围绕这四个数据展开,反映大势的状况和价格信息。如果把每日的K线图放在一张纸上,就能得到日K线图,同样也可画出周K线图、月K线图。

K线图这种图表源处于日本德川幕府时代,被当时日本米市的商人用来记录米市的行情与价格波动,后因其细腻独到的标画方式而被引入到股市及期货市场。目前,这种图表分析法在我国以至整个东南亚地区均尤为流行。由于用这种方法绘制出来的图表形状颇似一根根蜡烛,加上这些蜡烛有黑白之分,因而也叫阴阳线图表。通过K线图,我们能够把每日或某一周期的市况表现完全记录下来,股价经过一段时间的盘档后,在图上即形成一种特殊区域或形态,不同的形态显示出不同意义。我们可以从这些形态的变化中摸索出一些有规律的东西出来。K线图形态可分为反转形态、整理形态及缺口和趋向线等。

K线图形态

安装mplfinance库

mplfinance是python画K线图的扩展库,来自matplotlib.pyplot的扩展,版本改名升级多次。最新版本为"0.12.8b9"
pip安装命令:
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple mplfinance

导入画K线图相关模块

import mplfinance as mpf
import pandas as pd# 导入DataFrame数据,处理日期格式问题
import stock #导入股票数据接口模块,查看系列文章,源码文件附文后

读取股票数据

def 读取数据(股票代码,天数,截止日期):
# 导入股票数据
df = stock.读取csv数据(股票代码,天数,截止日期)
df.index.name="Date" #mplfinace默认索引名为"Date",这里需要改下索引名称
#默认绘K线图能识别的列表名为["Open","High","Low","Close","Volume"],这里对列名称分别改名。

df.rename( columns={"开盘价": "Open", "最高价": "High", "最低价": "Low", "收盘价": "Close", "成交量": "Volume"}, inplace=True)
# 索引转换为绘图能识别的日期格式
df.index = pd.to_datetime(df.index)
return df

# 导入数据
股票代码="000001"
天数 = 100
截止日期="20220312"
df = 读取数据(股票代码,天数,截止日期)
print(df)

设置基本参数


# type:绘制图形的类型,有candle, renko, ohlc, line等
# 此处选择candle,即K线图
# mav(moving average):均线参数,此处设置5,10,20日线
# volume:布尔类型,设置是否显示成交量,默认False
# datetime_format,设置日期显示格式
# title:设置标题
# y_label:设置纵轴主标题
# y_label_lower:设置成交量图一栏的标题
# figratio:设置图形纵横比
# figscale:设置图形尺寸(数值越大图像质量越高)

#绘图参数设置

绘图参数= dict(type="candle", mav=(5, 10, 20), volume=True, datetime_format="%Y-%m-%d",title="\n股票代码 %s K线图" % (股票代码), ylabel="股票蜡烛价格", ylabel_lower="成交量", figratio=(15, 10), figscale=10)

# 设置marketcolors
# up:设置K线线柱颜色,up意为收盘价大于等于开盘价
# down:与up相反,这样设置与国内K线颜色标准相符
# edge:K线线柱边缘颜色(i代表继承自up和down的颜色),下同。详见官方文档)
# wick:灯芯(上下影线)颜色
# volume:成交量直方图的颜色
# inherit:是否继承,选填
mc = mpf.make_marketcolors(
up="red",
down="black",
edge="i",
wick="i",
volume="in",
inherit=True)


# 设置图形风格
# gridaxis:设置网格线位置
# gridstyle:设置网格线线型
# y_on_right:设置y轴位置是否在右
s = mpf.make_mpf_style(gridaxis="both", grid, y_on_right=True, marketcolors=mc)

# 图形绘制
# show_nontrading:是否显示非交易日,默认False
# savefig:导出图片,填写文件名及后缀
mpf.plot(df, **绘图参数,style=s, show_nontrading=False)
mpf.show()

代码运行效果:

画K线图

源码格式如下:

stock.py数据接口源码:

import pandas as pd

code="002191" #股票代码
dayss=100 #截止日期之前天数
dayend="20220211" #截止日期
dbfile="E:\\炒股软件项目\\股票数据采集\\csvtodb20220312.db" #sqlite数据库存放位置
path="E:\\炒股软件项目\\股票数据采集\\沪深个股历史日线数据\\" #csv文件目录
myini={"用户名":"root","密码":"rootlizigushi","域名ip":"127.0.0.1","端口号":23306,"数据库名":"stockx"} #mysql数据库配置文件

def 读取csv数据(code,dayss,dayend):
date_end_str=dayend[0:4]+"-"+dayend[4:6]+"-"+dayend[6:8]
date_end = datetime.datetime.strptime(date_end_str, "%Y-%m-%d")
date_start = (date_end + datetime.timedelta(days=-dayss)).strftime("%Y-%m-%d")
date_end = date_end.strftime("%Y-%m-%d")
stock_X=pd.read_csv(path+code+".csv",usecols=["日期","开盘价","收盘价","最高价","最低价","成交量"],index_col="日期",encoding="gbk")
stock_X=stock_X.loc[(stock_X.index >= date_start) & (stock_X.index <= date_end )]
stock_X=stock_X.sort_index()
return stock_X




def 读取mysql数据(code,dayss,dayend):
date_end_str=dayend[0:4]+"-"+dayend[4:6]+"-"+dayend[6:8]
date_end = datetime.datetime.strptime(date_end_str, "%Y-%m-%d")
date_start = (date_end + datetime.timedelta(days=-dayss)).strftime("%Y-%m-%d")
date_end = date_end.strftime("%Y-%m-%d")
pymysql.install_as_MySQLdb()
dbstring="mysql+mysqldb://%(用户名)s:%(密码)s@%(域名ip)s:%(端口号)d/%(数据库名)s?charset=utf8" %(myini)
engine=create_engine(dbstring)
sql="select 日期,开盘价,收盘价,最高价,最低价,成交量 from eb_%s where 日期 >= "%s" and 日期 <= "%s"" %(code,date_start,date_end)
stock_X=pd.read_sql(sql,engine,index_col="日期")
stock_X=stock_X.sort_index()
return stock_X



def 读取sqlite数据(code,dayss,dayend):

date_end_str=dayend[0:4]+"-"+dayend[4:6]+"-"+dayend[6:8]
date_end = datetime.datetime.strptime(date_end_str, "%Y-%m-%d")
date_start = (date_end + datetime.timedelta(days=-dayss)).strftime("%Y-%m-%d")
date_end = date_end.strftime("%Y-%m-%d")
conn=sqlite3.connect(dbfile)
sql="select 日期,开盘价,收盘价,最高价,最低价,成交量 from eb_%s where 日期 >= "%s" and 日期 <= "%s"" %(code,date_start,date_end)
stock_X=pd.read_sql(sql,conn,index_col="日期")
stock_X=stock_X.sort_index()
conn.close()
return stock_X

stock.py源码格式如下:

举报/反馈