python数据导入、导出
计量主要调用的模块:statsmodels is a Python module that provides classes and functions for the estimation of many different statistical models
在计量实战中,我们保留的数据格式主要是 TXT、CSV、Excel 三种格式,其中TXT、CSV更为通用和更少出错
- 常用的包
import pandas as pd
import numpy as np
import statsmodels.api as sm
import statsmodels.formula.api as smf
import scipy.stats as stats
from statsmodels.stats.anova import anova_lm
import matplotlib.pyplot as plt
import sklearn import linear_model
- 读入CSV数据
import pandas as pd
df = pd.read_csv("D:\\myfolder\\xl1-1.csv")
print(df)
- 读入Excel数据
#读取excel之前先打开命令行,安装xlrd。即在命令行中输入pip install xlrd。
import pandas as pd
df = pd.read_excel("D:\\myfolder\\test.xlsx")
print(df)
- 导出到CSV
import pandas as pd
df = pd.read_excel("D:\\myfolder\\test.xlsx")
print(df)
df.to_csv("D:\\myfolder\\testcsv.csv", encoding='utf-8', index=False)
#数据导出到tsetcsv.csv#
将test.xlsx的数据导入到testcsv.csv文件中
#数据中含有中文,使用‘utf-8’,index=false去掉行名称导出
- 导出到Excel
#先安装openpyxl包
import pandas as pd
import openpyxl
df = pd.read_excel("D:\\myfolder\\test.xlsx")
df.to_excel("D:\\myfolder\\excel2excel.xlsx", encoding='utf-8', index=False)
#数据导出到excel2excel.xlxs#
dt = pd.read_excel("D:\\myfolder\\excel2excel.xlsx")
print(dt)
读入TXT文件:全面的解读
1.读不同分隔符的文本文件,用参数sep
2.读无字段名(表头)的文本文件 ,用参数names
3.为文本文件制定索引,用index_col
import pandas as pd
data = pd.read_table('d:/new.txt',delim_whitespace=True,index_col=0)
#header=None:没有每列的column name,可以自己设定
#encoding='gb2312':其他编码中文显示错误
#delim_whitespace=True:用空格来分隔每行的数据
#index_col=0:设置第1列数据作为index片
data.to_excel("d:/my_new.xls")
#####
import pandas as pd #引入pandas包
citys=pd.read_table('./1.txt',sep='\t',header=None) #读入txt文件,分隔符为\t
print(citys)
seq标识分隔符,分隔符为\t ,即制表符,表示列与列之间用\t分开
header=None 表示txt文件的第一行不是列的名字,是数据。若不写head=None,则读入txt数据时,会没了第一行
pandas.read_table(filepath_or_buffer,sep='\t',delimiter=None,
header='infer',names=None,index_col=None,usecols=None,squeeze=False,
prefix=None,mangle_dupe_cols=True,dtype=None,engine=None,converters=None,
true_values=None,false_values=None,skipinitialspace=False,skiprows=None,
nrows=None,na_values=None,keep_default_na=True,na_filter=True,verbose=False,
skip_blank_lines=True,parse_dates=False,infer_datetime_format=False,
keep_date_col=False,date_parser=None,dayfirst=False,iterator=False,
chunksize=None,compression='infer',thousands=None,decimal=b'.',lineterminator=None,
quotechar='"',quoting=0,escapechar=None,comment=None,encoding=None,dialect=None,
tupleize_cols=None,error_bad_lines=True,warn_bad_lines=True,skipfooter=0,
doublequote=True,delim_whitespace=False,low_memory=True,memory_map=False,
float_precision=None)
6. 详细的说明
将表格型数据读取为DataFrame对象是pandas的重要特性。read_csv和read_table应该是使用最多的函数。
假设想要message列成为返回DataFrame的索引,则可以指定位置4的列为索引,或将’message’传给参数index_col:
#有时候数据文件没有表头,所以自己定义一下column名称#
import pandas as pd
names = ['a', 'b', 'c' ,'d', 'message']
pd.read_csv('ex1.csv', names=names, index_col='message')
message a b c d # 以message为索引
hello 1 2 3 4
world 5 6 7 8
foo 9 10 11 12
d = pd.DataFrame({'key1' : ['one', 'one', 'one', 'two', 'two', 'two'],
'key2' : ['a', 'b' ,'c' ,'a' ,'b' ,'c'],
'v1' : [1,3,5,7,9,11],
'v2' : [2,4,6,8,10,12]})
print(d)
'''
key1 key2 v1 v2
0 one a 1 2
1 one b 3 4
2 one c 5 6
3 two a 7 8
4 two b 9 10
5 two c 11 12
'''
d.to_csv('csv_mindex.csv', index=False) # 取消索引的存储 以防后序读取出现错误
'''
key1,key2,v1,v2
one,a,1,2
one,b,3,4
one,c,5,6
two,a,7,8
two,b,9,10
two,c,11,12
'''
# 从多个列中形成一个分层索引
parsed = pd.read_csv('csv_mindex.csv', index_col=['key1', 'key2'])
print(parsed)
'''
v1 v2
key1 key2
one a 1 2
b 3 4
c 5 6
two a 7 8
b 9 10
c 11 12
当字段是以多种不同数量的空格分开时,尽管你可以手工处理,但在这些情况下也可以向read_table传入一个正则表达式作为分隔符。在本例中,正则表达式为\s+,因此我们可以得到:
In [91]: reslut = pd.read_table('ex3.txt', sep='\s+')
In [92]: reslut
Out[92]:
A B C
aaa -2.00 -4.0000 -6.00
bbb -3.00 23.0000 21.00
ccc -1.23 0.2255 9.12
上例中,由于列名的数量比数据的列数少一个,因此read_table推断第一列应当作为DataFrame的索引。
使用DataFrame的to_csv方法,可以将数据导出为逗号分隔的文件,当然,其他的分隔符也是可以的:
In [13]: data = pd.DataFrame(np.arange(12).reshape((3,4)),
...: index=['a', 'b', 'c'],
...: columns=['one', 'two', 'three', 'four'])
In [14]: data
Out[14]:
one two three four
a 0 1 2 3
b 4 5 6 7
c 8 9 10 11
In [16]: import sys
In [17]: data.to_csv(sys.stdout, sep='|') #输出到控制台
|one|two|three|four
a|0|1|2|3
b|4|5|6|7
c|8|9|10|11
2.通过 API 在线下载数据:
有几个途径可以去下载财经方面的数据,比如 tushare(挖地兔)、opendatatools、quandl、pandas_datareader(Yahoo财经)
pip install tushare
pip install opendatatools
pip install quandl
pip install pandas_datareader
开始实战:从挖地兔上下载贵州茅台2010-01-01至2020-12-31 区间的数据。
import pandas as pd
import tushare as ts
df=ts.get_k_data('600519',start='2010-01-01', end='2020-12-31')['close']
df.to_csv("d:\\myfolder\\mydata11.csv")
#提示:本接口即将停止更新,请尽快使用Pro版接口:https://waditu.com/document/2#
考虑到挖地兔读取数据接口变化的问题,所以今后要使用下面的代码来get数据:
import tushare as ts
#1.先设置数据的接口#
ts.set_token('2f4f20d8b2fb57e033a820d04954b6f8a33f5a44c18b806189a802adsee')
pro = ts.pro_api()
#或者下面代码也行#
pro = ts.pro_api('2f4f20d8b2fb57e033a820d04954b6f8a33f5a44c18b806189a802adsee')
#2.提取数据#
df1=pro.daily(ts_code="000100.SZ",start_date='20180120', end_date='20201231')
#或者#
df2 = pro.daily(ts_code='600519.SH', start_date='20100101', end_date='20201231')
df2
# 截取收盘价这个字段 #
df3=df3[['close']]
type(df3)
## pandas.core.series.Series ##
## 改变一下存储的形式 ##
import pandas as pd
df4=pd.DataFrame()
df4=pd.DataFrame(df3)
print(type(df4))
## <class 'pandas.core.frame.DataFrame'> ##
注释:pro.stock_basic()
参数:is_hs:是否沪深港通标的,N否、H沪股通、S深股通;list_status:上市状态,L上市、D退市、P暂停上市;exchange:交易所 SSE上交所,SZSE深交所,HKEX港交所。
pro.daily(ts_code= 或 trade_date=)
日行情:daily;周行情:weekly;月行情:monthly
#先引入后面分析、可视化等可能用到的库
import tushare as ts
import pandas as pd
import matplotlib.pyplot as plt
#正常显示画图时出现的中文和负号
from pylab import mpl
mpl.rcParams['font.sans-serif']=['SimHei']
mpl.rcParams['axes.unicode_minus']=False
#设置token
token='2f4f20d8b2fb57e033a820d04954b6f8a33f5a44c18b806189a802adsee'
#ts.set_token(token)
pro = ts.pro_api(token)
#获取当前上市的股票代码、简称、注册地、行业、上市时间等数据
basic=pro.stock_basic(list_status='L')
#查看前五行数据
#basic.head(5)
#获取平安银行日行情数据
pa=pro.daily(ts_code='000001.SZ', start_date='20180101',
end_date='20190106')
print(pa.head())
运行下面代码之前,先运行: os.makedirs("c:/zjy/stock_data")
以下的code是为了批量获取数据:
import os
# 判断文件夹是否存在,不存在,就创建
if os.path.exists( 'c:/zjy/stock_data' ) == False:
os.makedirs( 'c:/zjy/stock_data' )
#定义获取多只股票函数:
def get_stocks_data(stocklist,start,end):
all_data={}
for code in stocklist:
all_data[code]=pro.daily(ts_code=code,
start_date=start, end_date=end)
return all_data
#保存本地
def save_data(all_data):
for code,data in all_data.items():
data.to_csv('c:/zjy/stock_data/'+code+'.csv',
header=True, index=False)
stocklist=list(basic.ts_code)[:15]
start=''
end=''
all_data=get_stocks_data(stocklist,start,end)
all_data['000002.SZ'].tail()
#将数据保存到本地
save_data(all_data)
#读取本地文件夹里所有文件
import os
#文件存储路径
file='c:/zjy/stock_data/'
g=os.walk(file)
filenames=[]
for path,d,filelist in g:
for filename in filelist:
filenames.append(os.path.join(filename))
print(filenames)
#将读取的数据文件放入一个字典中
df={}
#从文件名中分离出股票代码
code=[name.split('.')[0] for name in filenames]
for i in range(len(filenames)):
filename=file+filenames[i]
df[code[i]]=pd.read_csv(filename)
#查看第一只股票前五行数据
df[code[0]].head()
利用挖地兔查询指 数数据:pro.index_daily(ts_code=)
#先引入后面分析、可视化等可能用到的库
import tushare as ts
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
#正常显示画图时出现的中文和负号
from pylab import mpl
mpl.rcParams['font.sans-serif']=['SimHei']
mpl.rcParams['axes.unicode_minus']=False
#设置token
token='2f4f20d8b2fb57e033a820d04954b6f8a33f5a44c18b806189a802ad'
#ts.set_token(token)
pro = ts.pro_api(token)
#获取当前上市的股票代码、简称、注册地、行业、上市时间等数据
def get_index_data(indexs):
index_data={}
for name,code in indexs.items():
df=pro.index_daily(ts_code=code)
df.index=pd.to_datetime(df.trade_date)
index_data[name]=df.sort_index()
return index_data
#获取常见股票指数行情
indexs={'上证综指': '000001.SH','深证成指': '399001.SZ',
'沪深300': '000300.SH','创业板指': '399006.SZ',
'上证50': '000016.SH', '中证500': '000905.SH',
'中小板指': '399005.SZ','上证180': '000010.SH'}
index_data=get_index_data(indexs)
#index_data['上证综指'].head()
#对股价走势进行可视化分析
subjects =list(index_data.keys())
#每个子图的title
plot_pos = [421,422,423,424,425,426,427,428] # 每个子图的位置
new_colors = ['#1f77b4','#ff7f0e', '#2ca02c', '#d62728',
'#9467bd','#8c564b', '#e377c2',
'#7f7f7f','#bcbd22','#17becf']
plt.rcParams['savefig.dpi'] = 600 # 图片像素
plt.rcParams['figure.dpi'] = 600 # 分辨率
fig = plt.figure(figsize=(16,18))
fig.suptitle('A股股指走势',fontsize=18)
for pos in np.arange(len(plot_pos)):
ax = fig.add_subplot(plot_pos[pos])
y_data =index_data[subjects[pos]]['close']
b = ax.plot(y_data,color=new_colors[pos])
ax.set_title(subjects[pos])
# 将右上边的两条边颜色设置为空,相当于抹掉这两条边
ax = plt.gca()
ax.spines['right'].set_color('none')
ax.spines['top'].set_color('none')
plt.savefig(r'./01.jpg')
plt.show()
利用pandas API接口查询股票价格信息:
Pandas库提供了专门从财经网站获取金融数据的API接口,可作为量化交易股票数据获取的另一种途径,该接口在urllib3库基础上实现了以客户端身份访问网站的股票数据。
通过查看Pandas的手册可以发现,第一个参数为股票代码,苹果公司的代码为"AAPL",国内股市采用的输入方式“股票代码”+“对应股市”,上证股票在股票代码后面加上“.SS”,深圳股票在股票代码后面加上“.SZ”。DataReader可从多个金融网站获取到股票数据,如“Yahoo! Finance” 、“Google Finance”等,这里以Yahoo为例。第三、四个参数为股票数据的起始时间断。返回的数据格式为DataFrame。
i.先看一些简单的例子:
import pandas as pd
from pandas_datareader import data
import datetime
start = datetime.datetime(2016,1,1)
end = datetime.date.today()
apple = data.DataReader("AAPL", "yahoo", start, end)
#type(apple)
print(apple.head())
import os
os.chdir("d://")
import pandas as pd
import pandas_datareader.data as web
from pandas.util.testing import assert_frame_equal
import datetime
x="TSLA"
start = datetime.datetime(2012, 1, 2) # or start = '1/1/2016'
end = datetime.date.today()
df = web.DataReader(x,"yahoo",start,end)
#df.columns
df.to_csv(f'stock_{x}.csv')
import pandas_datareader.data as web
import datetime as dt
start = dt.datetime(2021,1,1)#获取数据的时间段-起始时间
#end = dt.datetime(2021,6,10)#获取数据的时间段-结束时间
end = dt.date.today()#结束时间为当前时间
stockData = web.DataReader("603927.SS", "yahoo", start, end)#股票为中科软,数据源为雅虎
stockData.to_csv('./603927.csv')
ii.下面是综合性的例子,包括查询数据和出一些图形。
import bs4 as bs
import requests#python的http客户端
import pickle#用于序列化反序列化
import datetime as dt
import pandas as pd
import pandas_datareader.data as web
from matplotlib import style
import matplotlib.pyplot as plt
from matplotlib.pyplot import MultipleLocator
import os
os.mkdir("./StockData")
def DownloadStock():
style.use('ggplot')
start = dt.datetime(2018,1,1)
end = dt.datetime(2021,10,25)
#根据股票代码从雅虎财经读取该股票在制定时间段的股票数据
df = web.DataReader("600797.SS", 'yahoo',start,end)
#保存为对应的文件
df.to_csv('StockData/{}.csv'.format("600797"))
def PlotStock(data):
plt.rcParams['savefig.dpi'] = 600 # 图片像素
plt.rcParams['figure.dpi'] = 600 # 分辨率
plt.rcParams['font.sans-serif']=['SimHei'] #用来正常显示中文标签
#plt.rcParams['savefig.dpi'] = 700 #图片像素
x = data['Date']
plt.plot(x, data['Close'], label='Close')
plt.plot(x, data['Open'], label='Open')
plt.title('2018-2021年股票')
plt.xlabel('Date:2018-2021')
plt.legend(loc='best')
plt.savefig(r'StockData/01.jpg')
plt.show()
def udoPlotStock(data):
plt.rcParams['font.sans-serif']=['SimHei'] #用来正常显示中文标签
plt.rcParams['axes.unicode_minus']=False #用来正常显示负号
x = data['Date']
plt.plot(x, (data['Close']-data['Open']))
plt.title('2018-2021年股票')
plt.xlabel('Date:2018-2021')
plt.ylabel('涨跌',)
plt.savefig(r'StockData/02.jpg')
plt.show()
if __name__ == '__main__':
#获取三年股票数据
albbData=DownloadStock()
data=pd.read_csv(r'StockData/600797.csv')
#股票交易时间序列图
PlotStock(data)
#股票涨跌
udoPlotStock(data)
利用 AkShare 查询数据:Akshare 网址
是基于 Python 的财经数据接口库, 目的是实现对股票、期货、期权、基金、外汇、债券、指数、加密货币等金融产品的基本面数据、实时和历史行情数据、衍生数据从数据采集、数据清洗到数据落地的一套工具,主要用于学术研究目的。
#安装库 akshare
pip install akshare -i http://mirrors.aliyun.com/pypi/simple/ --trusted-host=mirrors.aliyun.com --upgrade
#查询 查询康美药业 股票
import akshare as ak
stock_zh_a_daily_qfq_df = ak.stock_zh_a_daily(symbol="sh600518", start_date="20150101", end_date="20211023", adjust="")
#adjust 默认返回不复权的数据; qfq: 返回前复权后的数据; hfq: 返回后复权后的数据
#或者:
stock_zh_a_hist_df = ak.stock_zh_a_hist(symbol="600518", period="daily", start_date="20170301", end_date='20211023', adjust="")
df = stock_zh_a_daily_hfq_d.iloc[:, 0:6] #筛选几行数据玩玩
df.reset_index(inplace = True) #启动重建索引
df['date'] = pd.to_datetime(df['date'],format='%Y-%m-%d') #此语句无用,date本为日期型
print(df)
df.set_index('date',inplace=True) #重新按照date值建立索引
df.rename(columns = {"index":"drop"},inplace=True) #将index字段变为drop名称
print(df)
#查询上证综合指数
import akshare as ak
stock_zh_index_daily_df = ak.stock_zh_index_daily(symbol="sh000001")
print(stock_zh_index_daily_df)
sh000001_close = stock_zh_index_daily_df['close']
print(sh000001_close)
%matplotlib inline
import matplotlib.pyplot as plt
from pylab import mpl
mpl.rcParams['font.sans-serif'] = ['simhei'] # 指定默认字体
mpl.rcParams['axes.unicode_minus'] = False # 解决保存图像是负号'-'显示为方块的问题
mpl.rcParams['figure.figsize'] = (15.0, 6.0)
sh000001_close.plot(linewidth=1)
plt.title("上证指数收盘价历史趋势")
plt.xlabel('时间')
plt.ylabel('收盘价')
plt.legend()
plt.show()
#查询 2021-10-29 日特定股票的收盘价
import akshare as ak
print(ak.__version__)
stock_info_a_code_name_df = ak.stock_info_a_code_name()
print(stock_info_a_code_name_df)
stocks=[('宁德时代', 18), ('亿纬锂能', 13), ('华友钴业', 12), ('富满电子', 12), ('容百科技', 10), ('全志科技', 9), ('天齐锂业', 7), ('天合光能', 7), ('星源材质', 7), ('石大胜华', 7), ('德业股份', 7), ('阳光电源', 7), ('赣锋锂业', 7), ('永兴材料', 6), ('恩捷股份', 6), ('晶澳科技', 6), ('科达制造', 5), ('振华科技', 5), ('火炬电子', 5), ('比亚迪', 5), ('杉杉股份', 5), ('新宙邦', 5), ('诺德股份', 5), ('嘉元科技', 5), ('中国宝安', 5), ('汇川技术', 4), ('晶方科技', 4), ('联泓新科', 4), ('士兰微', 4), ('天赐材料', 4), ('隆基股份', 4), ('舜宇光学科技', 3), ('融捷股份', 3), ('福莱特', 3), ('紫光国微', 3), ('道氏技术', 3), ('欣旺达', 3), ('永新光学', 3), ('拓邦股份', 3), ('三峡能源', 2), ('蔚蓝锂芯', 2), ('中科电气', 2), ('法拉电子', 2), ('东方日升', 2), ('鹏辉能源', 2), ('北方华创', 2), ('龙蟠科技', 2), ('通威股份', 2), ('中环股份', 2), ('先导智能', 2), ('特变电工', 2), ('福斯特', 2), ('正泰电器', 2), ('晶盛机电', 2), ('捷佳伟创', 2), ('中国中免', 2), ('抚顺特钢', 2), ('福耀玻璃', 2), ('中伟股份', 1), ('比亚迪股份', 1), ('海优新材', 1), ('中远海控', 1), ('苏文电能', 1), ('亿华通', 1), ('云铝股份', 1), ('国电南瑞', 1), ('派能科技', 1), ('南新制药', 1), ('埃斯顿', 1), ('赛意信息', 1), ('雅化集团', 1), ('药石科技', 1), ('山西焦煤', 1), ('紫金矿业', 1), ('华阳股份', 1), ('格林美', 1)]
for ii in stocks:
try:
id = ii[0]
# print(id)
df = ak.stock_zh_a_hist(symbol=stock_info_a_code_name_df[stock_info_a_code_name_df["name"] ==id]["code"].values[0], start_date="20211029", end_date='20211029')
print(id,df["收盘"].values[0])
except:
pass
国内外金融数据接口:
findatapy - 获取彭博终端,Quandl和雅虎财经的数据
googlefinance - 从谷歌财经获取实时股票价格
yahoo-finance - 从雅虎财经下载股票报价,历史价格,产品信息和财务报表
pandas-datareader - 从多个数据源获取经济/金融时间序列,包括谷歌财经,雅虎财经,圣路易斯联储(FRED),OECD, Fama/French,世界银行,欧元区统计局等,是Pandas生态系统的重要组成
pandas-finance - 提供高级接口下载和分析金融时间序列
pyhoofinance - 从雅虎财经批量获取股票数据
yfinanceapi - 从雅虎财经获取数据
yql-finance - 从雅虎财经获取数据
ystockquote - 从雅虎财经获取实时报价
wallstreet - 实时股票和期权报价
stock_extractor - 从网络上爬取股票信息
Stockex - 从雅虎财经获取数据
finsymbols - 获取全美证券交易所,纽约证券交易所和纳斯达克上市公司的详细数据
inquisitor - 从Econdb获取经济数据,Econdb是全球经济指标聚合器
chinesestockapi - 获取A股数据
exchange - 获取最新的汇率报价
ticks - 命令行程序,获取股票报价
pybbg - 彭博终端COM的Python接口
ccy - 获取外汇数据
tushare - 获取中国股票,基金,债券和期货市场的历史数据
jsm - 获取日本股票市场的历史数据
cn_stock_src - 从不同数据源获取中国的股票数据
coinmarketcap - 从coinmarketcap获取数字货币数据
after-hours - 获取美股盘前和盘后的市场价格
bronto-python - 整合Bronto API接口
pytdx - 获取中国国内股票的实时报价
pdblp - 整合Pandas和彭博终端的公共接口
tiingo - 从Tiingo平台获取股票日K线和实时报价/新闻流
IEX - 从IEX交易所获取股票的实时报价和历史数据
alpaca-trade-api - 从Alpaca平台获取股票实时报价和历史数据,并提供交易接口交易美股
metatrader5 - 集成Python和MQL5交易平台,适合外汇交易
akshare - 获取中国股票,基金,债券和宏观经济数据
yahooquery - 从雅虎财经获取数据
investpy - 从英为财经(Investing.com)获取数据
yliveticker - 从雅虎财经通过Websocket获取实时报价
python 通过爬虫获取A股上证所有股票历史数据
step 1 : 设计方案,分两步:>首先,从连板网获取上证所有股票名称和股票代码。然后,从雅虎财经(yahoo)根据股票代码获取该股票的数据。注意上证股票代码后要加".ss"深证要加".sz"
下面是代码:
首先从爬取所有股票名和code到本地,文件名为huStock.pickle
import bs4 as bs
import requests#python的http客户端
import pickle#用于序列化反序列化
import os
os.chdir("d:/") #运行程序后,请到 d://StockDir 目录中查看下载的数据
def GetHuStock():
res = requests.get('https://www.banban.cn/gupiao/list_sh.html')
#防止中文乱码
res.encoding = res.apparent_encoding
#使用bsoup的lxml样式
soup = bs.BeautifulSoup(res.text,'lxml')
#从html内容中找到类名为'u-postcontent cz'的div标签
content = soup.find('div',{'class':'u-postcontent cz'})
result= []
for item in content.findAll('a'):
result.append(item.text)
with open('huStock.pickle','wb') as f:
pickle.dump(result,f)
#然后读取该文件,根据code逐一下载股票数据并存放到本地指定目录下,方便以后进一步分析
import datetime as dt
import pandas as pd
import pandas_datareader.data as web
from matplotlib import style
import matplotlib.pyplot as plt
import os
def GetStockFromYahoo(isHaveStockCode = False):
if not isHaveStockCode:
GetHuStock()
with open('huStock.pickle','rb') as f:
tickets = pickle.load(f,encoding='gb2312')
if not os.path.exists('StockDir'):
os.makedirs('StockDir')
for ticket in tickets:
arr = ticket.split('(')
stock_name = arr[0]
stock_code = arr[1][:-1]+'.ss'
if os.path.exists('StockDir/{}.csv'.format(stock_name+stock_code)):
print('已下载')
else:
DownloadStock(stock_name,stock_code)
print('下载{}中...'.format(stock_name))
def DownloadStock(stockName,stockCode):
style.use('ggplot')
start = dt.datetime(2000,1,1)
end = dt.datetime(2021,10,25)
try:
df = web.DataReader(stockCode,'yahoo',start,end)
except Exception as e:
# 访问异常的错误编号和详细信息
print(e.args)
pass
#根据股票代码从雅虎财经读取该股票在制定时间段的股票数据
#df = web.DataReader(stockCode,'yahoo',start,end)
#保存为对应的文件
if stockName[0]!="*":
try:
df.to_csv('StockDir/{}.csv'.format(stockName+stockCode))
except Exception as e:
# 访问异常的错误编号和详细信息
print(e.args)
pass
else:
df.to_csv('StockDir/{}.csv'.format(stockName[1:]+stockCode))
GetStockFromYahoo()
在授课中,我们用到了ricequant米筐量化平台,其中的股票代码中,股票代码后缀使用了XSHG 和 XSHE等等,那么他们是什么意思?
2009年全国金融标准化技术委员会采标ISO 10383:2003 (Market Identification Code)为国家标准《证券和相关金融工具交易所和市场识别码》(GB/T23696-2009)
其中XSHG 代表 Shan(g)hai,XSHE 代表 Sh(e)nzhen。用来区别只使用6位代码的时候出现代码重名的问题。例如代码 000001,在上交所代表上证指数,在深交所则代表平安银行。
而按照此国家标准,代码全称 000001.XSHE 则代表深交所的平安银行,000001.XSHG 则代表上证指数。
为此常见的量化平台,例如聚宽提供了 API 函数 ,来进行常规的‘sh000001’,‘600519’等证券代码向ISO 10383:2003 (Market Identification Code)的归一化处理。
参考文章:Ref
通过akshare 查询新股信息:
stock_zh_a_new_em_df = ak.stock_zh_a_new_em()
print(stock_zh_a_new_em_df)
下面也是一个开源的数据仓库:
import baostock as bs
import pandas as pd
# 登陆系统
lg = bs.login()
# 显示登陆返回信息
print('login respond error_code:'+lg.error_code)
print('login respond error_msg:'+lg.error_msg)
# 获取行业分类数据
rs = bs.query_stock_industry()
# rs = bs.query_stock_basic(code_name="浦发银行")
print('query_stock_industry error_code:'+rs.error_code)
print('query_stock_industry respond error_msg:'+rs.error_msg)
# 打印结果集
industry_list = []
while (rs.error_code == '0') & rs.next():
# 获取一条记录,将记录合并在一起
industry_list.append(rs.get_row_data())
result = pd.DataFrame(industry_list, columns=rs.fields)
# 结果集输出到csv文件
result.to_csv("D:/stock_industry.csv", encoding="gbk", index=False)
print(result)
# 登出系统
bs.logout()
import baostock as bs
import pandas as pd
#### 登陆系统 ####
lg = bs.login()
# 显示登陆返回信息
print('login respond error_code:'+lg.error_code)
print('login respond error_msg:'+lg.error_msg)
#### 获取沪深A股历史K线数据 ####
# 详细指标参数,参见“历史行情指标参数”章节;“分钟线”参数与“日线”参数不同。“分钟线”不包含指数。
# 分钟线指标:date,time,code,open,high,low,close,volume,amount,adjustflag
# 周月线指标:date,code,open,high,low,close,volume,amount,adjustflag,turn,pctChg
rs = bs.query_history_k_data_plus("sh.600000",
"date,code,open,high,low,close,preclose,volume,amount,adjustflag,turn,tradestatus,pctChg,isST",
start_date='2017-07-01', end_date='2017-12-31',
frequency="d", adjustflag="3")
print('query_history_k_data_plus respond error_code:'+rs.error_code)
print('query_history_k_data_plus respond error_msg:'+rs.error_msg)
#### 打印结果集 ####
data_list = []
while (rs.error_code == '0') & rs.next():
# 获取一条记录,将记录合并在一起
data_list.append(rs.get_row_data())
result = pd.DataFrame(data_list, columns=rs.fields)
#### 结果集输出到csv文件 ####
result.to_csv("D:\\history_A_stock_k_data.csv", index=False)
print(result)
#### 登出系统 ####
bs.logout()