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)

 

 

 

posted on 2024-04-12 21:54  麦克煎蛋  阅读(1804)  评论(0编辑  收藏  举报