python程序化 k线指定时间更新_Python获取股票历史、实时数据与更新到数据库
要做量化投资,数据是基础,正所谓“巧妇难为无米之炊”
在免费数据方面,各大网站的财经板块其实已提供相应的api,如新浪、雅虎、搜狐。。。可以通过urlopen相应格式的网址获取数据
而TuShare正是这么一个免费、开源的python财经数据接口包,已将各类数据整理为dataframe类型供我们使用。
主要用到的函数:
1.实时行情获取
tushare.get_today_all()
一次性获取当前交易所有股票的行情数据(如果是节假日,即为上一交易日,结果显示速度取决于网速)
2.历史数据获取
tushare.get_hist_data(code, start, end,ktype, retry_count,pause)
参数说明:
code:股票代码,即6位数字代码,或者指数代码(sh=上证指数 sz=深圳成指 hs300=沪深300指数 sz50=上证50 zxb=中小板 cyb=创业板)
start:开始日期,格式YYYY-MM-DD
end:结束日期,格式YYYY-MM-DD
ktype:数据类型,D=日k线 W=周 M=月 5=5分钟 15=15分钟 30=30分钟 60=60分钟,默认为D
retry_count:当网络异常后重试次数,默认为3
pause:重试时停顿秒数,默认为0
具体可参考官网http://tushare.org/index.html
而如果要进行完备详细的回测,每次在线获取数据无疑效率偏低,因此还需要入库
下面是数据库设计部分
表1:stocks
股票表,第一列为股票代码,第二列为名称,如果get_today_all()中存在的股票stocks表中没有,则插入之。
表2:hdata_date
日线表,由于分钟线只能获取一周内的数据,我们先对日线进行研究。
字段和get_hist_data返回值基本一致,多了stock_code列,并将record_date列本来是dataframe的index
stock_code,record_date, //主键
open,high,close,low, //开盘,最高,收盘,最低
volume, //成交量
price_change,p_change, //价差,涨幅
ma5,ma10,ma20 //k日收盘均价
v_ma5,v_ma10,v_ma20, //(k日volume均值)
turnover //换手率
python工程目前有3个文件,main.py(主程序),Stocks.py(“股票们”类)以及Hdata.py(历史数据类)
main.py
import psycopg2 #使用的是PostgreSQL数据库
importtushare as tsfrom Stocks import*
from HData import*
importdatetime
stocks=Stocks("postgres","123456")
hdata=HData("postgres","123456")#stocks.db_stocks_create()#如果还没有表则需要创建#print(stocks.db_stocks_update())#根据todayall的情况更新stocks表
#hdata.db_hdata_date_create()
nowdate=datetime.datetime.now().date()
codestock_local=stocks.get_codestock_local()
hdata.db_connect()#由于每次连接数据库都要耗时0.0几秒,故获取历史数据时统一连接
for i inrange(0,len(codestock_local)):
nowcode=codestock_local[i][0]#print(hdata.get_all_hdata_of_stock(nowcode))
print(i,nowcode,codestock_local[i][1])
maxdate=hdata.db_get_maxdate_of_stock(nowcode)print(maxdate, nowdate)if(maxdate):if(maxdate>=nowdate):#maxdate小的时候说明还有最新的数据没放进去
continuehist_data=ts.get_hist_data(nowcode, str(maxdate+datetime.timedelta(1)),str(nowdate), 'D', 3, 0.001)
hdata.insert_perstock_hdatadate(nowcode, hist_data)else:#说明从未获取过这只股票的历史数据
hist_data = ts.get_hist_data(nowcode, None, str(nowdate), 'D', 3, 0.001)
hdata.insert_perstock_hdatadate(nowcode, hist_data)
hdata.db_disconnect()
Stocks.py
importtushare as tsimportpsycopg2class Stocks(object):#这个类表示"股票们"的整体(不是单元)
defget_today_all(self):
self.todayall=ts.get_today_all()def get_codestock_local(self):#从本地获取所有股票代号和名称
conn = psycopg2.connect(database="wzj_quant", user=self.user, password=self.password, host="127.0.0.1",
port="5432")
cur=conn.cursor()#创建stocks表
cur.execute('''select * from stocks;''')
rows=cur.fetchall()
conn.commit()
conn.close()returnrowspass
def __init__(self,user,password):#self.aaa = aaa
self.todayall=[]
self.user=user
self.password=passworddef db_perstock_insertsql(self,stock_code,cns_name):#返回的是插入语句
sql_temp="insert into stocks values("sql_temp+="\'"+stock_code+"\'"+","+"\'"+cns_name+"\'"sql_temp+=");"
returnsql_temppass
def db_stocks_update(self):#根据gettodayall的情况插入原表中没的。。gettodayall中有的源表没的保留不删除#返回新增行数
ans=0
conn= psycopg2.connect(database="wzj_quant", user=self.user, password=self.password, host="127.0.0.1", port="5432")
cur=conn.cursor()
self.get_today_all()for i inrange(0,len(self.todayall)):
sql_temp='''select * from stocks where stock_code='''sql_temp+="\'"+self.todayall["code"][i]+"\';"cur.execute(sql_temp)
rows=cur.fetchall()if(len(rows)==0):#如果股票代码没找到就插
ans+=1cur.execute(self.db_perstock_insertsql(self.todayall["code"][i],self.todayall["name"][i]))passconn.commit()
conn.close()print("db_stocks_update finish")returnansdefdb_stocks_create(self):
conn= psycopg2.connect(database="wzj_quant", user=self.user, password=self.password, host="127.0.0.1", port="5432")
cur=conn.cursor()#创建stocks表
cur.execute('''drop table if exists stocks;
create table stocks(stock_code varchar primary key,cns_name varchar);''')
conn.commit()
conn.close()print("db_stocks_create finish")pass
HData.py
importpsycopg2importtushare as tsimportpandas as pdfrom time importclockclassHData(object):def __init__(self,user,password):#self.aaa = aaa
self.hdata_date=[]
self.user=user
self.password=password
self.conn=None
self.cur=Nonedefdb_connect(self):
self.conn= psycopg2.connect(database="wzj_quant", user=self.user, password=self.password, host="127.0.0.1",
port="5432")
self.cur=self.conn.cursor()defdb_disconnect(self):
self.conn.close()defdb_hdata_date_create(self):
conn= psycopg2.connect(database="wzj_quant", user=self.user, password=self.password, host="127.0.0.1",
port="5432")
cur=conn.cursor()#创建stocks表
cur.execute('''drop table if exists hdata_date;
create table hdata_date(stock_code varchar,record_date date,
open float,high float,close float,low float,
volume float,
price_change float,p_change float,
ma5 float,ma10 float,ma20 float,
v_ma5 float,v_ma10 float,v_ma20 float,
turnover float
);
alter table hdata_date add primary key(stock_code,record_date);''')
conn.commit()
conn.close()print("db_hdata_date_create finish")pass
def db_get_maxdate_of_stock(self,stock_code):#获取某支股票的最晚日期
self.cur.execute("select max(record_date) from hdata_date where stock_code="+"\'"+stock_code+"\'"+";")
ans=self.cur.fetchall()if(len(ans)==0):returnNonereturnans[0][0]
self.conn.commit()pass
def insert_perstock_hdatadate(self,stock_code,data):#插入一支股票的所有历史数据到数据库#如果有code和index相同的不重复插入
t1=clock()for i inrange(0,len(data)):
str_temp=""str_temp+="\'"+stock_code+"\'"+","str_temp+="\'"+data.index[i]+"\'"
for j in range(0,data.shape[1]):
str_temp+=","+"\'"+str(data.iloc[i,j])+"\'"sql_temp="values"+"("+str_temp+")"self.cur.execute("insert into hdata_date"+sql_temp+";")
self.conn.commit()print(clock()-t1)print(stock_code+"insert_perstock_hdatadate finish")def get_all_hdata_of_stock(self,stock_code):#将数据库中的数据读取并转为dataframe格式返回
conn = psycopg2.connect(database="wzj_quant", user=self.user, password=self.password, host="127.0.0.1",
port="5432")
cur=conn.cursor()
sql_temp="select * from hdata_date where stock_code="+"\'"+stock_code+"\';"cur.execute(sql_temp)
rows=cur.fetchall()
conn.commit()
conn.close()
dataframe_cols=[tuple[0] for tuple in cur.description]#列名和数据库列一致
df = pd.DataFrame(rows, columns=dataframe_cols)returndfpass
main.py的控制台输出示例:
HData中的函数get_all_hdata_of_stock结果示例:
stock_code record_date open high close low volume \
0 603999 2015-12-10 14.07 14.07 14.07 14.07 337.00
1 603999 2015-12-11 15.48 15.48 15.48 15.48 119.00
2 603999 2015-12-14 17.03 17.03 17.03 17.03 267.00
3 603999 2015-12-15 18.73 18.73 18.73 18.73 244.00
.. ... ... ... ... ... ... ...
397 603999 2017-08-01 9.62 9.97 9.79 9.61 36337.80
398 603999 2017-08-02 9.80 9.85 9.61 9.59 32135.60
price_change p_change ma5 ma10 ma20 v_ma5 v_ma10 \
0 4.30 44.01 14.070 14.070 14.070 337.00 337.00
1 1.41 10.02 14.775 14.775 14.775 228.00 228.00
2 1.55 10.01 15.527 15.527 15.527 241.00 241.00
3 1.70 9.98 16.328 16.328 16.328 241.75 241.75
.. ... ... ... ... ... ... ...
397 0.16 1.66 9.680 9.709 9.924 36754.46 49436.88
398 -0.18 -1.84 9.698 9.741 9.863 36513.38 49998.51
v_ma20 turnover
0 337.00 0.06
1 228.00 0.02
2 241.00 0.04
3 241.75 0.04
.. ... ...
397 42602.09 1.58
398 42114.31 1.39
数据库中的数据示例
stocks表
hdata_date表
python程序化 k线指定时间更新_Python获取股票历史、实时数据与更新到数据库相关推荐
- python程序化 k线指定时间更新_Python之路 14 K线时间序列管理器
在上一章中介绍了如何通过实时行情推送的Tick数据合成1分钟K线,并且如何通过1分钟K线来合成更大周期的K线.本章主要介绍如何将K线通过numpy缓存到Array,形成时间序列,并且同时生成一些技术指 ...
- python程序化 k线指定时间更新_Python项目Keylogger(定时器)
一.代码 keylogger.py文件 #!/usr/bin/env python import smtplib import threading from pynput import keyboar ...
- python绘制k线图的步骤_Python使用PyQtGraph绘制股票行情K线图
PyQtGraph是Python平台上一种功能强大的2D/3D绘图库,相对于matplotlib库,由于其在内部实现方式上,使用了高速计算的numpy信号处理库以及Qt的GraphicsView框架, ...
- python处理行情数据_Python获取股票历史、实时数据与更新到数据库
要做量化投资,数据是基础,正所谓"巧妇难为无米之炊" 在免费数据方面,各大网站的财经板块其实已提供相应的api,如新浪.雅虎.搜狐...可以通过urlopen相应格式的网址获取数据 ...
- python 画k线图_matplotlib画k线图
画k线需要的包和环境: python36 import tushare as ts import re import matplotlib.pyplot as plt import mpl_finan ...
- python画k线图_Python绘制K线图
不管是对量化分析师还是普通的投资者来说,K线图(蜡烛图)都是一种很经典.很重要的工具.在K线图中,它会绘制每天的最高价.最低价.开盘价和收盘价,这对于我们理解股票的趋势以及每天的多空对比很有帮助. 一 ...
- python做k线图_python做k线图(15分钟k线的意义)
北大荒... 大家对图中的巨量高开涨停是什么理解的... 庄家最后的出 日k线图又称阴阳烛,最初是日本米商用来表示米价涨跌状况的工具,后来引入股市,并逐渐风行于东南亚地区.k线图以其直观.立体感强的特 ...
- python均线选股_python选股模型均线,已知股票数据,如何用Python绘制k线日对应数据...
Q1:已知股票数据,如何用Python绘制k线日对应数据 我没遇到过 只是自己写过 有点经验 先确定时间片 然后再把tick插入就行了 Q2:使用python实现ema(指数移动平均的计算) a = ...
- python画k线图_python画k线图
广告关闭 腾讯云11.11云上盛惠 ,精选热门产品助力上云,云服务器首年88元起,买的越多返的越多,最高返5000元! import datetime import pandas_datareader ...
最新文章
- Qt中关于undefined reference to `vtable for故障总结
- 如何使用Tasklist命令
- 通过mysql show processlist 命令检查mysql锁的方法
- 软件系统架构~软件架构概念
- python画图代码-Python为啥这么牛?一行Python代码除了画图竟然还有这些功能!
- java 模式匹配_Java 14 模式匹配,非常赞的一个新特性!
- mooc作业怎么上传附件_中国MOOC高手练级指南
- idea上传新项目至svn仓库
- 教你用Axure绘制三级菜单
- 中国大陆五级行政区划数据爬虫
- 计算机图形点阵表示实例,计算机图形学的应用实例(计算机图形作业)精选.doc
- cls love even fib!(打表,找规律)
- Python游戏概率保底算法PRD的实现
- ArcGIS Runtime SDK for Android 读取tpk、vtpk
- VxWorks编译ACE和TAO
- SFTP传输文件工具FileZilla下载安装教程
- Cartopy画地图第七天(python画浮雕地图和比例尺)
- 通过CSS3的hover一个元素使其兄弟元素也相应改变某种属性
- 微信的隐藏功能竟然可以一秒获取好友位置!这到底是神马操作
- 插入排序:直接插入、交换插入、折半插入
热门文章
- 浏览器端的九种缓存机制介绍
- macbook系统安装服务器,SVN-Mac安装服务器
- 大厂难进,Java面试该如何一面即中?
- 256 变 4096:分库分表扩容如何实现平滑数据迁移?
- 直播、线上办公、IoT需求井喷,Wi-Fi 6如何防止网络“塞车”?
- Python 操作 PDF 的几种方法
- TensorFlow、PyTorch 之后,“国产”AI 框架还有没有机会?
- 限免!百名 AI 大咖,20 大技术和行业论坛,邀你加入群聊
- “手把手撕LeetCode题目,扒各种算法套路的裤子”
- 能让应届生拿到阿里 Offer 的一份面试题