我用 SPL 做量化

SPL?不是经常宣传来用于数据仓库计算的、叫板 SQL 的语言吗?还能做量化?

没错,SPL 不仅能做大数据高性能算法,还能做股票量化交易策略,不仅可以做,而且方便得很。

长话短说。近三两年来,一直有些做金融和炒股票的亲朋好友鼓动我做量化,但直到去年底,才有空来研究一点。看了些资料,发现这里也是道行深深,无数前辈搞出无数术语,什么金叉死叉看着眼晕。而且即使明白这些指标的计算规则,也不能立即搞懂为什么要用这样的参数来算(比如为什么看 9 日和 26 日均线而不是其它数)。按这条路走下去,职业玩家恐怕都要好几个月才能入门,而我本来业余干,那估计得两三年才能进入状态了。

而且,公开资料中讲的量化策略,大多数看起来都是一个套路(时间有限看的资料也有限,可能以偏盖全):试图用某些交易和财务指标(按数据挖掘的术语叫衍生变量)来预测股票走势。但是,混沌理论告诉我们,当影响因素和迭代次数过多时,微小因素会被无限放大,有明确方程式时预测未来都会非常离谱(所谓蝴蝶效应),更不要说因素及其与目标的关系还搞不清的情况了。天气是个典型,股票其实也一样,简单用一句有点绕的话说是:股票走势的规律就是没有规律。用这个套路去做量化,那就要不停地去寻找新模式,感觉有点累,不适合我们这种业余选手。

罢,俺另想办法。

混沌理论虽然禁止了我们直接预测股票走势,不过,它还有个洛仑兹吸引子的概念。

还是用天气来举例说。混沌理论说不能准确预测未来哪天会不会下雨,但洛仑兹吸引子又说,未来 N 天出现几次雨天的概率却是很稳定的。如果这个概率足够大,那我可以趁着今天艳阳高照、雨衣卖得便宜时多买几个存着,等雨天来了再加价卖出去,这就赚钱了。如果连续 N 天不下雨(概率大也未必会真发生,而且这概率也可能没算对),那就赔钱了。只要我赌的场地多一点,概率就会起作用,总会赚多赔少,整体还是会赚钱。这样,面临的任务就是想办法用历史数据找到可以赚钱的吸引子并把相应的概率尽量算精准。

想好就做,于是下载数据,编写代码做回测,看看这个思路能不能赚钱。

那么,用什么程序语言来写策略呢?

大多数量化资料都在推荐用 Python,相对于 Java 这些高级语言来讲,Python 确实要好很多,但在我眼里还不够好。

股票数据也是结构化数据(日期、开盘价、收盘价、交易量、复权因子、…),Python 的 Pandas 并不是专业的结构化数据处理包,它那个 dataframe 实际是个矩阵,不是个结构化数据表,很多运算写起来有点绕。但是实在没有什么合适的成熟语言(SQL 是专业的结构化数据计算语言,但用来做量化就不用想了),它的相像程度最高,于是被大家拿来对付。量化策略中有大量和次序有关的计算(涨跌),Pandas 没有认真抽象有序计算,写起来非常麻烦。Pandas 还不是 Python 的基础核心部件,调试起来也费劲,而量化策略要常试常改。Python 没有固有的二进制文件格式,一般用 csv 之类的文本存储(这时候用个数据库反而更烦),性能太差,Python 又很难写出并行代码,…。这都会影响尝试的效率。

这些毛病,SPL 通通没有,而且…,算了,不细说了。反正用 SPL 的开发效率要比 Python 高出 N 倍,同样时间就能多做 N 倍的尝试,这对于业余人员是非常有意义的。

还有个深层原因在于,SPL 就是我们自己开发的,那自己当然要用。也因为是自己做的,缺了啥马上就能补上。不过在回测阶段倒还没发现有什么缺的。

“Talk is cheap,show your code”,来看一段样例:(其实 SPL 写在格子里,不用写变量,但为了方便在文章中阅读,改成变量式了)

SE=S.select(DT>=now()-N && UE).derive(1/abs(P-CP):PW)

SL=SE.select(CP<P).sort(-CP).select(max(UE[:0])<M)

SR=SE.select(CP>P).sort(CP).select(max(UE[:0])<M)

UP=(1-exp(SL.sum(PW*ln(UE/M))/SL.sum(PW)))*(1-exp(SR.sum(PW*ln(UE/M))/SR.sum(PW)))

这四行代码将用某支股票在过去 N 天的历史数据计算出它在未来 M 天内会涨到某个价位的概率,同样可以再算个下跌概率,如果上涨概率减下跌概率超过某个阈值的话,那就可以买入了,等着涨到位就卖出。

代码不解释了,量化策略不能说太细(大家都采用的量化策略就是没用的策略),不过大体也能看出点名堂(这里主要是加权几何平均)。

整个回测代码也就几十行而已,SPL 中丰富的集合运算功能可以大大简化代码量。

顺便歪个楼,有奥数背景做量化真是得天独厚啊。上面说的过程比较简单,就是算个概率,但具体怎么算,还要编造一些看起来合理的数学表达式。受过奥数训练的同学就会很擅长这些事,比如要找个增函数,简单点可以用 y=x,想增得快一点,用 x2;超级快,ex;增得慢点,根号 x;再慢,lnx; 增但还要有界,arctgx。就是这些东西翻来复去地组合,总有一款合心意。

同学们可能关心这个策略的效果。

现在还是初步尝试阶段,先按理想情况算,假定用每天的开盘价总能买上和卖出(实际上可能不一定)。07 年的大牛市能赚 65%;08 年股指跌去一半还多,这个策略也会亏 25%;09 年小牛市能赚 45%;平常不牛不熊的稳定年大约有 20% 的赚头。总体来讲比较温和,熊市能避开一些,但牛市也抓不牢。

这里很多概率计算方法设计得还不够精细,还要再调整完善。因为业余做,进展会慢点,但有 SPL 协助提高效率,再有几个月也可以进入实盘操作了。

当然,SPL 只是辅助工具,做量化最关键还是策略算法本身。不过有了 SPL,我们能有机会尝试更多计算方法和参数,就能更快地找到有效的策略。

SPL 正在准备开源,目前已经可以免费下载,在这里: 集算器 (SPL) 最新版发布啦『发布日期 20220729』 ](http://c.raqsoft.com.cn/article/1595816810031)

怎么样?有兴趣来试试吧。