续上一篇笔记。
下载数据的时候发现很慢,于是优化了数据表stock_daily_hfq,将ts_code从text类型变更为varchar(20),并加了普通索引。
数据很快就更新完了,从tushare中我获取到了将近800万条数据。
然后我们做一次“普通”的机器学习。
我选择用sklearn机器学习库中的SVM,全称为Support Vector Machine(支持向量机)。
于是安装:
pip3 install sklearn
因为sklearn依赖的一些库比如说scipy比较大,容易遇到失败,可以多试几次,也注意看报错的内容,可能会有其他的情况,随时调整和解决。
实现思路如下:
1、使用pandas从mysql按交易日从小到大获取ts_code000001.SZ的日线数据;
2、干掉index、ts_code、trade_date这三个列;
3、从第一天开始到最后第二天,生成训练集;
4、从第二天开始到最后一天,计算其涨跌幅,生成结果集;
5、取最后一天,生成测试训练集;
6、使用SVM得出预测涨跌幅;
7、修改代码逻辑,使得遍历所有股票得出涨跌幅,并保存起来。
在实现的时候遇到以下问题并给出相应处理方案:
1、open、close、change为mysql保留关键字,在sql中全部使用``框起来;
2、发现一些值,比如说均线相关的值存在NaN的情况,这里存在NaN基本上是因为数据量不足以生成均线数据,所以使用df.fillna(0)的方式将值填充为0;
3、发现更糟糕的事情,最新的数据里,也存在均线数据为NULL的情况,只能放弃这些列了;
4、SVM是向量,应该只能预测两个值,跌或涨,所以不预测涨跌幅;
实现代码如下:
#coding=utf-8
import pandas
from common import ts
from common import db
from sklearn import svm
# 1、使用pandas从mysql按交易日从小到大获取ts_code000001.SZ的日线数据;
# 2、干掉index、ts_code、trade_date这三个列;
# 3、从第一天开始到最后第二天,生成训练集;
# 4、从第二天开始到最后一天,计算其涨跌幅,涨为1,跌为-1;
# 5、取最后一天,生成测试训练集;
# 6、使用SVM得出预测涨跌幅;
# 7、修改代码逻辑,使得遍历所有股票得出涨跌情况,并保存起来。
def analysis(ts_code):
sql = """select `open`,high,low,`close`,pre_close,`change`,if(pct_chg>=0,1,-1) pct_chg,vol,amount,turnover_rate,volume_ratio from stock_daily_hfq
where ts_code = \'%s\' order by trade_date asc
"""%ts_code
df = pandas.read_sql(sql, ts.get_engine())
df = df.fillna(0)#NaN填充0
df_shape_0 = df.shape[0] #获得行数
if df_shape_0 <= 1:
return 0 #数据太少,返回0
x_train = df[0:df_shape_0-1]
y_train = df[1:df_shape_0]['pct_chg']
x_test = df.tail(1)
model = svm.SVC() # 建模
model.fit(x_train.values, y_train.values) # 训练
ans = model.predict(x_test.values) # 预测
return ans[0]
conn = db.get_stock_conn()
cursor = conn.cursor()
cursor.execute("select ts_code from stock_basic where industry = '证券'")
rows = cursor.fetchall()
for i in range(len(rows)):
ts_code = rows[i][0]
ret = analysis(ts_code)
cursor.execute("insert into stock_daily_analysis(ts_code, ana) VALUE (\'%s\',%d)" % (ts_code, ret))
conn.commit()
因为有消息推测说周一券商要涨,于是跑了次券商,发现果然大部分都是要涨的,47只券商股,只有10只预测结果是跌的,37只上涨。
1 000166.SZ 1 2019-04-22 00:36:52
2 000686.SZ 1 2019-04-22 00:36:53
3 000712.SZ 1 2019-04-22 00:36:54
4 000728.SZ 1 2019-04-22 00:36:54
5 000750.SZ 1 2019-04-22 00:36:55
6 000776.SZ 1 2019-04-22 00:36:56
7 000783.SZ 1 2019-04-22 00:36:57
8 002500.SZ 1 2019-04-22 00:36:57
9 002670.SZ 1 2019-04-22 00:36:57
10 002673.SZ 1 2019-04-22 00:36:57
11 002736.SZ -1 2019-04-22 00:36:57
12 002797.SZ -1 2019-04-22 00:36:57
13 002926.SZ 1 2019-04-22 00:36:57
14 002939.SZ 1 2019-04-22 00:36:57
15 002945.SZ 1 2019-04-22 00:36:57
16 300059.SZ 1 2019-04-22 00:36:57
17 600030.SH 1 2019-04-22 00:36:58
18 600061.SH 1 2019-04-22 00:36:59
19 600109.SH 1 2019-04-22 00:37:00
20 600155.SH 1 2019-04-22 00:37:00
21 600369.SH 1 2019-04-22 00:37:01
22 600621.SH 1 2019-04-22 00:37:02
23 600837.SH 1 2019-04-22 00:37:04
24 600864.SH 1 2019-04-22 00:37:05
25 600909.SH -1 2019-04-22 00:37:05
26 600958.SH -1 2019-04-22 00:37:05
27 600999.SH -1 2019-04-22 00:37:05
28 601066.SH 1 2019-04-22 00:37:05
29 601099.SH 1 2019-04-22 00:37:05
30 601108.SH 1 2019-04-22 00:37:05
31 601162.SH 1 2019-04-22 00:37:05
32 601198.SH -1 2019-04-22 00:37:05
33 601211.SH 1 2019-04-22 00:37:05
34 601375.SH -1 2019-04-22 00:37:06
35 601377.SH -1 2019-04-22 00:37:06
36 601555.SH 1 2019-04-22 00:37:06
37 601688.SH -1 2019-04-22 00:37:06
38 601788.SH -1 2019-04-22 00:37:06
39 601878.SH 1 2019-04-22 00:37:06
40 601881.SH 1 2019-04-22 00:37:06
41 601901.SH 1 2019-04-22 00:37:06
42 601990.SH 1 2019-04-22 00:37:06
好了,半夜了,今天就试验到这里,等周一收盘了,再看下结果吧。
ps:检查数据时发现,我的数据截止到4-18,所以预测的是4.19的券商股涨跌,稍微看了下4.19券商的数据,全是红的,那么说预测准确率初步在80%