写策略做回测

将单元切换为 strategy 模式

这里使用优矿定制的回测框架,对量化策略进行研究、回测并查看回测结果。

创建一个strategy单元后,会提供策略代码模板,代码模版分为三个部分:

1
# 第一部分:策略参数
2
start = '2014-01-01'                      # 回测起始时间
3
end = '2015-01-01'                       # 回测结束时间
4
benchmark = 'HS300'                       # 策略参考标准
5
universe = ['000001.XSHE', '600000.XSHG']        # 证券池,支持股票和基金
6
capital_base = 100000                      # 起始资金
7
freq = 'd'                             # 策略类型,'d'表示日间策略使用日线回测,'m'表示日内策略使用分钟线回测
8
refresh_rate = 1                         # 调仓频率,表示执行handle_data的时间间隔,若freq = 'd'时间间隔的单位为交易日,若freq = 'm'时间间隔为分钟
9
10
# 第二部分:初始化策略,回测期间只运行一次,可以用于设置全局变量
11
# account是回测期间的虚拟交易账户,存储上述全局变量参数信息,并在整个策略执行期间更新并维护可用现金、证券的头寸、每日交易指令明细、历史行情数据等。
12
def initialize(account): 
13
    # account.i = 1
14
    pass
15
16
# 第三部分:策略每天下单逻辑,执行完成后,会输出每天的下单指令列表
17
# 这个函数在每个交易日开盘前被调用,模拟每个交易日开盘前,交易策略会根据历史数据或者其他信息进行交易判断,生成交易指令
18
def handle_data(account): 
19
    # 这里编写下单逻辑
20
    return

以上策略模版按照以下流程执行,图中红色框部分就是代码模版中的三个部分。

策略流程图


基于以上了解,现在让我们来看看策略是如何去下单的,运行以下代码,在输出中点击“策略详情”,就可以在“调仓记录”中看到策略每天下单的信息啦:

1
start = '2014-01-01'                       # 回测起始时间
2
end = '2015-01-01'                         # 回测结束时间
3
benchmark = 'HS300'                        # 策略参考标准
4
universe = ['000001.XSHE', '600000.XSHG']         # 证券池
5
capital_base = 100000                      # 起始资金
6
freq = 'd'                                 # 用日线回测的策略
7
refresh_rate = 1                           # 每天调一次仓,即每个交易日都会运行第三部分的handle_data函数
8
9
def initialize(account): 
10
    pass
11
12
def handle_data(account):    
13
    # account.universe:当前交易日的证券池,已经从全局变量universe中剔除了当天停牌、退市和数据缺失证券的证券池。
14
    # 推荐您下单的股票都来自于account.universe
15
    for stock in account.universe:
16
        # order:用来模拟下达买卖指令,这里表示买入100股stock股票。
17
        order(stock,100) 

目前,写的策略尽管还很简陋,但这是走向各种复杂策略的第一步!

下面我们再举一个稍微复杂的 均线策略,策略思路为:

  • 以上证50ETF为标的(510050.XSHG),每天收盘后计算MA5、MA20
  • 若MA5 > MA20,且当前不持仓该股,买入;反之,MA5 <= MA20,且当前持仓该股,卖出。
1
# 均线策略
2
start = '2014-01-01'                  # 回测起始时间
3
end = '2015-01-01'                   # 回测结束时间
4
benchmark = 'SH50'                   # 策略参考标准
5
universe = ['510050.XSHG']              # 证券池,也可以在这里添加多个证券
6
capital_base = 10000                  # 起始资金
7
freq = 'd'                         # 日线策略
8
refresh_rate = 1                     # 每个交易日调仓
9
10
def initialize(account): 
11
    pass
12
13
def handle_data(account): 
14
    # account.get_attribute_history:表示获取所有证券过去20天的closePrice数据,返回数据类型为 dict,键为每个证券的secID
15
    hist = account.get_attribute_history('closePrice', 20)
16
    for stk in account.universe:
17
        # 计算股票过去5天收盘平均值
18
        ma5 = hist[stk][-5:].mean()
19
        # 计算股票过去20天收盘平均值
20
        ma20 = hist[stk][:].mean()
21
        
22
        # 如果5日均线大于20日均线,并且该股票当前没有持仓,则买入100手
23
        # account.valid_secpos:表示当前交易日持有数量大于0的证券头寸。数据类型为字典,键为证券代码,值为头寸。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值