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

在免费数据方面,各大网站的财经板块其实已提供相应的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

  1. import psycopg2 #使用的是PostgreSQL数据库
  2. import tushare as ts
  3. from Stocks import*
  4. from HData import*
  5. import datetime
  6.  
  7. stocks=Stocks("postgres","")
  8. hdata=HData("postgres","")
  9.  
  10. # stocks.db_stocks_create()#如果还没有表则需要创建
  11. #print(stocks.db_stocks_update())#根据todayall的情况更新stocks表
  12.  
  13. #hdata.db_hdata_date_create()
  14.  
  15. nowdate=datetime.datetime.now().date()
  16.  
  17. codestock_local=stocks.get_codestock_local()
  18.  
  19. hdata.db_connect()#由于每次连接数据库都要耗时0.0几秒,故获取历史数据时统一连接
  20. for i in range(0,len(codestock_local)):
  21. nowcode=codestock_local[i][0]
  22.  
  23. #print(hdata.get_all_hdata_of_stock(nowcode))
  24.  
  25. print(i,nowcode,codestock_local[i][1])
  26.  
  27. maxdate=hdata.db_get_maxdate_of_stock(nowcode)
  28. print(maxdate, nowdate)
  29. if(maxdate):
  30. if(maxdate>=nowdate):#maxdate小的时候说明还有最新的数据没放进去
  31. continue
  32. hist_data=ts.get_hist_data(nowcode, str(maxdate+datetime.timedelta(1)),str(nowdate), 'D', 3, 0.001)
  33. hdata.insert_perstock_hdatadate(nowcode, hist_data)
  34. else:#说明从未获取过这只股票的历史数据
  35. hist_data = ts.get_hist_data(nowcode, None, str(nowdate), 'D', 3, 0.001)
  36. hdata.insert_perstock_hdatadate(nowcode, hist_data)
  37.  
  38. hdata.db_disconnect()

Stocks.py

  1. import tushare as ts
  2. import psycopg2
  3. class Stocks(object):#这个类表示"股票们"的整体(不是单元)
  4. def get_today_all(self):
  5. self.todayall=ts.get_today_all()
  6.  
  7. def get_codestock_local(self):#从本地获取所有股票代号和名称
  8. conn = psycopg2.connect(database="wzj_quant", user=self.user, password=self.password, host="127.0.0.1",
  9. port="")
  10. cur = conn.cursor()
  11. # 创建stocks表
  12. cur.execute('''
  13. select * from stocks;
  14. ''')
  15. rows =cur.fetchall()
  16. conn.commit()
  17. conn.close()
  18.  
  19. return rows
  20. pass
  21. def __init__(self,user,password):
  22. # self.aaa = aaa
  23. self.todayall=[]
  24. self.user=user
  25. self.password=password
  26.  
  27. def db_perstock_insertsql(self,stock_code,cns_name):#返回的是插入语句
  28. sql_temp="insert into stocks values("
  29. sql_temp+="\'"+stock_code+"\'"+","+"\'"+cns_name+"\'"
  30. sql_temp +=");"
  31. return sql_temp
  32. pass
  33.  
  34. def db_stocks_update(self):# 根据gettodayall的情况插入原表中没的。。gettodayall中有的源表没的保留不删除#返回新增行数
  35. ans=0
  36. conn = psycopg2.connect(database="wzj_quant", user=self.user, password=self.password, host="127.0.0.1", port="")
  37. cur = conn.cursor()
  38. self.get_today_all()
  39.  
  40. for i in range(0,len(self.todayall)):
  41. sql_temp='''select * from stocks where stock_code='''
  42. sql_temp+="\'"+self.todayall["code"][i]+"\';"
  43. cur.execute(sql_temp)
  44. rows=cur.fetchall()
  45. if(len(rows)==0):
  46. #如果股票代码没找到就插
  47. ans+=1
  48. cur.execute(self.db_perstock_insertsql(self.todayall["code"][i],self.todayall["name"][i]))
  49. pass
  50. conn.commit()
  51. conn.close()
  52. print("db_stocks_update finish")
  53. return ans
  54.  
  55. def db_stocks_create(self):
  56. conn = psycopg2.connect(database="wzj_quant", user=self.user, password=self.password, host="127.0.0.1", port="")
  57. cur = conn.cursor()
  58. # 创建stocks表
  59. cur.execute('''
  60. drop table if exists stocks;
  61. create table stocks(stock_code varchar primary key,cns_name varchar);
  62. ''')
  63. conn.commit()
  64. conn.close()
  65. print("db_stocks_create finish")
  66. pass

HData.py

  1. import psycopg2
  2. import tushare as ts
  3. import pandas as pd
  4. from time import clock
  5.  
  6. class HData(object):
  7. def __init__(self,user,password):
  8. # self.aaa = aaa
  9. self.hdata_date=[]
  10. self.user=user
  11. self.password=password
  12.  
  13. self.conn=None
  14. self.cur=None
  15.  
  16. def db_connect(self):
  17. self.conn = psycopg2.connect(database="wzj_quant", user=self.user, password=self.password, host="127.0.0.1",
  18. port="")
  19. self.cur = self.conn.cursor()
  20.  
  21. def db_disconnect(self):
  22.  
  23. self.conn.close()
  24.  
  25. def db_hdata_date_create(self):
  26. conn = psycopg2.connect(database="wzj_quant", user=self.user, password=self.password, host="127.0.0.1",
  27. port="")
  28. cur = conn.cursor()
  29. # 创建stocks表
  30. cur.execute('''
  31. drop table if exists hdata_date;
  32. create table hdata_date(stock_code varchar,record_date date,
  33. open float,high float,close float,low float,
  34. volume float,
  35. price_change float,p_change float,
  36. ma5 float,ma10 float,ma20 float,
  37. v_ma5 float,v_ma10 float,v_ma20 float,
  38. turnover float
  39. );
  40. alter table hdata_date add primary key(stock_code,record_date);
  41. ''')
  42. conn.commit()
  43. conn.close()
  44. print("db_hdata_date_create finish")
  45. pass
  46.  
  47. def db_get_maxdate_of_stock(self,stock_code):#获取某支股票的最晚日期
  48. self.cur.execute("select max(record_date) from hdata_date where stock_code="+"\'"+stock_code+"\'"+";")
  49. ans=self.cur.fetchall()
  50. if(len(ans)==0):
  51. return None
  52. return ans[0][0]
  53. self.conn.commit()
  54. pass
  55.  
  56. def insert_perstock_hdatadate(self,stock_code,data):#插入一支股票的所有历史数据到数据库#如果有codeindex相同的不重复插入
  57. t1=clock()
  58.  
  59. for i in range(0,len(data)):
  60. str_temp=""
  61.  
  62. str_temp+="\'"+stock_code+"\'"+","
  63. str_temp+="\'"+data.index[i]+"\'"
  64.  
  65. for j in range(0,data.shape[1]):
  66. str_temp+=","+"\'"+str(data.iloc[i,j])+"\'"
  67. sql_temp="values"+"("+str_temp+")"
  68. self.cur.execute("insert into hdata_date "+sql_temp+";")
  69. self.conn.commit()
  70.  
  71. print(clock()-t1)
  72.  
  73. print(stock_code+" insert_perstock_hdatadate finish")
  74.  
  75. def get_all_hdata_of_stock(self,stock_code):#将数据库中的数据读取并转为dataframe格式返回
  76. conn = psycopg2.connect(database="wzj_quant", user=self.user, password=self.password, host="127.0.0.1",
  77. port="")
  78. cur = conn.cursor()
  79.  
  80. sql_temp="select * from hdata_date where stock_code="+"\'"+stock_code+"\';"
  81. cur.execute(sql_temp)
  82. rows = cur.fetchall()
  83.  
  84. conn.commit()
  85. conn.close()
  86.  
  87. dataframe_cols=[tuple[0] for tuple in cur.description]#列名和数据库列一致
  88. df = pd.DataFrame(rows, columns=dataframe_cols)
  89. return df
  90. pass

main.py的控制台输出示例:

HData中的函数get_all_hdata_of_stock结果示例:

  1.  stock_code record_date   open   high  close    low     volume  \
  2. 0       603999  2015-12-10  14.07  14.07  14.07  14.07     337.00  
  3. 1       603999  2015-12-11  15.48  15.48  15.48  15.48     119.00  
  4. 2       603999  2015-12-14  17.03  17.03  17.03  17.03     267.00  
  5. 3       603999  2015-12-15  18.73  18.73  18.73  18.73     244.00   
  6. ..         ...         ...    ...    ...    ...    ...        ...   
  7. 397     603999  2017-08-01   9.62   9.97   9.79   9.61   36337.80  
  8. 398     603999  2017-08-02   9.80   9.85   9.61   9.59   32135.60  
  9.      price_change  p_change     ma5    ma10    ma20      v_ma5     v_ma10  \
  10. 0            4.30     44.01  14.070  14.070  14.070     337.00     337.00  
  11. 1            1.41     10.02  14.775  14.775  14.775     228.00     228.00  
  12. 2            1.55     10.01  15.527  15.527  15.527     241.00     241.00  
  13. 3            1.70      9.98  16.328  16.328  16.328     241.75     241.75   
  14. ..            ...       ...     ...     ...     ...        ...        ...   
  15. 397          0.16      1.66   9.680   9.709   9.924   36754.46   49436.88  
  16. 398         -0.18     -1.84   9.698   9.741   9.863   36513.38   49998.51  
  17.         v_ma20  turnover 
  18. 0       337.00      0.06 
  19. 1       228.00      0.02 
  20. 2       241.00      0.04 
  21. 3       241.75      0.04  
  22. ..         ...       ...  
  23. 397   42602.09      1.58 
  24. 398   42114.31      1.39 

数据库中的数据示例

stocks表

hdata_date表

Python获取股票历史、实时数据与更新到数据库的更多相关文章

  1. Python获取时光网电影数据

    Python获取时光网电影数据 一.前言 有时候觉得电影真是人类有史以来最伟大的发明,我喜欢看电影,看电影可以让我们增长见闻,学习知识.从某种角度上而言,电影凭借自身独有的魅力大大延长了人类的&quo ...

  2. 金融量化分析-python量化分析系列之---使用python获取股票历史数据和实时分笔数据

    财经数据接口包tushare的使用(一) Tushare是一款开源免费的金融数据接口包,可以用于获取股票的历史数据.年度季度报表数据.实时分笔数据.历史分笔数据,本文对tushare的用法,已经存在的 ...

  3. python调用tushare获取股票日线实时行情数据

    接口:daily 数据说明:交易日每天15点-16点之间.本接口是未复权行情,停牌期间不提供数据. 调取说明:基础积分每分钟内最多调取200次,每次4000条数据,相当于超过18年历史,具体请参阅本文 ...

  4. 一个采用python获取股票数据的开源库,相当全,及一些量化投资策略库

    tushare: http://tushare.waditu.com/index.html 为什么是Python? 就跟javascript在web领域无可撼动的地位一样,Python也已经在金融量化 ...

  5. python调用tushare获取股票月线数据

    接口:monthly 描述:获取A股月线数据 限量:单次最大3700,总量不限制 积分:用户需要至少300积分才可以调取,具体请参阅本文最下方积分获取办法 注:tushare库下载和初始化教程,请查阅 ...

  6. 关于Python获取图片文件二进制数据的问题(获取为空)

    在搭建fastdfs文件系统的时候遇到了点问题,在测试上传文件数据流的时候,需要Python来获取本地文件的二进制流 from fdfs_client.client import Fdfs_clien ...

  7. 通过fsockopen()方法从中国福彩网获取双色球历史中奖数据

    # 以下代码基于 CI 框架 # public function history_draw($page = 0) { set_time_limit(0); $page++; $up2now = dat ...

  8. python获取list列表随机数据

    第一种方法(推荐)适用于随机取一个值, 返回一个值import randomlist1 = ['佛山', '南宁', '北海', '杭州', '南昌', '厦门', '温州']a = random.c ...

  9. WebXml.com.cn 中国股票行情数据 WEB 服务(支持深圳和上海股市的全部基金、债券和股票),数据即时更新

    http://www.webxml.com.cn/WebServices/ChinaStockWebService.asmx

随机推荐

  1. 小试牛刀JavaScript鼠标事件

    鼠标事件练习1 当鼠标点击网页某个单元格的时候,其他的单元格颜色不变,只有被点击的单元格颜色发生变化 <style type="text/css"> *{ margin ...

  2. html中p标签行间距的问题

    使用CSS行高样式line-height可以设置调整p行间距,但是同时会影响每行文字间的上下间距,所以使用line-height虽然可以用来设置html p 行距离间隔,但是不是很实用,一般line- ...

  3. Vuejs技术栈从CLI到打包上线实战全解析

    前言 本文是自己vue项目实践中的一些总结,针对Vue2及相关技术栈,实践中版本为2.3.3. 开发前须知 vue-cli 在开发前,我们要至少通读一遍vue官方文档和API(看官方文档是最重要的,胜 ...

  4. ASP.NET Core 源码学习之 Options[3]:IOptionsSnapshot

    在 上一章 中,介绍了 IOptions 的使用, 而我们知道,在ConfigurationBuilder的AddJsonFile中,有一个reloadOnChange参数,设置为true时,在配置文 ...

  5. PHP数组按引用传递

    <?php /**PHP数组按引用传递**/ $arr = array( array('id' => 1, 'name' => 'name1'), array('id' => ...

  6. Cmake新手使用日记(1)【C++11下的初体验】

    第一次使用Cmake,搜索了很多使用教程,包括<Cmake实践>.<Cmake手册>等,但是在针对最新的C++11条件下编程还是会存在一点点问题,需要实验很多次错误并搜索大量文 ...

  7. VMware Mac OS中无法找到适应的分辨率的解决办法

    使用VMware安装的Mac OS中,有时在显示器的分辨率中的选择项里面,没有对应显示的分辨率可供选择的时候(无法自适应),可以在虚拟机设置里,显示器中修改强制分辨率.修改过后重启虚拟机,就可以有对应 ...

  8. pl_sql develope连接远程数据库的方法

    需要修改你所安装的数据的路径下 tnsnames.ora 文件(我安装路径是F:\app\Aside\product\11.2.0\dbhome_1\NETWORK\ADMIN) tnsnames.o ...

  9. redis内存消耗详解

    Redis所有的数据都存在内存中,相对于廉价的硬盘,内存资源还是比较昂贵的,因此如何高效利用redis内存变得非常重要. 内存消耗分析 管理内存的原理和方法 内存优化技巧 一.内存消耗 理解redis ...

  10. winform利用委托delegate进行窗体间通信,相同标题已经存在??

    前段时间学习委托,感觉很模糊的样子,也做过许多实例,但是项目中一直没有用到,今天在项目中遇到一个很简单的例子,现在拿出来,做一个简单的记录. 要求:将弹出框里勾选的内容返回到主面板上. 工具:委托. ...