首页 今日头条 正文

【手把手教你】构建自身的量化分析数据表-www.betvictor31.com_伟德BETVICTOR下载-韦德体育betvictor官网

引 言

量化买卖的剖析根底是数据,包含股票前史买卖数据、上市公司基本面数据、微观和职业数据等。跟着信息流量的日益胀大,学会获取、查询和加工数据信息变得越来越重要。关于鼓捣量化买卖的人来说,怎样能说不会玩数据库呢?现在常用的开源(免费)数据库代拍汇有MySQL、Postgresql 、Mongodb 和 SQLite (Python自带),在2018-2019年DB-Engines 排行榜上位居前十(见下图),可见其运用量和受欢迎程度较高。这几个数据库各有自己的特色和适用环境,关于该学习哪一个或怎么学习网上有许多相关材料。本文主要为我们简略介绍怎么运用 Python 操作 Postgresql 数据库(其他数据库相似),运用 psycopg2 和 sqlalchemy 完成 postgresql 与 pandas 的 dataframe 进行交互,一步步树立自己的量化剖析数据库。

PostgreSQL的装置与运用

装置 PostgreSQL。到其官网挑选合适自己电脑装备的版别下载装置即可(下载地址),装置进程除了设置暗码,其他可挑选悉数默许,如真实不会可参阅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 进行装置即可。

1实例运用

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

#先引进后边剖析、可视化等或许用到的库
import tushare as ts
import pandas as pd
import numpy 【手把手教你】构建本身的量化剖析数据表-www.betvictor31.com_伟德BETVICTOR下载-韦德体育betvictor官网as np
impor黄金价格多少钱一克t 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_co释良卿de():
codes = pro.stock_basic(list_status='L').ts_code.values
return 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_exist魔法城堡s='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():
dat【手把手教你】构建本身的量化剖析数据表-www.betvictor31.com_伟德BETVICTOR下载-韦德体育betvictor官网a=get_data(code)
insert_sql(data,'stock_data')
#读取整张表数据
df=pd.read_sql('stock_data',engine)
print(len(df))
#输出成果:27099【手把手教你】构建本身的量化剖析数据表-www.betvictor31.com_伟德BETVICTOR下载-韦德体育betvictor官网8
#选取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}:{en360官网d}期间数据已成功更新')
#下载20180101-20181231期间数据
#只需运转一次,不再运转后能够注释掉
#下载数【手把手教你】构建本身的量化剖析数据表-www.betvictor31.com_伟德BETVICTOR下载-韦德体育betvictor官网据比较慢,需求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【手把手教你】构建本身的量化剖析数据表-www.betvictor31.com_伟德BETVICTOR下载-韦德体育betvictor官网())
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 Bar
from sqlalchemy import create_engine
engine = create_engine('postgresql+psycopg2://postgres:123456@localhost:5432/postgres')
data=pd.read_sql("select * from stock_data wwangyuyunhere+"+ condition,engine)
count_=data.gr戏精训练营oupby('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(excha【手把手教你】构建本身的量化剖析数据表-www.betvictor31.com_伟德BETVICTOR下载-韦德体育betvictor官网nge='', list_status='L')
df1 =p人类ro.daily_basic(trade_date=date)
df=p【手把手教你】构建本身的量化剖析数据表-www.betvictor31.com_伟德BETVICTOR下载-韦德体育betvictor官网d.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元股票excel排序
#df=df[df.close<20]
codes=df.ts_code.values
return 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:
pass
return 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_.close
except:
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_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_date春饼time(data.trade_date)
data=data.sort_index()
#核算20日均线
data['ma20']=data.close.rolling(20).mean()
return data

运用20日均线买卖战略,树立数据查询和可视化函数kline_plot(),完好代码将共享在常识星球上。对选出的股票日K线、20日均线、成交量、买入(buy)和卖出(sell)信号进行可视化。

kline_plot('002790.SZ')

kline_plot('300573.SZ')

结语

数据库操作其实要学的东西还许多,本文旨在抛砖引玉,简略介绍运用Python对PostgreSQL数据库与dataframe型数据进行交互,一步步树立自己的量化剖析数据库。因为文中用到的数据仅为百万条左右,实际上运用excel的csv来读写也很快,而且比较直观,但跟着数据的不断增多,要树立自己完善的量化剖析体系,数据库的学习就显得尤为重要了。留意,文中所提及选股方法和股票代码仅作为示例运用,不构成任何出资主张。

关于Python金融量化


专心于共享Python在金融量化范畴的运用。参加常识星球,能够免费获取30多g的量化出资视频材料、大众号文章Python完好源码、量化出资前沿剖析结构,与博主直接春天手抄报沟通、结识圈内朋友等。