千家信息网

Python中如何搭建自己的量化分析数据库

发表于:2026-11-03 作者:千家信息网编辑
千家信息网最后更新 2026年11月03日,本篇文章给大家分享的是有关Python中如何搭建自己的量化分析数据库,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。手把手教你搭建自己的量
千家信息网最后更新 2026年11月03日Python中如何搭建自己的量化分析数据库

本篇文章给大家分享的是有关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 tsimport pandas as pd import numpy as npimport matplotlib.pyplot as plt#正常显示画图时出现的中文和负号from pylab import mplmpl.rcParams['font.sans-serif']=['SimHei']mpl.rcParams['axes.unicode_minus']=False#设置tokentoken='输入你的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.values return codes

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

from sqlalchemy import create_engineimport psycopg2engine = 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,timedelta for 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;319d=df_all_data.trade_date.unique()print(d.max())print(d.min())2019-04-25T00:00:00.0000000002018-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 Bar from sqlalchemy import create_engine engine = 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_.index v1=count_.values bar=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.values return codeslen(get_new_code('20190425'))#输出结果:46import 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: pass return f_codefs=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_.close except: passselect_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_engine engine = 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来读写也很快,并且比较直观,但随着数据的不断增多,要建立自己完善的量化分析系统,数据库的学习就显得尤为重要。注意,文中所提及选股方式和股票代码仅作为示例应用,不构成任何投资建议。

以上就是Python中如何搭建自己的量化分析数据库,小编相信有部分知识点可能是我们日常工作会见到或用到的。希望你能通过这篇文章学到更多知识。更多详情敬请关注行业资讯频道。

数据 数据库 股票 交易 代码 分析 查询 个股 函数 时间 股价 更新 选出 可视化 学习 应用 重要 个数 交易日 均线 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 花魁咖啡 广州为想互联网科技有限公司 上海睿民互联网科技有限公司 互联网科技产业 互联网科技工作委员会副主任毛军 科技创新与互联网经济 互联网科技金融公司 互联网金融公司科技 广州善班互联网科技 火传媒上海互联网科技 成都仁贤领冠互联网科技有限公司 上海电发互联网科技有限公司 互联网科技产品 青岛中康互联网医疗科技有限公司 互联网金融中的现代科技 深圳育鹏互联网科技有限公司招聘 互联网在线教育科技创业 城市宝互联网科技有限公司 产业互联网科技服务公司 广西泛欧互联网科技有限公司 科技互联网技术 安徽鑫晟辉互联网科技 西安互联网科技公司 互联网和高科技公司 云创客互联网科技公司 互联网科技创新服务 民营互联网公司国防科技 企晟互联网信息科技有限公司 昆明中奇联合互联网科技 世界互联网科技成果奖
0