要做量化投资,数据是基础,正所谓“巧妇难为无米之炊”

在免费数据方面,各大网站的财经板块其实已提供相应的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获取股票历史、实时数据与更新到数据库相关推荐

  1. python程序化 k线指定时间更新_Python之路 14 K线时间序列管理器

    在上一章中介绍了如何通过实时行情推送的Tick数据合成1分钟K线,并且如何通过1分钟K线来合成更大周期的K线.本章主要介绍如何将K线通过numpy缓存到Array,形成时间序列,并且同时生成一些技术指 ...

  2. python程序化 k线指定时间更新_Python项目Keylogger(定时器)

    一.代码 keylogger.py文件 #!/usr/bin/env python import smtplib import threading from pynput import keyboar ...

  3. python绘制k线图的步骤_Python使用PyQtGraph绘制股票行情K线图

    PyQtGraph是Python平台上一种功能强大的2D/3D绘图库,相对于matplotlib库,由于其在内部实现方式上,使用了高速计算的numpy信号处理库以及Qt的GraphicsView框架, ...

  4. python处理行情数据_Python获取股票历史、实时数据与更新到数据库

    要做量化投资,数据是基础,正所谓"巧妇难为无米之炊" 在免费数据方面,各大网站的财经板块其实已提供相应的api,如新浪.雅虎.搜狐...可以通过urlopen相应格式的网址获取数据 ...

  5. python 画k线图_matplotlib画k线图

    画k线需要的包和环境: python36 import tushare as ts import re import matplotlib.pyplot as plt import mpl_finan ...

  6. python画k线图_Python绘制K线图

    不管是对量化分析师还是普通的投资者来说,K线图(蜡烛图)都是一种很经典.很重要的工具.在K线图中,它会绘制每天的最高价.最低价.开盘价和收盘价,这对于我们理解股票的趋势以及每天的多空对比很有帮助. 一 ...

  7. python做k线图_python做k线图(15分钟k线的意义)

    北大荒... 大家对图中的巨量高开涨停是什么理解的... 庄家最后的出 日k线图又称阴阳烛,最初是日本米商用来表示米价涨跌状况的工具,后来引入股市,并逐渐风行于东南亚地区.k线图以其直观.立体感强的特 ...

  8. python均线选股_python选股模型均线,已知股票数据,如何用Python绘制k线日对应数据...

    Q1:已知股票数据,如何用Python绘制k线日对应数据 我没遇到过 只是自己写过 有点经验 先确定时间片 然后再把tick插入就行了 Q2:使用python实现ema(指数移动平均的计算) a =  ...

  9. python画k线图_python画k线图

    广告关闭 腾讯云11.11云上盛惠 ,精选热门产品助力上云,云服务器首年88元起,买的越多返的越多,最高返5000元! import datetime import pandas_datareader ...

最新文章

  1. Qt中关于undefined reference to `vtable for故障总结
  2. 如何使用Tasklist命令
  3. 通过mysql show processlist 命令检查mysql锁的方法
  4. 软件系统架构~软件架构概念
  5. python画图代码-Python为啥这么牛?一行Python代码除了画图竟然还有这些功能!
  6. java 模式匹配_Java 14 模式匹配,非常赞的一个新特性!
  7. mooc作业怎么上传附件_中国MOOC高手练级指南
  8. idea上传新项目至svn仓库
  9. 教你用Axure绘制三级菜单
  10. 中国大陆五级行政区划数据爬虫
  11. 计算机图形点阵表示实例,计算机图形学的应用实例(计算机图形作业)精选.doc
  12. cls love even fib!(打表,找规律)
  13. Python游戏概率保底算法PRD的实现
  14. ArcGIS Runtime SDK for Android 读取tpk、vtpk
  15. VxWorks编译ACE和TAO
  16. SFTP传输文件工具FileZilla下载安装教程
  17. Cartopy画地图第七天(python画浮雕地图和比例尺)
  18. 通过CSS3的hover一个元素使其兄弟元素也相应改变某种属性
  19. 微信的隐藏功能竟然可以一秒获取好友位置!这到底是神马操作
  20. 插入排序:直接插入、交换插入、折半插入

热门文章

  1. 浏览器端的九种缓存机制介绍
  2. macbook系统安装服务器,SVN-Mac安装服务器
  3. 大厂难进,Java面试该如何一面即中?
  4. 256 变 4096:分库分表扩容如何实现平滑数据迁移?
  5. 直播、线上办公、IoT需求井喷,Wi-Fi 6如何防止网络“塞车”?
  6. Python 操作 PDF 的几种方法
  7. TensorFlow、PyTorch 之后,“国产”AI 框架还有没有机会?
  8. 限免!百名 AI 大咖,20 大技术和行业论坛,邀你加入群聊
  9. “手把手撕LeetCode题目,扒各种算法套路的裤子”
  10. 能让应届生拿到阿里 Offer 的一份面试题