Python获取股票历史数据
闲了的时候还是要学一点金融知识,先不说金融懂多少,但是通过金融的目的来编程其实也还行。总之美好的一天不要浑浑噩噩的度过。我觉得都是值得回忆的美好岁月。我们都知道股票市场有很多交易数据,有人亏损有人盈利。但是赚的人肯定是赚了很久了。赔的人也许会一直亏,但也可能厚积薄发。作为一只初来乍到的程序员,咋没有那种科班背景,所以很多时候唯一能派上用场的的好好学习。那么最基础的肯定需要知道基本知识吧,因为我本人是一只目的和好奇心驱动的猿,所以让我系统的学习某个专业会让我很难接受,主要是学过之后不一定能够形成系统的认知能力。可能效果总比我这样凭感觉的好的多的多。后期再看情况,先不扯这些话题。今天的目标就是记录一下我是如何获取股票数据的。没错我用的是开源的组件,没有写爬虫。因为股票数据是有专业的组织开放的api,里边比较好的是tushare和baostack。然后之前使用tushare还好,还是自从他们升级之后就需要积分了,然后发现自己的积分不够。所以我采用了baostack,但是baostack的问题是“数据不全”。其实也不是数据不全,而是获取全部股票信息的时候返回的数据总是隔三差五。让我对此产生了怀疑。纠结之下发现tushare能够获取全部股票列表,然后我把之前baostack中没有返回的股票代码作为参数调baostack其实也是能返回数据的。那么就是baostack的rs=bs.query_stock_basic()接口的问题?反正已经呵呵哒了,所以我最终采用的策略是使用tushare获取上证和深证的股票,然后调用baostack获取股票的历史交易数据并保存到文件中。
import sys
import tushare as ts
import pandas as pd
df_stock_list_all = ts.get_stock_basics()
df_stock_list_all.reset_index(level=0, inplace=True)
df_stock_list_all_sort_code = df_stock_list_all.sort_values('code')
#上证股票都是600开头的
df_stock_sh = df_stock_list_all_sort_code[df_stock_list_all_sort_code['code']>'600000']
#深证股票最后的股票代码是300838,002中小板,300是创业板,000是主板
df_stock_sz = df_stock_list_all_sort_code[df_stock_list_all_sort_code['code']<'300859']
sys.path.append("libs")
result=[]
for i in range(0, len(df_stock_sh)):
data = []
data.append("sh." + df_stock_sh.iloc[i]['code'])
data.append(df_stock_sh.iloc[i]['name'])
# 时间处理的原因是baostack需要是YYY-MM-dd的格式
tian=str(df_stock_sh.iloc[i]['timeToMarket'])
timeTemp=tian[:4] + "-" + tian[4:6] + "-" + tian[6:8]
data.append(timeTemp)
#为了兼容之前使用的baostack的数据,这里表示退市时间
data.append("")
#下边两个参数也是兼容之前老代码
data.append(1)
data.append(1)
result.append(data)
for j in range(0, len(df_stock_sz)):
data = []
data.append("sz." + df_stock_sz.iloc[j]['code'])
data.append(df_stock_sz.iloc[j]['name'])
tian= str(df_stock_sz.iloc[j]['timeToMarket'])
timeTemp=tian[:4] + "-" + tian[4:6] + "-" + tian[6:8]
data.append(timeTemp)
data.append("")
data.append(1)
data.append(1)
result.append(data)
result = pd.DataFrame(result)
result.rename(columns = {"0": "code","1":"name"})
#header=0表示FrameDate数据中不要表头
result.to_csv("../data/basic_tushare.csv",header=0)
很快就获取了数据,数据效果还不错。后期再向mysql存储。
获取到股票列表之后就是逐个去获取股票的每日交易信息了。这块我用的是baostack,主要还是之前使用的baostack做了一点探索,而且他们免费。所以顺势而为。
import baostock as bs
import pandas as pd
import csv
#读取刚才拉到的股票数据
baseStockFile="../data/basic_tushare.csv"
csvFile=open(baseStockFile,"r",encoding="UTF-8")
reader=csv.reader(csvFile)
def baoStackReq(code,start):
lg=bs.login()
print(lg)
data=bs.query_history_k_data(code,"date,code,open,high,low,close,preclose,"
"volume,amount,adjustflag,turn,tradestatus,pctChg,peTTM,"
"pbMRQ,psTTM,pcfNcfTTM,isST",start_date=start)
targetData=[]
while (data.error_code=="0")&data.next():
targetData.append(data.get_row_data())
result=pd.DataFrame(targetData,columns=data.fields)
#这里还是不要打印了因为数据量比较大,会比较耗时间
print(result)
#用code作为股票交易数据的存储文件名称
code=code.replace(".","")
result.to_csv("../data/"+code+".csv")
for item in reader:
print(item)
line=item[0]
code=item[1]
start=item[3]
#排除未上市的股票
if len(start)<10:
continue
baoStackReq(code,start)
通过上述代码,我们就可以拉取股票了。拉取的效果。
因为数据量比较大,所以拉取的过程比较长,大概需要1个小时多。
除此之外,考虑到我们每次获取的数据肯定不是全部获取,我们肯定是获取我们没有的交易数据,那么如何添加到这只股票的cvs文件之后呐。我们可以使用result.to_csv("../data/"+code+".csv",mode="a")这里的mode="a"表示以追加的方式写入文件。
后边有时间的话,会逐步写相关的文章。主要是实现数据的自动维护和k线预测。同时希望在此过程中提升自己的python编程能力。
- 如何科学地蹭热点:用python爬虫获取热门微博评论并进行情感分析
- 使用ETag进行session的降级
- 关于oracle中的反连接(r3笔记第95天)
- 用Python爬取网易云音乐的用户评论文本
- grunt任务之seajs模块打包
- 【Java提高十八】Map接口集合详解
- Spring+SpringMVC+MyBatis+easyUI整合基础篇(五)讲一下maven
- Thinking in React
- 【Java提高十六】集合List接口详解
- JS的内建函数reduce
- Error: Cannot find module 'gulp-clone'问题的解决
- Spring+SpringMVC+MyBatis+easyUI整合基础篇(四)代码简化
- Angular源码分析之$compile
- TensorFlow实例: 手写汉字识别
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 服务器如何同步网络时间
- 用Bi-GRU语义解析,实现中文人物关系分析
- 控制梦境
- 引号吃掉了我的数据~~~
- 每日一题 | 召唤兽问题
- WMI ——重写版
- LeetCode009|只出现一次的数字
- 丢弃掉那些 BeanUtils 工具类吧,MapStruct 是真香!!!
- 还在「黑盒炼丹」? 教你如何实现一行代码透视炼丹过程
- SpringCloud Alibaba微服务实战十九 - 集成RBAC授权
- 混合算法(GA+TS)求解作业车间调度问题(JSP)-禁忌搜索部分
- 打卡群刷题总结0810——从前序与中序遍历序列构造二叉树
- JavaScript性能优化
- Python+Excel+Word一秒制作百份合同
- SQL 订单揽收统计