开发自己的量化交易系统,5年一个亿(三)------从csv文件获取股票数据

343 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 13 天,点击查看活动详情

前言

相信自己,一定可以实现小目标,撸起袖子就是干,加油!!!⛽️

上一章我们讲了获取单个股票行情,并存入csv文件

今天我们的任务是:

  • 完成数据的更新,就是每次我们在获取数据的时候,先根据股票代码,读取csv文件,获取当前csv的最后一天的时间,在更新文件中最后一天到今天的数据进行查询,写入到csv文件中
  • 读取csv文件,获取

更新csv文件中当前股票数据

  • 首先判断当前股票的csv文件是否存在
    • 不存在-重新获取
    • 存在-获取csv文件中的最后一天,然后请求csv文件中的最后一天到今天的数据,并写入csv文件中
# 全局变量
data_root = '/Users/wson/Desktop/Trader/data/';

def update_daily_price(stock_code, start_data):
    # 是否存在文件:不存在-重新获取, 存在-获取csv文件中的最后一天,然后请求csv文件中的最后一天到今天的数据,并写入csv文件中
    file_root = data_root + '/' + stock_code + '.csv';
    # 如果存在对应文件
    if os.path.exists(file_root):
        # 读取csv文件,并获取csv文件中最后一天的时间
        startdate = pd.read_csv(file_root, usecols=['date'])['date'].iloc[-1];
        # 请求csv文件中最后一天到今天的数据
        df = get_single_stock_price(stock_code, startdate, datetime.datetime.today().strftime('%Y%m%d'));
        # 添加到csv文件中
        export_stock_data(df, stock_code, 'price', 'a');
    else:
        # 重新获取该股票行情数据
        df = get_single_stock_price(stock_code);
        export_stock_data(df, stock_code, 'price');
    print('数据已经更新成功', stock_code);

但是我们此时发现一个问题,如果我们想获取的数据的开始时间小于csv文件中的开始时间怎么办,所以我们还得在方法中添加一个参数start_data,用来判断start_data是小于csv文件的时间列的第一个值

  • 大于等于:不用更新数据
  • 小于: 更新从start_datacsv文件第一个时间的数据,存入csv文件
# 判断start_data是小于csv文件的时间列的第一个值
csv_start_data = date_columns_data['date'].iloc[1];
# 转化为时间戳
t1 = pd.Timestamp(start_data)
t2 = pd.Timestamp(csv_start_data)
if t1 < t2:
    print("执行了");
    # 请求t1到t2的时间
    df = get_single_stock_price(stock_code, start_data, csv_start_data);
    # 添加到csv文件中
    export_stock_data(df, stock_code, 'a');

最后的update_daily_price函数

def update_daily_price(stock_code, start_data):
    # 是否存在文件:不存在-重新获取, 存在-获取csv文件中的最后一天,然后请求csv文件中的最后一天到今天的数据,并写入csv文件中
    file_root = data_root + '/' + stock_code + '.csv';
    date_columns_data = pd.read_csv(file_root, usecols=['date']);
    # 如果存在对应文件
    if os.path.exists(file_root):
        # 读取csv文件,并获取csv文件中最后一天的时间
        startdate = date_columns_data['date'].iloc[-1];
        # 请求csv文件中最后一天到今天的数据
        df = get_single_stock_price(stock_code, startdate, datetime.datetime.today().strftime('%Y%m%d'));
        # 添加到csv文件中
        export_stock_data(df, stock_code, 'a');
    else:
        # 重新获取该股票行情数据
        df = get_single_stock_price(stock_code);
        export_stock_data(df, stock_code);
    # 判断start_data是小于csv文件的时间列的第一个值
    csv_start_data = date_columns_data['date'].iloc[0];
    # 转化为时间戳
    if start_data < csv_start_data:
        print("执行了");
        # 请求t1到t2的时间
        df = get_single_stock_price(stock_code, start_data, csv_start_data);
        # 添加到csv文件中
        export_stock_data(df, stock_code, 'a');
    print('数据已经更新成功', stock_code);

获取csv文件中的数据

这个获取数据就很好获取了,但是有时候我们只是获取某些列,并不是全部的列,这个时候我们可以加一个column, 类型为list, 用来告诉读取csv文件的时候,只读取部分列,并不是全部的列

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, start_date);
    # 读取数据
    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')
    # 根据日期筛选股票数据
    return data[(data.index >= start_date) & (data.index <= end_date)];

接下来进行测试

import data.stock as st;

code = '000001';
data = st.get_csv_price(code, '2019-10-20');
print(data);

image.png

good 没有来问题