开发自己的量化交易系统,5年一个亿(二)------获取单个股票行情并导出

340 阅读3分钟

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

开发自己的交易系统系列

开发自己的量化交易系统,5年一个亿(一)------获取所有股票列表 - 掘金 (juejin.cn)

前言

上一章我们讲了获取所有的股票列表,这一章开始我们开始讲获取单个的股票行情

获取股票的 K 线数据 API

我们使用的获取股票数据的平台是API REFERENCE - efinance 0.5.0 documentation

image.png

从上面的api中我们可以看出,我们写自己的函数,需要传入code,开始时间,结束时间

获取单个股票行情

def get_single_stock_price(code, start_time=None, end_time=None):
    """
    # 获取单个股票行情
    :param code 股票代码
    :param end_time 获取股票结束时间
    :param start_time 获取股票开始时间
    :return
    """
    # 时间转化
    if start_time:
        start_time = start_time.replace('-', '');
    if end_time:
        end_time = end_time.replace('-', '');
    # 如果start_time为None的话,那么为上市开始时间
    if start_time is None and end_time is None:
        data = ef.stock.get_quote_history(code);
    elif end_time is None and start_time:
        data = ef.stock.get_quote_history(code, start_time);
    else:
        data = ef.stock.get_quote_history(code, start_time, end_time);
    data = handle_data(data);
    return data[['name', 'code', 'date', 'open', 'close', 'close_pct', 'volume']];

handle_data为转化数据的函数,因为efinance平台返回的数据都是中文的,所以我们转化一下英文

def handle_data(data):
    # 数据转化
    data.rename(
        columns={
            "股票名称": 'name',
            "股票代码": 'code',
            "日期": 'date',
            "开盘": 'open',
            "收盘": 'close',
            "最高": 'high',
            "最低": "low",
            "涨跌幅": 'close_pct',
            "成交量": 'volume',
            "成交额": 'money'
        },
        inplace=True
    );
    # data.index = pd.to_datetime(data['date']);
    return data;

我们使用平安银行进行测试一下000001

我们现在也不需要太多数据,就返回这些数据吧

'name', 'code', 'date', 'open', 'close', 'close_pct', 'volume'
data = st.get_single_stock_price('000001');
print(data);

image.png

测试一下ok

导出数据

有同学说为什么不把数据存储到数据库,而是导出到本地,我们现在是先导出到本地,后面我们会学习导入到数据库,一步一步来

导出数据要注意几个点

  • 我们的数据会重复,这个时候我们就要以时间为准删除重复的值
  • 新加入的数据根据时间要排到后面,所以不需要header部分

确认参数

  • data: 传入的数据
  • filename: 文件名:请传入code
  • to_csv的模式: mode为a是新加入数据,否则就是重新写入
def export_stock_data(data,  filename, mode=None):
    """
    :param data: 传入的数据
    :param filename: 文件名:请传入code
    :param mode: to_csv的模式: mode为a是新加入数据,否则就是重新写入
    :return:
    """
    # 导出股票行情
    file_root = '/Users/wson/Desktop/Trader/data/' + filename + '.csv';
    # 如果mode为a那么就是新添加数据
    if mode == 'a':
        # 因为是新加入的数据,要排到后面,所以header为false
        data.to_csv(file_root, mode=mode, header=False);
        # 删除重复值
        data = pd.read_csv(file_root);
        # 以日期为准进行删除重复值
        data = data.drop_duplicates(subset=['date']);
        data = data.sort_values('date');
        data.to_csv(file_root, index=False);
    # 否则就是重新写入数据
    else:
        data.to_csv(file_root);
    print('已成功存储至:', file_root);

修改一下数据处理函数。因为现在我们的索引数字,如果再添加新的数据,新的数据第一个序号还是1,所以这就重复了,所以我们修改一下,如果数据中含有时间,那么以时间为索引

def handle_data(data):
    ...
    if 'date' in data:
        data.index = pd.to_datetime(data['date']);
    return data;

此时我们开始进行测试

我们的时间间隔小一点,方便观察数据

code = '000001';
data = st.get_single_stock_price('000001', '20191201', '20191210');
st.export_stock_data(data, code);
print(data);

image.png

没错good

然后开始时间改成20191201,结束时间改成20191210看是否时间添加到前面了,因为是添加数据,所以modea

code = '000001';
data = st.get_single_stock_price(code, '20191101', '20191110');
st.export_stock_data(data, code, 'a');
print(data);

image.png

依然正确,good