PythonStock(14):使用pandas 批量处理股票数据,批量计算股票指标

41 篇文章 315 订阅
30 篇文章 152 订阅

前言

使用Python开发一个股票项目。
项目地址:
https://github.com/pythonstock/stock
相关资料:
http://blog.csdn.net/freewebsys/article/details/78294566
主要使用开发语言是python。
使用的lib库是pandas,tushare,TensorFlow,tornado等。

本文的原文连接是: http://blog.csdn.net/freewebsys/article/details/78608158
未经博主允许不得转载。
博主地址是:http://blog.csdn.net/freewebsys

1,关于股票数据指标


上次研究了股票的数据指标。
主要指标有 CR指标 KDJ指标 SMA指标 MACD指标 BOLL指标 RSI指标 WR指标
CCI指标 TR、ATR指标 DMA指标 DMI,+DI,-DI,DX,ADX,ADXR指标
TRIX,MATRIX指标 VR,MAVR指标 等。
http://blog.csdn.net/freewebsys/article/details/78578548

下面要将这个数据,放到后台跑数据。

2,首先查询要跑的股票数据


查询 一共有多少count

sql_count = """
    SELECT count(1) FROM stock_data.ts_today_all WHERE `date` = %s and `trade` > 0 and `open` > 0 and trade <= 20 
                and `code` not like %s and `code` not like %s and `name` not like %s
    """
    count = common.select_count(sql_count, params=[datetime_int, '002%', '300%', '%st%'])
    print("count :", count)

然后按照每次 100 个执行程序:

batch_size = 100
    end = int(math.ceil(float(count) / batch_size) * batch_size)
    print(end)
    for i in range(0, end, batch_size):
        print("loop :", i)
        # 查询今日满足股票数据。剔除数据:创业板股票数据,中小板股票数据,所有st股票
        # #`code` not like '002%' and `code` not like '300%'  and `name` not like '%st%'
        sql_1 = """ 
                    SELECT `date`, `code`, `name`, `changepercent`, `trade`, `open`, `high`, `low`, 
                        `settlement`, `volume`, `turnoverratio`, `amount`, `per`, `pb`, `mktcap`, `nmc` 
                    FROM stock_data.ts_today_all WHERE `date` = %s and `trade` > 0 and `open` > 0 and trade <= 20 
                        and `code` not like %s and `code` not like %s and `name` not like %s limit %s , %s
                    """
        print(sql_1)
        data = pd.read_sql(sql=sql_1, con=common.engine(), params=[datetime_int, '002%', '300%', '%st%', i, batch_size])
        data = data.drop_duplicates(subset="code", keep="last")
        print("########data[trade]########:", len(data))
        stat_index_all(data, i)

剔除到一些数据。

然后使用数组用 statstock lib库进行数据统计:
stock_column = ['adx', 'adxr', 'boll', 'boll_lb', 'boll_ub', 'cci', 'cci_20', 'close_-1_r',
                    'close_-2_r', 'code', 'cr', 'cr-ma1', 'cr-ma2', 'cr-ma3', 'date', 'dma', 'dx',
                    'kdjd', 'kdjj', 'kdjk', 'macd', 'macdh', 'macds', 'mdi', 'pdi',
                    'rsi_12', 'rsi_6', 'trix', 'trix_9_sma', 'vr', 'vr_6_sma', 'wr_10', 'wr_6']
    # code     cr cr-ma1 cr-ma2 cr-ma3      date

    data_new = concat_guess_data(stock_column, data)

这个数据是 要排序的,所以要特殊排列。

stock_data_list = []
    print("########################## 计算结果 ##########################")
    for col in stock_column:
        if col == 'date':
            stock_data_list.append(date)
        elif col == 'code':
            stock_data_list.append(code)
        else:
            # 将数据的最后一个返回。
            tmp_val = stockStat[col].tail(1).values[0]
            if np.isinf(tmp_val):  # 解决值中存在INF问题。
                tmp_val = 0
            if np.isnan(tmp_val):  # 解决值中存在NaN问题。
                tmp_val = 0
            # print("col name : ", col, tmp_val)
            stock_data_list.append(tmp_val)

    # print(stock_data_list)
    return list(stock_data_list)

最后将计算后的结果保存到数据库。
详细代码参考:
https://github.com/pythonstock/stock/blob/master/jobs/guess_indicators_daily_job.py

3,使用pickle 做缓存,减少网络访问


在处理数据的时候,第一次链接网络,然后保存到本地pickle 文件。
做缓存,防止过分访问api 接口被封掉。

# 设置基础目录,每次加载使用。
bash_stock_tmp = "/tmp/stock/hist_data_cache/"
if not os.path.exists(bash_stock_tmp):
    os.makedirs(bash_stock_tmp)  # 创建多个文件夹结构。
    print("######################### init tmp dir #########################")

# 增加读取股票缓存方法。加快处理速度。
def get_hist_data_cache(code, date_start, date_end):
    cache_file = bash_stock_tmp + "%s^%s.gzip.pickle" % (date_end, code)
    # 如果缓存存在就直接返回缓存数据。压缩方式。
    if os.path.isfile(cache_file):
        print("######### read from cache #########", cache_file)
        return pd.read_pickle(cache_file, compression="gzip")
    else:
        stock = ts.get_hist_data(code, start=date_start, end=date_end)
        stock = stock.sort_index(0)  # 将数据按照日期排序下。
        stock.to_pickle(cache_file, compression="gzip")
        return stock

4,发现入库问题


在进行计算的时候发现 inf 字段错误。找了半天,发现是 一个指标 cci 在计算的时候出现了。
inf 和 nan 类型问题。是一个数字类型,但是入库的时候当做一个字段了。

tmp_val = stockStat[col].tail(1).values[0]
            if np.isinf(tmp_val):  # 解决值中存在INF问题。
                tmp_val = 0
            if np.isnan(tmp_val):  # 解决值中存在NaN问题。
                tmp_val = 0
            # print("col name : ", col, tmp_val)
            stock_data_list.append(tmp_val)

使用程序 np.isinf 和 np.isnan 将数据过滤掉。

5,指标计算出之后,进行第二次筛选


SELECT `date`, `code`, `name`, `changepercent`, `trade`, `open`, `high`, `low`, 
                            `settlement`, `volume`, `turnoverratio`, `amount`, `per`, `pb`, `mktcap`,
                             `nmc` ,`kdjj`,`rsi_6`,`cci`
                        FROM stock_data.guess_indicators_daily WHERE `date` = %s 
                        and kdjj > 100 and rsi_6 > 80  and cci > 100

可以筛选出几个股票。

掌握了问题的分析方法,就是不知道能不能碰对。

6,总结


在使用pandas 计算的时候,开始的思路是一个指标一个指标进行计算。
这样发现在循环 1200 多次之后,股票数据计算出现大量循环。效率低了。
后来修改成数组一次性计算。减少了N次循环。效率上来了。
pandas 进行数组计算,效率杠杠的,很难想象使用 java c++ 要开发多长时间。
而且关键是运行的效率也不慢,要是真的慢,换个8核cpu就好了。
人生苦短,快学python。

本文的原文连接是: http://blog.csdn.net/freewebsys/article/details/78608158
未经博主允许不得转载。
博主地址是:http://blog.csdn.net/freewebsys

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值