从零开始用Python实现股票量化交易之小白笔记(7)

续上一篇笔记。

下载数据的时候发现很慢,于是优化了数据表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%

 

你可能感兴趣的:(python,量化交易,股票,数据分析,pandas,mysql,tushare)