Python量化交易系统实战--获取股票数据
作者:麦克煎蛋 出处:https://www.cnblogs.com/mazhiyong/ 转载请保留这段声明,谢谢!
我们首先需要获取股票数据。
代码IDE选择:PyCharm
计算机环境:MacOS
一、获取股票数据的三种方式
二、获取股票数据
这里选定的是使用JoinQuant平台提供的免费接口(有时间范围限制),简单整理如下。
使用前需要先申请权限并初始化授权:
from jqdatasdk import * auth('', '') # 账号是申请时所填写的手机号
获取所有A股股票列表
def get_stock_list(): """ 获取所有A股股票列表 上海证券交易所.XSHG 深圳证券交易所.XSHE :return: stock_list """ stock_list = list(get_all_securities(['stock']).index) return stock_list
获取单个股票行情数据
def get_single_price(code, time_freq, start_date=None, end_date=None): """ 获取单个股票行情数据 :param code: :param time_freq: :param start_date: :param end_date: :return: """ # 如果start_date=None,默认为从上市日期开始 if start_date is None: start_date = get_security_info(code).start_date if end_date is None: end_date = datetime.datetime.today() # 获取行情数据 data = get_price(code, start_date=start_date, end_date=end_date, frequency=time_freq, panel=False) return data
将数据转换为指定周期:通过resample函数
def transfer_price_freq(data, time_freq): """ 将数据转换为指定周期:开盘价(周期第1天)、收盘价(周期最后1天)、最高价(周期内)、最低价(周期内) :param data: :param time_freq: :return: """ df_trans = pd.DataFrame() df_trans['open'] = data['open'].resample(time_freq).first() df_trans['close'] = data['close'].resample(time_freq).last() df_trans['high'] = data['high'].resample(time_freq).max() df_trans['low'] = data['low'].resample(time_freq).min() return df_trans
获取单个股票财务指标
def get_single_finance(code, date, statDate): """ 获取单个股票财务指标 :param code: :param date: :param statDate: :return: """ data = get_fundamentals(query(indicator).filter(indicator.code == code), date=date, statDate=statDate) # 获取财务指标数据 return data
获取单个股票估值指标
def get_single_valuation(code, date, statDate): """ 获取单个股票估值指标 :param code: :param date: :param statDate: :return: """ data = get_fundamentals(query(valuation).filter(valuation.code == code), date=date, statDate=statDate) # 获取财务指标数据 return data
三、本地化股票数据
1、为什么做本地化数据
- 降低数据使用费用,可每日增量更新数据。
- 提高访问速度。
2、本地化数据
这里采用了csv文件来存取本地化数据。其实从操作的便利性来说,个人更推崇使用sqlite或者mysql数据库。
数据写入csv文件:
def export_data(data, filename, type, mode=None): """ 导出股票相关数据 :param data: :param filename: :param type: 股票数据类型,可以是:price、finance :param mode: a代表追加,none代表默认w写入 :return: """ file_root = data_root + type + '/' + filename + '.csv' data.index.names = ['date'] if mode == 'a': data.to_csv(file_root, mode=mode, header=False) # 删除重复值 data = pd.read_csv(file_root) # 读取数据 data = data.drop_duplicates(subset=['date']) # 以日期列为准 data.to_csv(file_root, index=False) # 重新写入 else: data.to_csv(file_root) # 判断一下file是否存在 > 存在:追加 / 不存在:保持 print('已成功存储至:', file_root)
读取本地数据:
def get_csv_price(code, start_date, end_date, columns=None): """ 获取本地数据,且顺便完成数据更新工作 :param code: str,股票代码 :param start_date: str,起始日期 :param end_date: str,起始日期 :param columns: list,选取的字段 :return: dataframe """ # 使用update直接更新 update_daily_price(code) # 读取数据 file_root = data_root + 'price/' + code + '.csv' if columns is None: data = pd.read_csv(file_root, index_col='date') else: data = pd.read_csv(file_root, usecols=columns, index_col='date') # print(data) # 根据日期筛选股票数据 return data[(data.index >= start_date) & (data.index <= end_date)]
更新数据:
def update_daily_price(stock_code, type='price'): # 3.1是否存在文件:不存在-重新获取,存在->3.2 file_root = data_root + type + '/' + stock_code + '.csv' if os.path.exists(file_root): # 如果存在对应文件 # 3.2获取增量数据(code,startsdate=对应股票csv中最新日期,enddate=今天) startdate = pd.read_csv(file_root, usecols=['date'])['date'].iloc[-1] df = get_single_price(stock_code, 'daily', startdate, datetime.datetime.today()) # 3.3追加到已有文件中 export_data(df, stock_code, 'price', 'a') else: # 重新获取该股票行情数据 df = get_single_price(stock_code, 'daily') export_data(df, stock_code, 'price') print("股票数据已经更新成功:", stock_code)