关系数据库SQLite ———初识股票数据
01
任务说明
SQLite 数据库是一款非常小巧的嵌入式关系开源数据库,它没有独立的维护进程,所有的维护都来自于程序本身。它占用资源非常低,在嵌入式设备中,只需要几百 KB 的内存,并且能够支持 Windows、Linux、UNIX 等主流的操作系统,同时能够跟很多程序语言相结合,比如Python、C# 、PHP、Java等。
02
任务展示
金融量化分析已成为金融从业者的必备技能之一。其中,数据又是其重要基础,包括股票历史交易数据、上市公司基本面数据、宏观和行业数据等。随着信息量的日益膨胀,学会获取、查询和加工数据信息变得越来越重要。然而,熟悉数据库操作又是数据处理的基石,接下来我们就从存、取数据入手吧!
存入 SQLite 数据库中的股票数据如图 8-1 所示,根据该数据绘制的 K 线图如图 8-2 所示。
■ 图 8-1 SQLiteExpert 中查看股票数据
■ 图 8-2  由股票数据绘制的 K 线图
03
任务实现
1
安装金融数据包
要对股票数据进行量化分析,首先需要有可靠的股票历史数据来源。综合对比市面流行的金融数据包,为了简化数据获取的流程,选择开源金融数据包 Tushare 来获取股票数据。
在 Python 中,要提前安装好 pandas 和 lxml 库,然后再安装 Tushare 库。Tushare 库可以通过 pip 命令在线完成安装。
安装 Tushare 库,在命令提示符窗口中输入命令:
Pip install tushare
2
获取股票 K 线数据
在 PyCharm 中新建工程 SQLStock ,并新建一个 Python 文件 SqliteHelp.py 。首先,输入如下代码,测试从 Tushare 库获取数据是否正常。
importtushare
asts
daily=
ts
.
get
_
k
_data(
"601398",
start=“
2019-12-01”,
end=“
2019-12-31”)
print
(daily)
结果数据包含 8 列,第 1 列为自动产生的 index ,之后是日期、开盘价、收盘价、最高价、最低价和成交量,最后 1 列为股票代码。ts.get _ k _ data 函数中只需输入主要的几个参数:第 1 个是股票代码,第 2 个是开始日期,第 3 个是结束日期。
以上程序段运行结果如图 8-3 所示。
■ 图 8-3  从 Tushare 获得的股票数据
3
编写 SQLite 数据库操作类
为了便于对数据库操作的统一管理,首先编写一个 SQLite 数据库操作类。在 SQLite 类的初始化构造方法中,通过 sqlite.connect ()产生数据库连接对象 self.conn ,再通过 self.conn.cursor ()获得游标对象 self.cursor 。
SQLite 类主要定义了数据库的几个基本操作函数。
(1 )建表 createTable (self ),这个操作一般只在第一次进行;表的结构由从 Tushare 库获取的股票数据特征决定,表名固定为“stock ”。为了防止重复数据加入表中,根据 sdate ,code 字段建立了表的唯一性索引。
(2 )插入数据方法 insert (self ,sql ,parm ),通过执行 SQL 语句,提交事务后完成。该函数通常需要用户传入两个参数。其一是 sql ,它表示要执行的 SQL 语句,另一个是 parm ,它代表 SQL语句中用到的实际参数值。
(3 )查询数据的方法 query (self ,sql ),也是通过执行指定的 SQL 语句来实现。
(4 )获取查询结果有两个函数。一个是 show ( self ),通过游标取得所有结果记录,另一个是showone ( self ),通过游标只取得一条结果记录。
(5 )最后一个是类的析构方法__ del __(),关闭数据库中的游标和连接。
编写一个 SQLite 数据库操作类,详细代码如下。
"""

Sqlite数据操作类

"""

import
 sqlite3
as
 sqlite

import
 os.path
as
 osp

import
 tushare
as
 ts


classSQLiteDB(object):
    conn =
''#连接对象
    cursor =
''#游标
def__init__(self, dbname):
try
:

            self.conn = sqlite.connect(osp.abspath(dbname))

except
 Exception
as
 what:

            print(what)

# sys.exit()
# self.conn.row_factory = sqlite.Row
        self.cursor = self.conn.cursor()

# 1.建表
defcreateTable(self):
# Id int PRIMARY KEY,
        sql=
'''create table stock

                    (

                    sdate date,

                    open float,

                    close float,

                    high float,

                    low FLOAT,

                    volume interger,

                    code varchar(10))

                   '''

        self.cursor.execute(sql)

        print(
"create table OK!"
)

###建立唯一性索引,防止出现重复数据
        sql =
"CREATE UNIQUE INDEX idx ON stock (sdate, code)"
        self.cursor.execute(sql)

        self.conn.commit()


# 2.插入数据
definsert(self, sql, parm):
        res=self.cursor.execute(sql, parm)

        self.conn.commit()
# 提交事物
return
 res


# 3.查询语句
defmyquery(self, sql):
try
:

            self.cursor.execute(sql)

            self.conn.commit()

except
 Exception
as
 what:

            print(what)


# 4.通过游标获取所有结果记录
defshow(self):
        re = self.cursor.fetchall()

return
 re


# 5.通过游标获取一条结果记录,并将游标指向下一条记录
defshowone(self):
return
 self.cursor.fetchone()

# 6.断开连接
def__del__(self):
        self.cursor.close()
#关闭游标
        self.conn.close()
#关闭连接
        print(
'DB closed!'
)
4
股票 K 线数据存入 SQLite 数据库
直接在 SqliteHelp.py 中添加股票数据入库的程序。操作步骤如下。
(1 )采用语句 SQLiteDB('D :/ mystock.db ')实例化 SQLite 类对象。其中,' D :/ mystock.db '是新建的数据库名称。
(2 )调用建表函数 db.createTable (),完成数据库中表的建立,由于表只需要建立一次,所以表名放在了 SQLiteDB 类中,命名为“stock ”。
(3 )通过 tushare 获取历史数据。
(4 )对 tushare 的数据做简单的格式转换,遍历后取出每一行,转换为列表类型。
(5 )SQL 采用 replace 语句而不是 insert 语句,主要是因为表在定义时限制了唯一性,防止插入数据重复。
(6 )最后,将参数 doc 及 SQL 语句传入 SQLiteDB 类中的 insert 函数,完成数据入库操作股票 K 线数据存入 SQLite 数据库,程序代码如下。
if
 __name__==
'__main__'
:

###1.建立连接数据库
    db = SQLiteDB(
'D:/mystock.db'
)

## 2.建立表
    db.createTable()


# #####3.通过tushare获取数据
    daily = ts.get_k_data(
"000001"
, index=
True
, start=
"2019-12-01"
, end=
"2019-12-31"
)

print
(daily)

for
 row in daily.index:

        doc =
list
(daily.loc[row])

# sql="insert into stock2 values (?,?,?,?,?,?,?)"
# db.insert(sql,doc)#插入记录
#避免重复插入
        sql=
'replace into stock values(?,?,?,?,?,?,?)'
        db.insert(sql, doc)
# 插入记录
5
采用 SQLiteExpert 查看股票历史数据
在“开始”菜单中找到 SQLiteExpert ,打开程序窗口,通过菜单栏的 File→OpenDatabase 打开数据库 mystock.db ,展开左边的目录结构,可看到之前建好的表 stock 。双击该表,则在右边主窗体显示采集到的股票数据,显示结果如图 8-4 所示。
■ 图 8-4 SQLiteExpert 中查看数据
6
绘制 K 线图
在 PyCharm 中新建 Python 文件 AnalyStock.py ,从数据库中读取指定数据,并绘制 K 线图。绘制 K 线图主要用到 mpl _ finance 库。
该程序首先实例化一个 SQLiteDB 对象,连接数据库,然后通过 SQL 语句查询指定股票代码为“sh000001 ”的历史数据,再将结果数据格式整理,最后通过绘图函数 plotkline 绘制 K 线图。
绘图函数 plotkline 中,先是设置图像的 X 、 Y 坐标以及标题等基本信息,然后调用函数 mpf.candlestick _ ohlc 实现绘图,此函数的一个关键输入参数是 data _ list 。data _ list 要求是一个由 tuple构成的列表,每个 tuple 又由日期、开盘价、最高价、最低价、收盘价构成。
详细代码如下。
from
 SqliteHelp
import
 SQLiteDB

import
 tushare
as
 ts

import
 matplotlib.pyplot
as
 plt
## 导入画图模块
import
 mpl_finance
as
 mpf
## 导入 mplfinance 模块
import
 sqlite3
as
 sqlite

from
 datetime
import
 datetime
# 导入datetime模块,和直接import datetime是不同的模块
from
 matplotlib.pylab
import
 date2num
## 导入日期到数值一一对应的转换工具
# from pandas.plotting import register_matplotlib_converters
###绘制K线图的函数
defplotkline(title,data_list):
    plt.rcParams[
'font.family'
] =
'SimHei'## 设置字体
    fig, ax1 = plt.subplots(
1
,
1
,sharex=
True
)
## 创建图片和坐标轴
    fig.subplots_adjust(bottom=
0.2
)
## 调整底部距离
    ax1.xaxis_date()
## 设置X轴刻度为日期时间
    plt.xticks(rotation=
45
)
## 设置X轴刻度线并旋转45度
    plt.yticks()
## 设置Y轴刻度线
    plt.title(
"股票代码"
+title+
" K线图"
)
##设置图片标题
    plt.xlabel(
"时间"
)
##设置X轴标题
    plt.ylabel(
"股价(元)"
)
##设置Y轴标题
    plt.grid(
True
,
'major'
,
'both'
, ls=
'--'
, lw=
.5
, c=
'k'
, alpha=
.3
)
##设置网格线
    mpf.candlestick_ohlc(ax1, data_list, width=
0.7
, colorup=
'r'
, colordown=
'green'
, alpha=
1
)
##设置利用mpf画股票K线图
    plt.show()
## 显示图片
    plt.close()
## 关闭plt,释放内存
##1.建立连接数据库
db = SQLiteDB(
'D:/mystock.db'
)

##2.用sqlite类读取数据
sql=
"select sdate,open,high,low,close from stock where code='sh000001'"
db.myquery(sql)

res=db.show()

print(res)

##3.按照绘制蜡烛图的函数要求构造对应参数
listk=[]

for
 rr
in
 res:

    bk = rr[
0
]

    yy = datetime.strptime(bk,
'%Y-%m-%d'
)
# 字符串转换为时间格式
    timestamp = date2num(yy)
#转为需要的格式
    rr=(timestamp,)+rr[
1
:]

    listk.append(rr)

##4.绘制K线图
# register_matplotlib_converters()
plotkline(
"sh000001"
,listk)
以上程序段运行结果如图 8-5 所示。
■ 图 8-5  由股票数据绘制的 K 线图
03
源代码下载
关注微信公众号,后台回复关键词 “初始股票” 即可获得完整源代码。
04
参考书籍
Python边做边学-微课视频版
ISBN:978-7-302-56793-6
陈秀玲 田荣明 冉涌 主编
定价:49.8元
内容简介
本书采用项目化教程的模式,以理论讲解与实战案例演练相结合的方式,以知识点为主线,将每个项目按照知识点拆解分为多个任务,每个任务均以充满趣味性的游戏入手,系统、全面、循序渐进地讲解Python知识点,使读者能够学以致用,融会贯通。全书共分为8个项目,分别是认识新朋友(Python)、开启编程之旅、高级编程之路、叩开面向对象编程之门、异常处理、Python图形界面设计、网络爬虫和使用Python操作数据库。本书的每个知识点都有相应的实现代码,并配有详细的注释说明,便于读者快速理解和掌握。
本书适合零基础的读者,也可作为高等院校的教材,还可供相关领域的广大科研人员、从事大数据分析、数据爬取或深度学习的专业人员等作为参考书使用。
05
精彩推荐
继续阅读
阅读原文