量化双均线策略:(一)通过tushare获取股票数据

之前几篇通过爬虫与mysql数据库获取到所有股票数据,存在一个比较难处理的问题,就是数据为未复权,无法策略回测。为了获取到已复权数据,也是找了很多接口,最终发现tushare是一个不错的选择,不用存储在本地,程序运行时候保证联网,直接获取数据,最重要的是可以选择前复权或者后复权。

以下引用自官方网站http://tushare.org/index.html

 Tushare是一个免费、开源的python财经数据接口包。主要实现对股票等金融数据从数据采集、清洗加工 到 数据存储的过程,能够为金融分析人员提供快速、整洁、和多样的便于分析的数据,为他们在数据获取方面极大地减轻工作量,使他们更加专注于策略和模型的研究与实现上。考虑到Python pandas包在金融量化分析中体现出的优势,Tushare返回的绝大部分的数据格式都是pandas DataFrame类型,非常便于用pandas/NumPy/Matplotlib进行数据分析和可视化。

主要通过调用get_k_data函数获取前复权的股票数据。

#coding=utf-8
import tushare as ts

df = ts.get_k_data('002415', start='2017-04-10', end='2017-12-08')
print(type(df))

'''
结果如下:
df  <class 'pandas.core.frame.DataFrame'>
某一行<class 'pandas.core.series.Series'>
           date    open   close    high     low    volume    code
62   2017-04-10  21.267  21.280  21.510  21.024  116265.0  002415
63   2017-04-11  21.280  21.090  21.353  20.749  194550.0  002415
64   2017-04-12  21.103  21.044  21.353  20.808  135027.0  002415
65   2017-04-13  21.051  21.261  21.313  20.919  139556.0  002415
66   2017-04-14  21.701  21.412  22.042  21.333  276923.0  002415
67   2017-04-17  21.537  21.635  21.865  21.392  182432.0  002415
68   2017-04-18  21.858  22.469  22.548  21.727  366464.0  002415
69   2017-04-19  22.771  22.600  22.915  22.311  232475.0  002415
可以先统一将需要的data存储到DataRepository对象中,每个策略只需要一个数据库,故使用单例模式创建。

#coding=utf-8
import tushare as ts
import pandas as pd
import numpy as np
import math

def singleton(cls):
    def wrapper(code_list, starttime, endtime):
        if cls._instance is None:
            cls._instance = cls(code_list, starttime, endtime)
        return cls._instance
    return wrapper


@singleton
#DataRepository = singleton(DataRepository)
class DataRepository(object):
    _instance = None
    def __init__(self, code_list, starttime, endtime):
        self.all_data = {}
        for code in code_list:
            df = ts.get_k_data(code, starttime, endtime)
            df['ma5'] = df['close'].rolling(5).mean()
            df['ma10'] = df['close'].rolling(10).mean()
            df = df.dropna(how='any')
            self.all_data[code] = df


    def get_onecode_df(self, code):
        return self.all_data[code]
每个策略输入为一组code_list,然后将每个code对应的df存储到dict中当做data_repository对象的成员变量,方便随时调用。

由于tushare返回的数据并没有均线数据,可以通过rolling函数求得。

In [53]: print(df['close'].rolling(5).mean())
223       NaN
224       NaN
225       NaN
226       NaN
227    37.802
228    37.942
229    38.138
230    38.272
231    38.574
232    38.950
233    38.900
234    38.552
235    38.388
236    38.066
Name: close, dtype: float64
然后df.dropna()里面的how参数可以选择any或者all,any指某行只要有na就舍弃掉,all指只有当某行全部为na时候才舍弃。

df.dropna()返回的是一个复制对象,原来的df并不改变,需要赋值到原df。

展开阅读全文

没有更多推荐了,返回首页