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