作为一个业余美股投资者和互联网码农,一直想要使用技术来揭秘股市背后的规律和趋势,李总也说了“空谈误国实干兴邦”,想法必须要落地;那么,作为开始,我先动手来实现一个简单的股票的算法交易系统。

1、问题分析
目标是通过机器学习从历史数据中找出规律,并使用这些规律来使得交易系统得变得更智能;我们知道美股融资融券交易中最常用的两种交易方式;
1)看多的时候,低位买进股票后在高位卖出或者在更低的止损位卖出(Long操作);
2)看跌的时候,高位卖出股票后在低位买进(回补)或者在更高位止损买进(回补)(Short操作);
两种交易方式中的变量为买进价,卖出价和止损价;假如通过机器学习找到“内在规律”并计算出未来的最优买进价,卖出价和止损价,我不就能发了么。。;

现在问题变的清晰了;
1)我要确定“内在规律”(特征向量)为买进触发器(买进价与上一次股票价格的差),卖出触发器(卖出价与上一次股票价格的差),止损触发器(卖出价与上一次股票价格的差);
2)我要从历史中找到这三个触发器的全局最优解;
3)使用全局最优的这三个触发器去计算出未来的买入价,卖出价和止损价;

工业级的交易系统预测功能对计算速度要求比较严格,因此我将使用粒子群优化算法来快速迭代找出这三个全局最优值;

2、粒子群优化算法
粒子群优化算法(Particle Swarm Optimization)是一种基于迭代的优化算法,通过迭代搜寻最优值。它没有遗传算法用的交叉以及变异,而是粒子在解空间追随最优的粒子进行搜索。同其他遗传算法比较,PSO的优势在于简单容易实现并且迭代速度快。
节省空间,细节还请移步:http://baike.baidu.com/view/1531379.htm

3、具体实现
3.1、股价数据源
google finance:http://www.google.com/finance/getprices?i={interval}&p={days}d&f=d,o,h,l,c,v&df=cpct&q={symbol}

demo:获取QIHU上一个交易日的交易数据,时间间隔为60s

yahoo finance:http://ichart.yahoo.com/table.csv?s={symbol}&a={startMonth}&b={startDay}&c={startYear}&d={endMonth}&e={endDay}&f={endYear}&g={period}&ignore=.csv

demo:获取AAPL从2014.9.21到2014.9.26的天级数据

3.2、适应值的计算
适应值(fitness value)用来计算粒子种群中单一个体的值,我这里的单一个体指一组触发器组合{买进触发器,卖出触发器,止损触发器},而它的值指使用这组触发器来计算历史数据得到的账户总收益;
使用3.1的数据源,我得到了时间颗粒度的历史股价数据,接下来需要建立一个模型可根据提供的触发器组合{买进触发器,卖出触发器,止损触发器}自动计算所有模拟股票交易的总收益;需要做下面几步;
1)搞定股票的买(buy)卖(sell)触发规则
buy动作触发规则

sell动作触发

2)记录在一次历史股价数据迭代计算中的所有模拟交易记录
使用session类来记录所有模拟交易的记录(trade),其中trade记录一次模拟交易的open价和close价(成交价);

3)计算模拟交易总收益
见session.grossProfit()方法

4)适应值计算方法
fitness.evaluate()

3.2、适应值的距离评估
距离评估主要用到两种方法;
1)一次迭代中所有模拟股票交易的总收益;
2)一次迭代中所有模拟股票交易收益集合的变异系数(平均值/标准差);

3.3、PSO算法的实现
3.3.1、实现PSO算法的过程
这里的粒子指上面提到的触发器组合{买入触发器,卖出触发器,止损触发器},具体算法如下;
1)粒子群随机初始化;(随机产生粒子并设定粒子特征向量中各维参数的取值上下限);
2)对粒子群内的每一个个体计算适应值(fitness value),适应值与最优解的距离直接有关,记录本次迭代的个体最优和全局最优值;
3)粒子根据个体最优(pbest)和全局最优(gbest)更新速度和位置;

4)如果终止条件(迭代次数或者收益值)满足的话,就停止,否则转步骤2;
5)输出当前全局最优适应值和粒子;

优化器部分实现代码,其中,使用迭代次数(generations)作为终止条件,xmin和xman分别为粒子特征向量中各维参数的取值上下限,初始化时粒子群个数(SWARM_SIZE)设置为30:

3.4、main

3.5、测试

4、系统源代码
github:https://github.com/fifa2002nb/pso