将单元切换为 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的证券头寸。数据类型为字典,键为证券代码,值为头寸。