lecture 2:Python数据导入导出

本文详细介绍了Python中数据的导入与导出操作,包括使用statsmodels、pandas等库处理CSV、Excel和TXT文件。讲解了如何读取CSV、Excel数据,以及如何设置分隔符和索引。此外,还提到了财经数据的在线下载,如tushare、pandas_datareader等,并介绍了AkShare和证券宝等财经数据接口库。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

python数据导入、导出

statsmodel模块网址

计量主要调用的模块:statsmodels is a Python module that provides classes and functions for the estimation of many different statistical models

在计量实战中,我们保留的数据格式主要是 TXT、CSV、Excel 三种格式,其中TXT、CSV更为通用和更少出错

  1. 常用的包
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
  1. 读入CSV数据
import pandas as pd
df = pd.read_csv("D:\\myfolder\\xl1-1.csv")
print(df)
  1. 读入Excel数据
    #读取excel之前先打开命令行,安装xlrd。即在命令行中输入pip install xlrd。
import pandas as pd
df = pd.read_excel("D:\\myfolder\\test.xlsx")
print(df)
  1. 导出到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去掉行名称导出

  1. 导出到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)

下面也是一个开源的数据仓库:

证券宝www.baostock.com



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()

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值