请选择 进入手机版 | 继续访问电脑版
楼主: wl142857
9329 12

[源码分享] [量化杂谈之基础篇5]一个简单的回测实例 [推广有奖]

  • 0关注
  • 34粉丝

硕士生

70%

还不是VIP/贵宾

-

威望
0
论坛币
201 个
通用积分
0
学术水平
11 点
热心指数
12 点
信用等级
8 点
经验
7091 点
帖子
86
精华
0
在线时间
281 小时
注册时间
2009-2-22
最后登录
2020-6-24

wl142857 发表于 2016-1-23 16:22:27 |显示全部楼层 |坛友微信交流群

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

求职就业群
赵安豆老师微信:zhaoandou666

经管之家联合CDA

送您一个全额奖学金名额~ !

感谢您参与论坛问题回答

经管之家送您两个论坛币!

+2 论坛币

在这一讲中我们将会对一个非常简单的策略回测实例进行讲解,让大家对简单的回测框架有一个最直观的认识。

在这里选用了一个均线策略,该策略属于趋势策略,即通过技术指标的状态改变来捕获开仓或平仓信号。均线策略采用的是技术指标MA( Moving Average),关于它的详细解释可以参看:https://en.wikipedia.org/wiki/Moving_average


该策略的逻辑是:选取两条周期不同的MA曲线,一条为周期比较短的SMA,另一条则是周期比较长的LMA,如果SMA上穿LMA说明未来短期有向上趋势因此作为买入信号,反之作为卖出信号。信号产生规则用表达式写出来就是:

if sma(t)>lma(t)&sma(t-1)<lma(t-1) then signal=1(buy)

if sma(t)<lma(t)&sma(t-1)>lma(t-1) then signal=-1(sell)

else signal=0(hold)


  • 策略模块


在策略模块中我们需要解决的是信号的识别,因此输入是bars,输出是信号。在该模块中提供了两个方法,一个是计算MA指标,另一个是根据策略规则产生信号。

MA指标的可以采用Pandas中的rolling_mean进行计算,参数window可设置移动窗口的大小,min_periods可确定需要有值的最小观测数,如果把min_peridos设置为1那么在ma序列中就不会出现NA的数据。关于该方法的其他参数可以参见Pandas的文档pandas.pydata.org/ 。


def MA(self, price, windows = 5, period = 1):

        MAprice = pd.rolling_mean(price, windows, period)

        return MAprice


信号生成方法是策略模块中最为核心的部分。对于该均线策略,我们信号产生的算法是通过flag来标示T=t时sma是否大于lma,然后对flag做差分。如果flag(t)=1 & flag(t-1)=0 ,那么signal(t)=flag(t)-flag(t-1)=1,即产生了买入信号。


def gen_signal(self):

        signals = pd.DataFrame(index=self.bars.index)

        signals['flag'] = 0

        signals['sma'] = self.MA(self.bars['close'],self.short_window,1)

        signals['lma'] = self.MA(self.bars['close'],self.long_window,1)

        signals['flag'][self.short_window:] = np.where(signals['sma'][self.short_window:]

       > signals['lma'][self.short_window:], 1, 0)  

        signals['signal'] = signals['flag'].diff().fillna(signals['flag'][0])

        return signals


  • 交易模块


策略模块将信号输入到交易模块中,交易模块提供了两个方法。第一个方法是通过信号产生各期买卖的头寸以及持有的头寸,第二个方法是追踪各期的资产情况,如持有头寸的市值、账户剩余的现金以及账户的总资产价值。


   def gen_positions(self):

        positions = self.signals['flag']*1000

        return positions

   

    def trade_positions(self):

        positions = self.signals['signal']*1000

        return positions

        

    def trade_tracing(self):

        capital = pd.DataFrame(index=self.signals.index)

        capital['hold'] = self.gen_positions()*self.bars['close']

        capital['rest'] = self.init_capital- (self.trade_positions()*bars['close']).cumsum()

        capital['total'] = capital['hold']+capital['rest']

        capital['return'] = capital['total'].pct_change().fillna(capital['total'][0]/self.init_capital-1)

        return capital


我们可以选取一只股票采用上述简单回测框架进行回测。


if __name__ == '__main__':

    bars = ts.get_h_data('002337',start='2012-01-01',end='2015-01-01').sort_index()

    test_strategy = MAStrategy(bars)

    signals = test_strategy.gen_signal()

    test_trade = MATrade(bars,signals)

    capital = test_trade.trade_tracing()


注意到该回测框架是一个最简单的策略回测系统,没有考虑各种交易成本,策略也进行了最简化的处理,选取该简单策略进行回测的目的是告诉大家回测系统建立的最基本要素和套路。最后,留下两个小问题留给大家思考:

1、该回测框架是针对单一交易品种进行的,如果对一个投资组合进行回测代码应该如何修改?

2、如果我们希望将所有股票都采用该策略一次性进行回测应该怎么做?


完整代码请关注我的微信公众号:我的微信公众号:会掘金的小鹿(NuggetsRoad)
是时候关注一波了!




二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

关键词:基础篇 positions Dataframe Wikipedia position 买入信号 表达式 hold 技术

已有 2 人评分经验 论坛币 学术水平 热心指数 信用等级 收起 理由
accumulation + 100 + 1 + 1 + 1 精彩帖子
fantuanxiaot + 33 + 33 精彩帖子

总评分: 经验 + 133  论坛币 + 33  学术水平 + 1  热心指数 + 1  信用等级 + 1   查看全部评分

本帖被以下文库推荐

littlemay723 学生认证  发表于 2016-1-23 17:52:06 |显示全部楼层 |坛友微信交流群
来个沙发,干货,我喜欢....

使用道具

littlemay723 学生认证  发表于 2016-1-23 17:53:20 |显示全部楼层 |坛友微信交流群
不好意思,网络慢,发多了一帖

使用道具

vtmc 发表于 2016-1-25 09:26:44 |显示全部楼层 |坛友微信交流群
写得挺不错的,而且明确是为了初学的写得比较细致,赞一下

使用道具

Lnan95 发表于 2016-2-15 18:08:39 |显示全部楼层 |坛友微信交流群
楼主给力啊!!

使用道具

Lnan95 发表于 2016-2-16 15:31:04 |显示全部楼层 |坛友微信交流群
是把股票的数据定义成一个类了吗?

使用道具

wl142857 发表于 2016-2-20 14:03:17 |显示全部楼层 |坛友微信交流群
Lnan95 发表于 2016-2-16 15:31
是把股票的数据定义成一个类了吗?
这里定义了两个类,一个是策略类MAStrategy,一个是交易类MATrade

使用道具

Lnan95 发表于 2016-2-20 20:24:40 |显示全部楼层 |坛友微信交流群
wl142857 发表于 2016-2-20 14:03
这里定义了两个类,一个是策略类MAStrategy,一个是交易类MATrade
能求一下类的代码学习一下吗

使用道具

wl142857 发表于 2016-2-20 22:45:35 |显示全部楼层 |坛友微信交流群
Lnan95 发表于 2016-2-20 20:24
能求一下类的代码学习一下吗
完整代码可以关注我的微信公众号NuggetsRoad

使用道具

Lnan95 发表于 2016-2-20 23:35:36 |显示全部楼层 |坛友微信交流群
wl142857 发表于 2016-2-20 22:45
完整代码可以关注我的微信公众号NuggetsRoad
看到这个帖子时候就关注了~

使用道具

您需要登录后才可以回帖 登录 | 我要注册

本版微信群
加好友,备注jr
拉您进交流群

京ICP备16021002-2号 京B2-20170662号 京公网安备 11010802022788号 论坛法律顾问:王进律师 知识产权保护声明   免责及隐私声明

GMT+8, 2024-3-29 10:04