博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Python获取股票历史数据
阅读量:4210 次
发布时间:2019-05-26

本文共 3451 字,大约阅读时间需要 11 分钟。

      闲了的时候还是要学一点金融知识,先不说金融懂多少,但是通过金融的目的来编程其实也还行。总之美好的一天不要浑浑噩噩的度过。我觉得都是值得回忆的美好岁月。我们都知道股票市场有很多交易数据,有人亏损有人盈利。但是赚的人肯定是赚了很久了。赔的人也许会一直亏,但也可能厚积薄发。作为一只初来乍到的程序员,咋没有那种科班背景,所以很多时候唯一能派上用场的的好好学习。那么最基础的肯定需要知道基本知识吧,因为我本人是一只目的和好奇心驱动的猿,所以让我系统的学习某个专业会让我很难接受,主要是学过之后不一定能够形成系统的认知能力。可能效果总比我这样凭感觉的好的多的多。后期再看情况,先不扯这些话题。今天的目标就是记录一下我是如何获取股票数据的。没错我用的是开源的组件,没有写爬虫。因为股票数据是有专业的组织开放的api,里边比较好的是tushare和baostack。然后之前使用tushare还好,还是自从他们升级之后就需要积分了,然后发现自己的积分不够。所以我采用了baostack,但是baostack的问题是“数据不全”。其实也不是数据不全,而是获取全部股票信息的时候返回的数据总是隔三差五。让我对此产生了怀疑。纠结之下发现tushare能够获取全部股票列表,然后我把之前baostack中没有返回的股票代码作为参数调baostack其实也是能返回数据的。那么就是baostack的rs=bs.query_stock_basic()接口的问题?反正已经呵呵哒了,所以我最终采用的策略是使用tushare获取上证和深证的股票,然后调用baostack获取股票的历史交易数据并保存到文件中。

import sysimport tushare as tsimport pandas as pddf_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 bsimport pandas as pdimport 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编程能力。

转载地址:http://nqkmi.baihongyu.com/

你可能感兴趣的文章
pdf的转换网址:
查看>>
c++设计模式之三~抽象工厂模式
查看>>
c++设计模式之单例模式
查看>>
c++设计模式之建造者模式
查看>>
c++设计模式之原型模式
查看>>
c++设计模式之适配器模式
查看>>
c++设计模式之桥接模式
查看>>
c++设计模式之装饰模式
查看>>
Mysql学习笔记(八)- 两个简单实用的优化方法
查看>>
mysql学习笔记(九)- 增删改查的优化
查看>>
Jenkins学习笔记(一)
查看>>
AtomicInteger源码解析
查看>>
CopyOnWriteArraySet源码学习
查看>>
ThreadLocal学习笔记
查看>>
用talib实现基于emv的简易量化投资策略
查看>>
LongAdder源码解析
查看>>
Talib学习笔记(二)- 价格指数学习
查看>>
CAS机制是什么?
查看>>
Semaphore源码解析
查看>>
ConcurrentLinkedDeque源码解析
查看>>