Python学习教程:手把手教你搭建自己的量化分析数据库

引言:

数据是金融量化分析的重要基础,包括股票历史交易数据、上市公司基本面数据、宏观和行业数据等。随着信息流量的日益膨胀,学会获取、查询和加工数据信息变得越来越重要。对于鼓捣量化交易的人来说,怎么能说不会玩数据库呢?目前常用的开源(免费)数据库有MySQL、Postgresql 、Mongodb 和 SQLite (Python自带),在2018-2019年DB-Engines 排行榜上位居前十(见下图),可见其使用量和受欢迎程度较高。这几个数据库各有自己的特点和适用环境,关于该学习哪一个或如何学习网上有很多相关资料。本文主要为大家简单介绍如何使用 Python 操作 Postgresql 数据库(其他数据库类似),利用 psycopg2 和 sqlalchemy 实现 postgresql 与 pandas 的 dataframe 进行交互,一步步搭建自己的量化分析数据库


PostgreSQL的安装与使用

安装 PostgreSQL。到其官网选择适合自己电脑配置的版本下载安装即可,安装过程除了设置密码(本文设置为“123456”),其他可选择全部默认,如实在不会可参考CSDN上的文章:PostgreSQL安装详细步骤(windows)。安装完之后在安装目录里还可以看到pgAdmin4,这个是自带的数据库图形化工具,最新版是Web 应用程序,有点类似 Python 的 Jupyter Notebook,可用来查看和操作postgresql 数据库。

Python上安装psycopg2 和 sqlalchemy 库。psycopg2 是 Python 连接PostgreSQL数据库的接口,sqlalchemy 应用更广泛,可连接数据库(MySQL, SQLite, PostgreSQL),尤其是对于 pandas 的dataframe型数据,操作起来十分方便。关于这两个 python 库的介绍网上有很多,这里不详细展开,在cmd上使用pip install xxx 进行安装即可。

实例应用

首先,使用 tushare 获取3000多只股票行情数据到本地,使用psycopg2 和 sqlalchemy 为接口,将数据存入本地PostgreSQL数据库中,方便进一步查询和操作。

#先引入后面分析、可视化等可能用到的库
import tushare as ts
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
#正常显示画图时出现的中文和负号
from pylab import mpl
mpl.rcParams['font.sans-serif']=['SimHei']
mpl.rcParams['axes.unicode_minus']=False
#设置token
token='输入你的token'
pro = ts.pro_api(token)
复制代码

数据获取函数,默认时间可以随时改动。

#如果报错,把tushare升级到最新
def get_data(code,start='20190101',end='20190425'):df=ts.pro_bar(ts_code=code, adj='qfq', start_date=start, end_date=end)return df
股票代码获取函数,获取最新交易日的代码。
#获取当前交易日最新的股票代码和简称
def get_code():codes = pro.stock_basic(list_status='L').ts_code.valuesreturn codes
复制代码

插入PostgreSQL 数据库操作,函数里使用了try…except…pass是为了避免某些数据出错导致程序崩溃。

from sqlalchemy import create_engine
import psycopg2
engine = create_engine('postgresql+psycopg2://postgres:123456@localhost:5432/postgres')
def insert_sql(data,db_name,if_exists='append'):#使用try...except..continue避免出现错误,运行崩溃try:data.to_sql(db_name,engine,index=False,if_exists=if_exists)#print(code+'写入数据库成功')except:pass
复制代码

由于行情数据量庞大,下载比较慢,先下载20190101至20190425期间日交易

数据,后续再不断更新。

#下载20190101-20190425数据并插入数据库stock_data
#此步骤比较耗费时间,大致25-35分钟左右
for code in get_code():data=get_data(code)insert_sql(data,'stock_data')
#读取整张表数据
df=pd.read_sql('stock_data',engine)
print(len(df))
#输出结果:270998
#选取ts_code=000001.SZ的股票数据
df=pd.read_sql("select * from stock_data where ts_code='000001.SZ'",engine)
print(len(df))
复制代码

构建一个数据更新函数,可以下载和插入其他时间周期的数据。2018年1月1日至2019年4月25日,数据就已达到108万条。

#更新数据或下载其他期间数据
def update_sql(start,end,db_name):from datetime import datetime,timedeltafor code in get_code():data=get_data(code,start,end)insert_sql(data,db_name)print(f'{start}:{end}期间数据已成功更新')
#下载20180101-20181231期间数据
#只需运行一次,不再运行后可以注释掉
#下载数据比较慢,需要20-35分钟左右
start='20180101'
end='20181231'
db_name='stock_data'
#数据下载和存入数据库
update_sql(start,end,db_name)
#使用pandas的read_sql读取数据
df_all_data=pd.read_sql('stock_data',engine)
print(len(df_all_data))
#输出结果:1087050
#查看交易代码和交易日期个数
print(len(df_all_data.ts_code.unique()))
print(len(df_all_data.trade_date.unique()))
#输出结果:3604;319
d=df_all_data.trade_date.unique()
print(d.max())
print(d.min())
2019-04-25T00:00:00.000000000
2018-01-02T00:00:00.000000000
#获取交易日2019年4月25日数据
pd.read_sql("select * from stock_data where trade_date='2019-04-25' ",engine).head()
复制代码

构建数据查询和可视化函数:
def plot_data(condition,title):from pyecharts import Barfrom sqlalchemy import create_engineengine = create_engine('postgresql+psycopg2://postgres:123456@localhost:5432/postgres')data=pd.read_sql("select * from stock_data where+"+ condition,engine)count_=data.groupby('trade_date')['ts_code'].count()attr=count_.indexv1=count_.valuesbar=Bar(title,title_text_size=15)bar.add('',attr,v1,is_splitline_show=False,linewidth=2)return bar
查询股价低于2元个股数据分布
c1="close<2"
t1="股价低于2元个股时间分布"
plot_data(c1,t1)
复制代码

查询股价日涨幅超过9.5%个股数据分布:

c2="pct_chg>9.5"
t2="股价涨幅超过9.5%个股时间分布"
plot_data(c2,t2)
复制代码

查询股价日跌幅超过-9.5%个股数据分布:

c3="pct_chg<-9.5"
t3="股价跌幅超过-9.5%个股时间分布"
plot_data(c3,t3)
复制代码

结合选股策略对数据库进行查询和提取数据:

#筛选代码
#获取当前交易的股票代码和名称
def get_new_code(date):#获取当前所有交易股票代码df0 = pro.stock_basic(exchange='', list_status='L')df1 =pro.daily_basic(trade_date=date)df=pd.merge(df0,df1,on='ts_code')#剔除2017年以后上市的新股次新股df=df[df['list_date'].apply(int).values<20170101]#剔除st股df=df[-df['name'].apply(lambda x:x.startswith('*ST'))]#剔除动态市盈率为负的df=df[df.pe_ttm>0]#剔除大市值股票df=df[df.circ_mv<10**5]#剔除价格高于20元股票#df=df[df.close<20]codes=df.ts_code.valuesreturn codes
len(get_new_code('20190425'))
#输出结果:46
import talib as ta
#20日均线交易策略
def find_stock(date):f_code=[]for code in get_new_code(date):try:data=df_all_data.loc[df_all_data.ts_code==code].copy()data.index=pd.to_datetime(data.trade_date)data=data.sort_index()data['ma_20']=ta.MA(data.close,timeperiod=20)if data.iloc[-1]['close']>data.iloc[-1]['ma_20']:f_code.append(code)except:passreturn f_code
fs=find_stock('20190305')
print(f'筛选出的股票个数:{len(fs)}')
if fs:df_find_stocks=pd.DataFrame(fs,columns=['ts_code'])#将选出的股票存入数据库,如果表已存在,替换掉,相当于每次更新insert_sql(df_find_stocks,'find_stocks',if_exists='replace')print('筛选的股票已入库')
筛选出的股票个数:9
筛选的股票已入库
#查看数据库中筛选的股票池
codes=pd.read_sql('find_stocks',engine)
codes=codes.values.tolist()
codes=[c[0] for c in codes]
#print(codes)
复制代码

对筛选的股票作进一步分析:

select_data=pd.DataFrame()
for code in codes:try:df_= df_all_data[df_all_data.ts_code.values==code]df_.index=pd.to_datetime(df_.trade_date)df_=df_.sort_index()select_data[code]=df_.closeexcept:pass
select_data.fillna(method='ffill',inplace=True)
select_data.tail()
ret=select_data.apply(lambda x:x/x.shift(1)-1)
ret=ret.dropna()
ret.tail()
prod_ret=ret.apply(lambda x:(1+x).cumprod())
prod_ret.plot(figsize=(12,5))
plt.xlabel('',fontsize=15)
plt.title('股票池累计净值',size=15)
ax = plt.gca()
ax.spines['right'].set_color('none')
ax.spines['top'].set_color('none')
plt.show()
复制代码

#根据代码从数据库中获取数据
def get_data_from_sql(code):from sqlalchemy import create_engineengine = create_engine('postgresql+psycopg2://postgres:123456@localhost:5432/postgres')data=pd.read_sql(f"select * from stock_data where ts_code='{code}'",engine)data.index=pd.to_datetime(data.trade_date)data=data.sort_index()#计算20日均线data['ma20']=data.close.rolling(20).mean()return data
复制代码

利用20日均线交易策略,搭建数据查询和可视化函数kline_plot(),完整代码将分享在知识星球上。对选出的股票日K线、20日均线、成交量、买入(buy)和卖出(sell)信号进行可视化,下面以002790.和300573股票的K线图为例。

kline_plot('002790.SZ')
复制代码

kline_plot('300573.SZ')
复制代码


结语

数据库操作其实要学的东西还很多,本文旨在抛砖引玉,简单介绍使用Python 对 PostgreSQL 数据库与 dataframe 型数据进行交互,一步步搭建自己的量化分析数据库。由于文中用到的数据仅为百万条左右,实际上使用excel的csv来读写也很快,并且比较直观,但随着数据的不断增多,要建立自己完善的量化分析系统,数据库的学习就显得尤为重要。注意,文中所提及选股方式和股票代码仅作为示例应用,不构成任何投资建议。

凡事要趁早,特别是技术行业,一定要提升技术功底。

其实每个程序员也能意识到目前自己面临的窘境,但能够及时作出改变,顺应时代变化的人太少了。毕竟更多人的情况是,忙着上班,也没人引路,自己也不太会规划。多数人明明“泰山崩于前,而面色如土”只能眼睁睁看着自己被行业淘汰吗?

点此免费领取:CSDN大礼包:《python学习路线&全套学习资料》免费分享

包括一些面试真题和一些学习资料,这些资料对于学习软件测试的小伙伴来说是一个很完整的宝库了,也帮助了不少学习软件测试的小伙伴。

Python学习大纲

Python所有方向的技术点做的整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照上面的知识点去找对应的学习资源,保证自己学得较为全面。

入门学习视频

Python实战案例

光学理论是没用的,要学会跟着一起敲,要动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。


这份完整版的Python全套学习资料已经上传CSDN,朋友们如果需要可以微信扫描下方CSDN官方认证二维码免费领取【保证100%免费】

Python学习教程:手把手教你搭建自己的量化分析数据库相关推荐

  1. 手把手教你搭建 ELK 实时日志分析平台

    来自:武培轩 本篇文章主要是手把手教你搭建 ELK 实时日志分析平台,那么,ELK 到底是什么呢? ELK 是三个开源项目的首字母缩写,这三个项目分别是:Elasticsearch.Logstash ...

  2. 大数据江湖之即席查询与分析(下篇)--手把手教你搭建即席查询与分析Demo

    上篇小弟分享了几个"即席查询与分析"的典型案例,引起了不少共鸣,好多小伙伴迫不及待地追问我们:说好的"手把手教你搭建即席查询与分析Demo"啥时候能出?说到就得 ...

  3. Python学习教程:教你用Python通过微信来控制电脑摄像头

    如果说强大的标准库奠定了Python发展的基石,丰富的第三方库则是python不断发展的保证.今天的Python学习教程就来通过itchart库来实现通过微信对电脑的一些操作. 1.安装库 安装itc ...

  4. Python学习教程之算法讲解:深入浅出Apriori关联分析算法

    在美国有这样一家奇怪的超市,它将啤酒与尿布这样两个奇怪的东西放在一起进行销售,并且最终让啤酒与尿布这两个看起来没有关联的东西的销量双双增加.这家超市的名字叫做沃尔玛. 你会不会觉得有些不可思议?虽然事 ...

  5. python学习之手把手教你将图片变成黑白或彩色字符画(骚操作)

    文章目录 前言 一.字符画的实现原理 二.黑白字符画实现代码 三.彩色字符画生成 代码实现: 总结 前言 字符画这个话题,似乎早在贴吧时代就已经被玩烂了.在百度图片随便一搜索,就能够看到非常多.然后在 ...

  6. 阿里云服务器使用教程手把手教你搭建网站by阿里云服务器

    阿里云服务器使用教程是用户比较关心的问题,其实很简单,阿里云百科告诉大家如何使用云服务器ECS,如何使用阿里云服务器搭建网站,从服务器购买到网站上线一站式教程: 阿里云服务器购买方面,阿里云百科建议大 ...

  7. hMailServer 使用教程 —— 手把手教你搭建自己的邮箱服务器

    前言 假设你已经拥有了一台具有公网ip的服务器,以及域名 hMailServer 介绍 hMailServer 适用于 Windows 操作系统,它除了提供邮箱系统需要的所有基础功能之外,还内置了一些 ...

  8. python代码在哪里写_【初学者入】在哪敲Python代码?手把手教你搭建环境

    跃跃欲试想敲行代码却一头雾水不知如何开始?不用怕,作者也是从这里开始的. 大家可以在两种地方写程序.一种是本地的环境(IDE),你需要下载一个软件,在软件上写代码.另外一种是线上的IDE,你需要创建一 ...

  9. Python安装教程-手把手教你安装python

    python介绍和安装步骤 1. Python简介 Python是一种广泛使用的解释型.高级和通用的编程语言.Python支持多种编程范型,包括函数式.指令式.结构化.面向对象和反射式编程.它拥有动态 ...

最新文章

  1. 面了一个47的程序员,我很慌...
  2. python入门学习[看漫画学Python:有趣、有料、好玩、好用读书笔记]
  3. 《FPGA入门教程》看书随笔——RTL设计
  4. 登录表单 参考新浪微博
  5. 数据结构杂谈(五)——栈
  6. 从Airbnb的发展历程和网易云的大起大落看IT行业创新(第5周课后作业)
  7. pytorch中CrossEntropyLoss和NLLLoss的区别与联系
  8. 透传模式(透明传输SeriaNet)详解
  9. 利用 Python 预测英雄联盟胜负,分析了 5 万多场比赛才得出的数据!
  10. TCP 三次握手和四次挥手详解
  11. vulkan 利用GPU加速ENet
  12. HDU 3729【二分匹配】
  13. 微软Win11与万物互联时代新系统需求更加迫切
  14. 与上司同事的谈话技巧
  15. 点云公开数据集:S3DIS
  16. 51nod 1431 快乐排队
  17. 20190123——一气化三清 Java中介者模式
  18. 汇川PLC和PLC之间ModebusTCP通讯
  19. 黑链是什么意思,什么是黑链?
  20. 卡内基梅隆 计算机音乐,音乐留学 | 卡内基梅隆音乐技术专业和申请要求详解!...

热门文章

  1. java网络编程 UDP通信协议实现局域网内文件的发送和接收
  2. 2021年安全员-A证考试技巧及安全员-A证试题及解析
  3. 【Java】零基础学习Java需要多久?
  4. Android MediaCodec简单总结
  5. ajax学习笔记3-jQuery实现ajax(大拇指向上)
  6. Laplace transformation
  7. ubuntu-查看本机的ip地址
  8. iview tabs 选项卡设置自定义样式
  9. Hexo 主题配置 - Icarus
  10. 微信小程序入门资料,学习资料汇总