您的位置:首页 > 编程语言 > Python开发

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

2017-11-22 21:28 871 查看
前言

使用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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  python stock