首先,编写一个简单的“双均线量化策略”
代码如下:
def initialize(context):
"""双均线量化策略的初始化函数"""
# 定义一个局部变量,保存要操作的股票
g.security = '000002.XSHE' # 万科A
# 设定沪深300作为基准
set_benchmark('000300.XSHG')
# 开启动态复权,使用真实价格交易
set_option('use_real_price', True)
# 设定成交量比例
set_option('order_volume_ratio', 1)
# 股票类交易手续费:买入时佣金的万分之三,卖出时ew佣金的万分之三加
# 千分之一的印花税,每笔交易佣金最低扣5元钱
set_order_cost(OrderCost(open_tax=0,
close_tax=0.001,
open_commission=0.0003,
close_commission=0.0003,
close_today_commission=0,
min_commission=5), type='stock')
# 运行函数
run_daily(trade, 'every_bar')
def trade(context):
"""双均线量化策略的交易程序函数"""
security = g.security
# 设定均线
n1 = 5
n2 = 10
# 获取股票的收盘价
close_data = attribute_history(
security=security,
count=n2+2,
unit='1d',
fields=['close'],
df=True)
# 取得过去 ma_n1 天的平均价格
ma_n1 = close_data['close'][-n1:].mean()
# 取得过去 ma_n2 天的平均价格
ma_n2 = close_data['close'][-n2:].mean()
# 取得当前的现金
cash = context.portfolio.cash
# 如果当前有余额,并且 n1 日无线大于 n2 日无线
if ma_n1 > ma_n2:
# 用所有 cash 买入股票
order_value(security, cash)
# 记录这次买入
log.info('Buying %s' % (security))
# 如果 n1 日无线小于 n2 日无线,并且目前有头寸
elif ma_n1 < ma_n2 and context.portfolio.positions[security].closeable_amount > 0:
# 全部卖出
order_target(security, 0)
# 记录这次卖出
log.info('Selling %s' % (security))
# 绘制 n1 日均线价格
record(ma_n1=ma_n1)
# 绘制 ma_n2 日均线价格
record(ma_n2=ma_n2)
然后设置回测的开始时间、结束时间、回测资金和回测频率,点击“运行回测”
回测结果如下:
了解Bar的概念
一根完整的K线相当于一个Bar,根据时间序列的不同,有分钟Bar、小时Bar、日Bar等
当选择“每天”频率时,算法在每根日线Bar上都会运行一次,即每天运行一次
同理,选择“分钟”频率时,算法会在每根分钟Bar上运行一次,即每分钟运行一次
了解量化策略的风险指标
一个策略的好坏,可以能过以下几个指标来判断
风险指标有利于投资者对策略进行客观的评价。需要注意的是,无论是回测还是模拟,所有风险指标都只会根据每天收盘后的收益计算并每天更新一次,并不会考虑盘中的收益情况
Alpha(阿尔法)
意义:
投资中面临着系统性风险(即Beta)和非系统性风险(即Alpha),Alpha是投资者获得与市场波动无关的回报。比如投资者获得了15%的回报,其基准获得了10%的回报,那么Alpha或者价值增值部分就是5%
公式:
A l p h a = α = R p − [ R f + β p ( R m − R f ) ] Alpha = α = R_p - [R_f + β_p(R_m - R_f)] Alpha=α=Rp−[R