Python获取股票历史数据

时间:2022-07-23
本文章向大家介绍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编程能力。