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

前言

使用Python开发一个股票项目。

项目地址:

https://github.com/pythonstock/stock

相关资料:

http://www.voidcn.com/article/p-rlenujpw-bpc.html

主要使用开发语言是python。

使用的lib库是pandas,tushare,TensorFlow,tornado等。

1,关于股票数据指标

上次研究了股票的数据指标。

主要指标有 CR指标 KDJ指标 SMA指标 MACD指标 BOLL指标 RSI指标 WR指标

CCI指标 TR、ATR指标 DMA指标 DMI,+DI,-DI,DX,ADX,ADXR指标

TRIX,MATRIX指标 VR,MAVR指标 等。

http://www.voidcn.com/article/p-dppdfmwz-bqy.html

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

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)

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。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值