即使拼命回望过去无法预知将来,从过去中总结出的规律就是没有没有规律,我们未曾知道未来会有怎样的惊喜。

未来难以捉摸又何妨,仍不妨碍我们把握当下,勇敢的选择与判断。随着模型复杂,量变到质变,我们的确可以有所改善。我们从一个简单的策略开始:双均线策略。

这节博客我们将使用tushare来设计一个简单的策略框架,并在其中实现一种简单的策略:双均线策略,并与benchmark做对比。

[python]项目在github开源:项目地址(demo文件夹下)

1 双均线策略

首先来介绍双均线策略。双均线策略简单说来就是金叉买入,死叉卖出。

顾名思义,双均线就是使用两条均线,比如我们使用一条5天的移动平均线和一条十天的移动平均线

  • 金叉定义为 MA5>MA10开始的位置
  • 死叉定义为MA10>MA5开始的位置

2 双均线策略的特点

双均线策略是一种极为简单的策略,对于长期处于涨势时可以取得较好收益,但通常我们不能预测大体走势,常做分析的都知道,单看价格走势曲线是找不到什么规律的,唯一的规律就是没有规律。

并且,双均线策略在两条均线纠缠交错时会产生大量无效交易,所以实际上并不会直接使用该策略。这节博客主要是入门学习,所以找一个简单的策略上上手,下面就直接看代码了。

3 数据获取类

代码都在title摘要给出的链接中开源了。

获取数据部分,就是通过tushare获取对应代码的数据,然后通过rolling方法计算MA5和MA10。因为在计算MA5和MA10过程中,开头的数字会出现NAN,所以采用df.dropna来去除无效值。

本来是想设计一个单例模式,由于python太烂,秀不出来,就算了。

4 策略类

下面这段代码是核心代码。

在初始化函数中,设置benchmark、初始现金、股票代码、开始时间和结束时间等,初始化各种变量。

双均线策略是一个趋势策略,基本思路是金叉买入,死叉卖出,也就是当ma5向上穿过ma10时,则买入,向下穿过ma10时,则卖出。

主要实现在Strategy类中,输入的变量格式如下:code_list = [‘002415’, ‘002416’, ‘000333’],init_cash = 100000,starttime = ‘2014-01-01’,endtime = ‘2017-11-30’,其他几个重要成员变量如下:cash为还剩余的现金;capital_market_value为持仓的市值,按每天的收盘价计算;limit_cash为每只股票分得的仓位,双均线策略中,codelist中的股票平分持仓;position_list为持仓的情况,类型为dict,股票的code为key,持仓的数量为value;data_range为一个回测的日期list,pd.period_range的freq参数选择为B,即工作日;benchmark赋值为sh,即上证指数,以便比对策略结果。

实际的回测定义在run_simulation函数中,主循环框架为按天循环,通过每天的开盘价判断是否买入或者卖出(先判断卖出信号,再判断买入信号,具体判断在后面介绍),如果卖出成功,那么将卖出的所得加入到cash变量,对应的position变量调整为0(这个策略为初级策略,都是在每只股票的额度内全买全卖,后续策略会加入仓位控制),并将操作记录下到trade变量中。买入的操作也是类似的。每天买卖判断完成后,再按收盘价计算下持仓的市值,记录到capital_market_value中,以便统计每天的涨跌,计算sharp比率等统计指标。

所有天数回测结束后,将结果记录到res_df中,该变量为pandas类型,以便分析结果。res_df中数据有每天capital_market_value,每天的涨跌幅,每天对应的benchmark的值(因为回测的date_range已经剔除了周末,节假日等情况会存在停市,故capital_market_value与benchmark的值均使用之前第一个值填充),benchmark采用先bfill,然后还可能存在最开头的值是空的情况,在ffill填充,而capital_market_value则是使用df[df[‘date’] <= date].tail(1)[‘close’]获得。

看懂了上面的代码,下面的这一大段瞟一眼就可以了,就是实现信号判断啊,调仓啊,算手续费啊等。

5 运行分析与结果绘制

在一个新文件中import原来两个文件demo.dm_*,然后运行策略,读取策略保存的csv表格文件,然后使用pymatplot进行绘图,对比benchmark和策略的收益。

这篇博客偷个懒,做测评的时候使用的是三只牛,做对比的时候 Benchmark 选的是上证。这里知道这样做是不严谨的就可以了,毕竟这不是我们要get到的点。

好的,这样我们就实现了一个简单的策略。

OK,See You Next Chapter!

 

发表评论

电子邮件地址不会被公开。 必填项已用*标注