获取股票数据主要是靠网页爬虫或者现成的库。

关于股票数据获取,python的接口有非常多,教程也有很多。

最后我选择了使用tushare和baostock。由于tushare升级之后有积分限制,很多数据是需要获取足够的积分才能得到,所以在学习量化交易的最开始使用了baostock获取数据。由于最后只需要获取沪深300和中证500的一些基础数据,所以也就联合baostock和tushare解决了这个问题(tushare获取沪深300和中证500成分股好像需要600积分)。实际上感觉tushare的接口比baostock更完善一些。

话不多说 直接上代码:

import tushare as ts
import os
import datetime
import baostock as bs
import pandas as pd
import json
import logger
import csvclass stockDump():def __init__(self, objLog=None, dataDir="stockData"):self.dictStock = {}self.dictMarket = {}self.objLog    = objLogself.dataDir   = dataDirself.maxLine   = 0self.maxName   = ""self.data_init()def data_init(self):if os.path.exists(self.dataDir) is False:os.makedirs(self.dataDir)def log(self, string):if self.objLog is None:print(string)else:self.objLog.addDrc(string)def login(self):bs.login()token = "your token"self.objTu = ts.pro_api(token)ts.set_token(token)def logout(self):bs.logout()def get_one_stock_kline(self, mark, startDate, endDate, dumpList=False):self.log("INFO: get info of '%s'"%(mark))rs = bs.query_history_k_data_plus(mark,"date,code,open,high,low,close,volume,amount,adjustflag,turn,pctChg,peTTM",start_date=startDate, end_date=endDate,frequency="d", adjustflag="2")data_list = []while (rs.error_code == '0') & rs.next():data_list.append(rs.get_row_data())result = pd.DataFrame(data_list, columns=rs.fields)self.maxLine = max(len(data_list), self.maxLine)if len(data_list) > self.maxLine:self.maxLine = len(data_list)self.maxName = markfName = mark.split(".")[-1]+".csv"fPath = os.path.join(self.dataDir, fName)result.to_csv(fPath, index=False)if dumpList is True:self.dictStock[mark] = "Add"def dump_stock_list(self):fPath = os.path.join(self.dataDir, "stocklist.js")fp = open(fPath, "w")json.dump(self.dictStock, fp)fp.close()def dump_industry(self):rs = bs.query_stock_industry()dictIndustry = {}while (rs.error_code == '0') & rs.next():rowData = rs.get_row_data()mark = rowData[1].split(".")[-1]dictIndustry[mark] = rowData[1:]fPath = os.path.join(self.dataDir, "industry.js")fp = open(fPath, "w")json.dump(dictIndustry, fp)fp.close()def get_his300_stocks(self, startDate, endDate, dumpList=True):rs = bs.query_hs300_stocks()#query_zz500_stockshs300_stocks = []while (rs.error_code == '0') & rs.next():hs300_stocks.append(rs.get_row_data())for item in hs300_stocks:mark = item[1]name = item[2]if dumpList is True:self.dictStock[mark] = nameself.get_one_stock_kline(mark, startDate, endDate)def get_zz500_stocks(self, startDate, endDate, dumpList=True):rs = bs.query_zz500_stocks()zz500_stocks = []while (rs.error_code == '0') & rs.next():zz500_stocks.append(rs.get_row_data())for item in zz500_stocks:mark = item[1]name = item[2]if dumpList is True:self.dictStock[mark] = nameself.get_one_stock_kline(mark, startDate, endDate)def align_csv(self, name=None):maxName = self.maxName if name is None else namemaxName = maxName.split(".")[-1]fName = maxName +".csv"objCsv = pd.read_csv(os.path.join(self.dataDir, fName))dateList = list(objCsv["date"])headerList = list(objCsv.columns.values)dateInd  = headerList.index("date")codeInd  = headerList.index("code")openInd  = headerList.index("open")closeInd = headerList.index("close")highInd  = headerList.index("high")lowInd   = headerList.index("low")tmpLine = [0 for item in headerList]fPath = os.path.join(self.dataDir, "stocklist.js")fp = open(fPath, "r")dictStockList = json.load(fp)fp.close()for code in list(dictStockList.keys()):closePri = 0preFix = code.split(".")[0]code = code.split(".")[-1]pCode = "%s.%s"%(code, preFix.upper())if code == maxName:continuefPath = os.path.join(self.dataDir, "%s.csv"%(code))self.log("Align '%s'"%(fPath))objCsv = pd.read_csv(fPath)curDateList = list(objCsv["date"])#objNew = pd.DataFrame([[]], columns=headerList)tmpList = []addNum = 0for i, date in enumerate(dateList):if date in curDateList:lineList = list(objCsv.loc[i-addNum])closePri = lineList[closeInd]tmpList.append(lineList)continueaddNum += 1tmpLine[dateInd]  = datetmpLine[codeInd]  = pCodetmpLine[openInd]  = closePritmpLine[closeInd] = closePritmpLine[highInd]  = closePritmpLine[lowInd]   = closePritmpList.append(tmpLine.copy())objNew = pd.DataFrame(tmpList, columns=headerList)objNew.to_csv(fPath, index=False)def get_his300_stocks_ts(self, startDate, endDate):rs = bs.query_hs300_stocks()hs300_stocks = []while (rs.error_code == '0') & rs.next():hs300_stocks.append(rs.get_row_data())for item in hs300_stocks:mark = item[1]name = item[2]self.dictStock[mark] = namemark = "%s.%s"%(mark.split(".")[-1], mark.split(".")[0].upper())startDate = startDate.replace("-", "")endDate = endDate.replace("-", "")self.get_one_stock_kline_ts(mark, startDate, endDate)def get_zz500_stocks_ts(self, startDate, endDate, dumpList=True):rs = bs.query_zz500_stocks()zz500_stocks = []while (rs.error_code == '0') & rs.next():zz500_stocks.append(rs.get_row_data())for item in zz500_stocks:mark = item[1]name = item[2]self.dictStock[mark] = namemark = "%s.%s"%(mark.split(".")[-1], mark.split(".")[0].upper())startDate = startDate.replace("-", "")endDate = endDate.replace("-", "")self.get_one_stock_kline_ts(mark, startDate, endDate)def get_one_stock_kline_ts(self, mark, startDate, endDate, dumpList=False):self.log("INFO: get info of '%s'"%(mark))markNum = mark.split(".")[0]dPath = os.path.join(self.dataDir, "%s.csv"%(markNum))objData  = ts.pro_bar(ts_code=mark, adj='qfq', start_date=startDate, end_date=endDate)objData.rename(columns={"trade_date": "date"}, inplace=True)objData.rename(columns={"ts_code": "code"}, inplace=True)for i in range(0, len(objData)):date = datetime.datetime.strptime(objData.loc[i, "date"], "%Y%m%d")date = date.strftime("%Y-%m-%d")objData.loc[i, "date"] = dateindexList = list(reversed(objData["date"]))if self.maxLine < len(objData):self.maxLine = len(objData)self.maxName = markNumobjData = objData.set_index("date")objData = objData.reindex(index=indexList)objData.to_csv(dPath)if dumpList is True:self.dictStock[markNum] = "Add"if __name__ == "__main__":objDump = stockDump()objDump.login()endDate = str(datetime.datetime.today()).split()[0]objDump.dump_industry()objDump.get_his300_stocks_ts("2020-10-01", endDate)objDump.get_zz500_stocks_ts(startDate='2020-10-01', endDate=endDate)objDump.dump_stock_list()objDump.align_csv()objDump.logout()

需要注意几点:

1. token变量设置为用户自己的token,通过tushare官网获取

2. align_csv函数用于对齐股票数据,是由于个股存在停牌机制,停牌的时间段就没有数据,需要手动补充上去,否则不同股票的数据长度就会不一致,后续处理可能会有问题

3. 沪深300成分股和中证500成分股会不断更新

4. 注意是需要前复权的股价还是后复权

5. 获取的是日K数据

6. 历史前复权数据是会变化的,好像是遇到增发这种情况的时候,复权股票价格就会变化

【Python量化交易笔记】股票数据获取 (一)相关推荐

  1. python量化交易笔记---13.描述性统计

    统计分为描述统计和推断统计,我们在这一章里,主要讲解描述性统计.我们用到的数据如下所示: images/c13f004.png 上图中,gsyh代表工商银行收益率,pfyh代表浦发银行收益率,zglt ...

  2. Python量化交易之预测茅台股票涨跌(文末赠书福利)

    本文摘自清华大学出版<深入浅出Python量化交易实战>一书的读书笔记,这里把作者用KNN模式做的交易策略,换成了逻辑回归模型,试试看策略的业绩会有怎样的变化. 二话不说,上梯子,导库拉数 ...

  3. 【python量化交易学习】从tushare获取股票交易数据,存入后再从mysql或excel读取数据,筛选股票,用pyecharts画出K线图。

    选定日期,筛选涨幅达到10%的股票,并画出K线图.观察涨停后股票走势. 由于创业板涨停板为20%,科创板20%,北交所30%.因此筛选出的涨停股票不完全准确.考虑到目前市场打板主要集中在10%的主板股 ...

  4. 学习《深入浅出python量化交易交易实战》第一章(笔记)

    1.学习<深入浅出python量化交易交易实战>第一章 记录学习过程中的代码和一些坑 1.1 基础(名词解释) 1.1.1 CAPM (Capital Asset Pricing Moda ...

  5. Python量化交易学习笔记(1)

    Python量化交易学习笔记(1) http://zwpython.com/ http://www.topquant.vip/?p=2275 [更多参见] <zwPython,目前最好的py开发 ...

  6. 4、Python量化交易-双均线策略

    目录 一.数据准备 二.5日均线和30日均线 1 - 均线的概念 2 - 计算5日均线与30日均线 3 - 画出MA5和MA30 三.金叉和死叉 1 - 金叉和死叉概念 2 - 分析所有金叉日期和死叉 ...

  7. Python量化交易06——Fama-French三因子模型(Rmt,SMB,HML)

    参考书目:深入浅出Python量化交易实战 本次带来的是著名的获得了诺贝尔奖的三因子模型. 因子模型介绍 Fama和French从可以解释股票收益率的众多因素中提取出了三个重要的影响因子,即市场风险溢 ...

  8. Python量化交易02——双均线策略(移动平均线)

    参考书目:深入浅出Python量化交易实战 本次带来最经典的交易策略,双均线策略的构建和其回测方法. 双均线一般采用5天均值和10天均值,如果5日均线上穿突破了10日均线,说明股价在最近的涨势很猛,买 ...

  9. Python量化交易05——基于多因子选择和选股策略(随机森林,LGBM)

    参考书目:深入浅出Python量化交易实战 在机器学习里面的X叫做特征变量,在统计学里面叫做协变量也叫自变量,在量化投资里面则叫做因子,所谓多因子就是有很多的特征变量. 本次带来的就是多因子模型,并且 ...

最新文章

  1. 博士因高校“虚假招聘”待遇不符辞职,却反被索要138万违约金,这是什么操作?...
  2. 对css类名className的一些操作的函数
  3. 分解因数(信息学奥赛一本通-T1200)
  4. c jni 调用java_如何使用JNI从C调用JAVA方法
  5. check whether edge in face indices.
  6. 前轮转向最大角度设计原来_转向系统的工作原理
  7. 中标麒麟/NeoKylin U盘安装系统
  8. 四十岁以后,如何做夫妻?
  9. ABP开发框架的总体介绍
  10. Django Ajax总结
  11. 根据刚刚,1分钟前,1小时前,几天前显示文章发布日期
  12. JavaWeb_07_Ajax
  13. 被认证的虫子,吃着才放心 | 独家
  14. 为了成长,我豁出去了!同程苏州,我来了!
  15. 愚人节 之强迫症描述
  16. html5 jquery 鼠标拖动例子,jquery实现鼠标拖动实现DIV排序示例代码
  17. 常用G.657与G.652光纤的抗弯曲性能差距有多大?
  18. sklearn代码21 2-2020天猫双十一销量
  19. 有这个 RESTED 插件,谁还用postman?哈哈
  20. Wordpress使用CloudFlare的CDN来加速网站(页面规则缓存设置教程

热门文章

  1. win7安装解压版mysql_win7安装解压缩版mysql 5.7.19和卸载后重新安装
  2. 自动弹窗加qq群教程
  3. 编程练习:MP3播放器
  4. 【DBA100人】李建明:一名普通DBA的14年技术之路与成长智慧
  5. 最大公约数(Java)
  6. 华为软件开发云如何为数字经济时代赋能?
  7. 预测大盘最准确的指标_一辈子死记一个指标,完全弄透彻,即可预测一个月的股市升跌!...
  8. C++黑客编程:键盘记录器,HOOK技术实现
  9. centos离线配置yun源
  10. 1KB到底有多大?(为什么买回来的硬盘总比标称容量小)