一.简介
在笔者的上篇文章中,已经能够简单的下载一只股票的数据以及完成导入数据库和进行数据库,实现股票数据的更新等的相关操作,在这篇博客中,笔者将实现利用接口实现所有数据的下载,并计算均值实现均值排序等。
有关tushare的一些基本操作,如果读者不太熟悉,可参考笔者的上一篇文章:
二.下载所有股票
当我们想要下载所有的股票数据时,我们可以登录tushare的官网查看对应的接口:
但笔者需注意这里的stock_basic接口是需要一定的积分的,如果没有积分或积分不足,需要积累一定的积分才能使用该接口。
首先我们要获取当前可获取的股票列表:
df_stockBaseData = pro.query('stock_basic', exchange='', list_status='L', fields='ts_code,symbol,name,area,industry,list_date')
stock_list = df_stockBaseData['ts_code']
stock_basic输入的参数如下:
当我们获取了可用的接口后,由于下载的股票数据较多(大概有6000支可获取股票),我们可以建立一个文件夹来专门放股票数据:
import os # 创建文件夹需要导入os模块
data_folder = 'stock_data'
if not os.path.exists(data_folder):
os.makedirs(data_folder)
这样我们就创建好了一个专门存放股票数据的文件夹
然后我们就可以利用遍历实现6000支股票的下载:
# 遍历股票列表
for code in stock_list:
# 获取股票历史数据
stock_data = pro.query('daily', ts_code=code, start_date='19800203', end_date='')
# 如果获取到了数据,则保存到CSV文件中
if stock_data is not None:
file_name = f"{data_folder}/{code}.csv"
stock_data.to_csv(file_name)
read_write_csv(file_name)
print(f"保存股票 {code} 数据到文件 {file_name}")
注意在笔者的代码中,笔者使用了一个转化格式的函数(read_write_csv),如果看过笔者上一篇文章的话,笔者也用了一个相同的函数,笔者在这篇文章中对这个函数做了进一步的改善,可以直接在原文件上进行转化格式:
def read_write_csv(from_file):
feed = csvfeed.Feed("trade_date", "%Y%m%d")
feed.addValuesFromCSV(from_file)
file = open(from_file, "w")
file.write("Date Time,Open,High,Low,Close,Volume,Adj Close")
file.write("\n")
for dateTime, value in feed:
str_datetime = dateTime.strftime("%Y-%m-%d")
file.write("%s,%.2f,%.2f,%.2f,%.2f,%.2f,%.2f" % (str_datetime, value['open'], value['high'], value['low'], value['close'], value['vol'], value['close']))
file.write("\n")
file.close()
效果图如下:
总代码如下:
import tushare as ts
import os
from pyalgotrade.feed import csvfeed
def read_write_csv(from_file):
feed = csvfeed.Feed("trade_date", "%Y%m%d")
feed.addValuesFromCSV(from_file)
file = open(from_file, "w")
file.write("Date Time,Open,High,Low,Close,Volume,Adj Close")
file.write("\n")
for dateTime, value in feed:
str_datetime = dateTime.strftime("%Y-%m-%d")
file.write("%s,%.2f,%.2f,%.2f,%.2f,%.2f,%.2f" % (str_datetime, value['open'], value['high'], value['low'], value['close'], value['vol'], value['close']))
file.write("\n")
file.close()
if __name__ == '__main__':
pro = ts.pro_api()
df_stockBaseData = pro.query('stock_basic', exchange='', list_status='L', fields='ts_code,symbol,name,area,industry,list_date')
stock_list = df_stockBaseData['ts_code']
data_folder = 'stock_data'
if not os.path.exists(data_folder):
os.makedirs(data_folder)
# 遍历股票列表
for code in stock_list:
# 获取股票历史数据
stock_data = pro.query('daily', ts_code=code, start_date='19800203', end_date='')
# 如果获取到了数据,则保存到CSV文件中
if stock_data is not None:
file_name = f"{data_folder}/{code}.csv"
stock_data.to_csv(file_name)
read_write_csv(file_name)
print(f"保存股票 {code} 数据到文件 {file_name}")
print("数据保存完成!")
笔者在此再次提醒,一定要有一定的积分才能使用stock_basic这个接口。
三.股票的均值计算
由于我们上面已经下载了对应的csv文件,并且都放在同一个文件夹当中,所以我们可以直接对文件夹中的文件进行操作:
笔者这里给出两个os库里的函数,对于遍历文件夹里的文件有帮助:
这两个函数对于操作文件,寻找到文件的路径有很大的帮助:
path = 'F:/tushare国内股票数据/The Last/stock_data'
file_dir = os.listdir(path)
for file in file_dir:
domain = os.path.abspath(path)
file_name = file
file = os.path.join(domain, file)
排序的话我们可以使用pandas里的dataframe来存储每支股票的均值,进而使用sort_values函数来进行排序。
首先当我们获取文件路径后我们可以读取文件中的内容,来计算均值:
df = pd.read_csv(file, parse_dates=['Close'], index_col=['Date Time'], sep=',')
df[file_name] = df['Close'].rolling(10).mean()
其中df['Close']代表Close列的数据,rolling函数表示以多少天为基础,来计算移动平均,mean()函数即代表均值的计算。
最后我们再添加一个dataframe来保存各个数据
最终代码如下:
import pandas as pd
import os
if __name__ == '__main__':
path = 'F:/tushare国内股票数据/The Last/stock_data'
file_dir = os.listdir(path)
data = pd.DataFrame()
for file in file_dir:
domain = os.path.abspath(path)
file_name = file
file = os.path.join(domain, file)
df = pd.read_csv(file, parse_dates=['Close'], index_col=['Date Time'], sep=',')
df[file_name] = df['Close'].rolling(10).mean()
data = data.append(df[file_name].tail(1))
data.columns = ['Close']
data = data.sort_values(by="Close", ascending=False)
print(data.head(10))
计算成功后,我们选取均值前十进行展示: