量化投资学习(2):金叉策略

准备工作完成,接下来我们的目标是建立起交易落单的逻辑,以便于我们使用历史数据进行回测。金叉的交易思路我们在上一篇教程中已经分析,如果短期均线从底部突破长期均线,是买入信号,我们把思路转化为python代码。

    if MA_short > MA_long and curPosition == 0:
       order_shares(context.s1,shares)        

在这里我们接触到了新的api,就是落单功能order_shares,这里有两个参数,第一个是股票代码,第二个代表买多少share,如果数值为负数就代表卖出。在这个例子里,我们满仓买入。

Ricequant提供了强大而灵活的各种order的方法,除了最基本的order_shares之外,还可以使用order_target_value,order_lot,order_percent等等。在上面这个例子中,满仓买入我们使用order_target_percent会更加方便,在这里传入的第二个参数不再是购买(卖出)的数量,而是购买(卖出)后该股票占到投资组合的百分比,0代表0%,1代表100%。

   if MA_short > MA_long and curPosition == 0:  
       order_target_percent(context.s1,1) 

如果短期均线从顶部跌破,那么出现一个清仓的信号。

    if MA_short < MA_long and curPosition != 0:      
        order_target_percent(context.s1,0)

好啦,整个可以用来回测的交易程序就基本写完了,是不是很简单呢?在进行回测前,我们还有最后一个步骤要完成,只要是交易策略不免会涉及到手续费,印花税和滑点费用。目前ricequant的默认设置如下

固定印花税: 0.1%,

手续费: 0.08% - 可以用context.commission手动修改

滑点: 0.246% - 可以用context.slippage手动修改

在认为默认设置不符合实际需求的情况下,手续费和滑点可以手动在init 模块中进行修改。比如在这个回测中,我准备用的起始资金少,股票交易量较大,我认为滑点小于预设默认数值。

def init(context):
    context.slippage = 0.05
    context.commission = 0.08 #和默认数值相同,可以省略代码   

完整案例:

def init(context):
    context.s1 = "000001.XSHE"

    update_universe([context.s1])


def handle_bar(context, bar_dict):

    MA_short= bar_dict[context.s1].mavg(20,frequency ='day')
    MA_long = bar_dict[context.s1].mavg(50,frequency ='day')

    curPosition =context.portfolio.positions[context.s1].quantity
    shares = context.portfolio.cash/bar_dict[context.s1].close

    if MA_short > MA_long and curPosition == 0:  
       order_target_percent(context.s1,1) 

    if MA_short < MA_long and curPosition != 0:
       order_target_percent(context.s1,0)

我们经常希望直观的看到一些历史数据以图表的方式展现出来,以上面金叉策略为例,我们想画出短均线,长均线和股票价格,可是直观地看出产生金叉的时候是不是一个交易的好的信号。

这时候就可以使用Ricequant的plot 功能来实现,在上述策略中的handle_bar function下面加入这几行代码

plot('close', bar_dict[context.s1].close) 
plot('short_avg',MA_short)
plot('long_avg',MA_long)

这段code的意义是在每个handle_bar的时间切片上绘制下该时间的数值,这个数值可以是bar_dict当中存储的股票价格,也可以是任意我们赋值的参数,比如当前的N日均价,或者当天的某个技术指标(之后的教程中会降到),等等。

参考:https://www.ricequant.com/community/topic/170/

你可能感兴趣的:(股市博客,python)