在上一篇文章中《量化交易系统之双重底(W底)算法(一)》,遗留了一个问题,即回测速度不满意。
通过追踪打印,真正的耗时之王,居然是读mysql数据。
在表t_kdata中(表结构见《 量化交易系统之python+mysql(二)》),一共保存了137万多条数据。
mysql> select count(*) from t_kdata;
+----------+
| count(*) |
+----------+
| 1375956 |
+----------+
1 row in set (0.85 sec)
从mysql查询一条数据的时间,用Navicat Premium客户端,约170毫秒,因为它需要显示。
mysql> select code,trade_day,open,close,high,low,amount,vol,ma5vol,ma10vol,ma20vol,ma30vol,ma5,ma10,ma20,ma30,ma60,pct_chg,macd,dea,dif from t_kdata where code = '000790.SZ' and trade_day>='20190301' and trade_day<='20190726' order by trade_day ASC;
+-----------+-----------+------+-------+------+------+-----------+-----------+-----------+-----------+-----------+-----------+------+------+------+------+------+---------+--------+--------+--------+
| code | trade_day | open | close | high | low | amount | vol | ma5vol | ma10vol | ma20vol | ma30vol | ma5 | ma10 | ma20 | ma30 | ma60 | pct_chg | macd | dea | dif |
+-----------+-----------+------+-------+------+------+-----------+-----------+-----------+-----------+-----------+-----------+------+------+------+------+------+---------+--------+--------+--------+
| 000790.SZ | 20190301 | 4.64 | 4.63 | 4.71 | 4.55 | 83728.44 | 163994.33 | 283305.09 | 241783.29 | 201467.72 | 165999.98 | 4.57 | 4.39 | 4.13 | 4.06 | 4.03 | 0.00 | 0.127 | 0.118 | 0.182 |
| 000790.SZ | 20190304 | 4.65 | 4.62 | 4.77 | 4.59 | 122187.34 | 236111.09 | 268237.73 | 241550.12 | 209883.25 | 170030.63 | 4.60 | 4.43 | 4.17 | 4.09 | 4.03 | -0.20 | 0.112 | 0.132 | 0.188 |
| 000790.SZ | 20190305 | 4.61 | 4.72 | 4.76 | 4.57 | 110830.75 | 213936.01 | 248981.17 | 240401.32 | 217220.26 | 172197.65 | 4.65 | 4.48 | 4.22
。。。。
101 rows in set (0.17 sec)
使用pymysql,用相同的SQL命令,获取一条数据大约需要8毫秒,转换成dataframe需要2毫秒,共计10毫秒。
而执行一次《量化交易系统之双重底(W底)算法(一)》提到的算法,不到1毫秒。
大致计算一下:
从mysql加载一支股票数据+转换数据+算法 = 11毫秒。
一共3651只,耗时:3651x11 = 40161毫秒 ≈ 40秒
与测试数据非常接近。
优化方案:
缓存,redis,数据表分片等。