简单实现一个自动化交易程序

程序化交易程序主要可以作为一个沙盘,用于测试你的策略。这个程序我写下前面这篇文章的前天下午就实现了一个,是用 Python 写成的,核心代码不到一百行。如果写成 Java,就可以在手机上运行了。国内相似的程序如大智慧、同花顺,一年购买使用权 23 万。我觉得很搞笑,因为这个程序并不复杂,而且金融界的编程水平有目共睹,谈不上什么优雅,和大多数 IT 行业的商业化产品比起来,也只是勉强能跑而已。我提供一个思路,学过高级语言 23 个月的人也可以写一个一模一样的程序出来;这样一年也能赚下来 2、3 万。

我想首先声明的是,写一个这样的程序应该先明确几点原则:

1. 免责;2. 安全性;3. 可用性。

这是一个交易沙盘,不会对任何账户进行自动化操作,最好这样避免可能的经济和责任纠纷。下单和出货仍由用户手动去操作,程序不做这件事。沙盘仅仅提供数据模拟,生成报告,并且策略(何时买进卖出)是由用户来写入的;决定完全在用户,责任也完全由用户来承担。所谓程序化交易,可以看做是一种不自觉地自然形成的去发现、遵守市场规则的习惯;相对是主观交易,即交易带着期望、理性屈从于情绪,一旦开跌就十分恐慌,一旦上涨就跟风买入。主观交易至少在我观察来,很普遍。都是赔钱的。

一、获取实时数据

Python 的函数库很丰富,httplib 提供了获取 API 接口数据的功能。API 返回参数是 json 格式的,可以用非标准库的 json Parser 去解析,也可以用正则表达式过滤。比如说:

{“ticker”:{“high”:”611.97″,”low”:”561.03″,”buy”:”581.00″,”sell”:”583.98″,”last”:”583.99″,”vol”:”14246.56″}}

就包含了最高价、最低价、买入价、卖出价、最新价、成交量,每十秒更新一次。每个交易所的 API 文档都声明了如何获取这些返回值,通常最简单的是,使用“GET” method(请查阅 Python 手册,详细介绍了 httplib 的用法,还包含例程)。

可以将 getrespond(),parser(),httpConnection()写成一个类,如:class instant_Data()。使用类的方法调用来使用这些函数。

二、获取同步时间

同样声明一个类 Timer(),使用网络同步时间,精确到秒就可以了。因为网络传输(请求)基本是以秒为单位计算的,timeapi 是个很好的选择:http://www.timeapi.org/ 各个时区的日期、秒数都可以读取。请求方式同上。用正则表达式过滤。

时间用于计算和记录每一笔交易的时间、为策略中的操作提供最基本的数据。选择短线策略还是中线?不同的策略会调用不同时间段内的数据,生成不一样的分析结果。一份准确的交易报告也应当包括每一笔交易下单、平仓的时间。以秒为单位符合人的手动操作精度。就沙盘来说,这个模拟精度够了。

三、数据报告

美国最主流的交易程序 Tradestation 比国内相应程序好太多了,它生成的报告很详细,参考的主要指标有几个:

1. 一段时间内开盘 / 收盘价;

2. 空头 / 多头的交易量;

3. 历史平均价格;

4. 一段时间的最高 / 最低价格.

当用户确定策略的时候,根据相应策略内的参数(指定交易周期、交易金额、建仓和止损位,等等),对收集到的数据做相应调整。5 分钟的开盘、收盘价,10 分钟的开盘、收盘价,就是相应计数时间的简单记录。交易量是 5 分钟、10 分钟内多、空交易量各自的总额。历史平均价格是相应时间价格加权平均数。最低、最高价格是个简单的数字排序问题。

简单的数据提供给程序,和 K 线给人的直观感觉是一样的。背后都是一样的数据,K 线是把它们画成图了;同样的分析,程序一样可以做到(在这些小数据操作上,Python 的响应速度根本感觉不到)。

当成交一笔交易,将生成相应的时间、价格、盈亏报告。

四、确定策略

如果每个人都使用程序化交易,市场会怎么样?程序化交易的灵魂是策略,何时建仓、减仓、设置止损、如何做出趋势判断,决定策略的成败。简单策略适合短线,复杂策略适合中长线,当策略稳定获得一定胜率,这个策略就在市场中有了立足之地。复杂策略涉及长期、大量的数据存储和处理,甚至包含模式匹配、换入换出,类似于一个操作系统,根据不一样的行情做出不一样的响应方式。简单策略则快进快出,只做得好短线。比如说连续两天行情大涨,你是不是会很紧张?紧张是正确的,因为随着时间和数据的推移,之前两天能够匹配的模式开始变化了。

模拟还包括:滑点、手续费、形态判断。

形态判断可能是最难的部分,我的简单程序中没有进行形态判断(牵涉价格波动、交易量变化),仅仅匹配了开盘、收盘价。对程序来说,没有必要画图,设计的时候图是画在脑袋里的。你可以包含大多数常见的形态:尖顶、圆顶、双顶、三顶、整理收敛、上升通道…针对每一个形态,设定相应最程序化的操作,通过实时测试,去修改得到最佳参数。形态是内嵌在程序中的,但用户需要决定:建仓价格、建仓方向、平仓价格、止损位置、交易周期、分析深度(包含单一时间段还是多个时间段的报告)。

记录每一单交易、盈亏额、胜率,调整参数,优化策略。然后就可以赚钱了。没错,赚钱并非那么容易,Tradestation 建议的测试数据时间跨度是五年。靠直觉?直觉不费脑子,你还不如去买彩票。打游戏一样可以满足你的直觉需求。

比特币呢?比特币期货产生的时间才刚刚一年罢了。