
首先,编写一个简单的“双均线量化策略”
代码如下:
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%
公式:
- Rp = 策略年化收益率
- Rm = 基准年化收益率
- Rf = 无风险利率(默认是0.04)
- βp = 策略beta值
根据公式得出:当 α > 0 ,策略相对于风险,获得了超额收益; α = 0,策略相对于风险,获得了适当收益; α < 0,策略相对于风险,获得了较少收益
Beta(贝塔)
意义:
Beta表示投资的系统性风险,反映了策略对大盘变化的敏感性。例如一个策略的Beta为1.5,则大盘涨1%时,策略可能涨1.5%,反之亦然;如果一个策略的Beta为-1.5,说明大盘涨1%的时候,策略可能跌1.5%,反之亦然
公式:
- Dp = 策略每日收益
- Dm = 基准每日收益
- Cov(Dp,Dm) = 策略每日收益与基准每日收益的协方差
- Var(Dm) = 基准每日收益的方差
当 β<0,投资组合和基准的走向通常相反,如空头头寸类。如果β=0,投资组合和基准的走向没有相关性,如固定收益类。0<β<1,投资组合和基准的走向相同,但是比基准的移动幅度更小。如果β=1,投资组合和基准的走向相同,并且和基准的移动同谋贴近。如果β>1,投资组合和基准的走向相同,但是比基准的移动幅度更大
Sharpe(夏普比率)
意义:
Sharpe表示每承受一单位总风险,会产生多少超额报酬,可以同时对策略的收益与风险进行综合考虑
公式:
- Rp = 策略年化收益率
- Rf = 无风险利率(默认值为0.04)
- σp = 策略收益波动率
Sortino(索提诺比率)
意义:
Sortino 表示每承担一单位的下行风险,将会获得多少超额回报
公式:
- Rp = 策略年化收益率
- Rf = 无风险利率(默认值为0.04)
- σpd = 策略下行波动率
Information Ratio(信息比率)
意义:
Information Ratio 是用来衡量单位超额风险带来的σp = 策略收益波动率。信息比率越大,说明该策略单位跟踪误差所获得的超额收益越高,因此,信息比率较大的策略的表现要优于信息比率较低的基准。合理的投资目标应该是在承担适度风险下,尽可能追求高信息比率
公式:
- Rp = 策略年化收益率
- Rm = 基准年华收益率
- σt = 策略与基准每日收益差值的年化标准差
Volatility(策略波动率)
意义:
公式:
- rp = 策略每日收益第
- r- p = 策略每日收益的平均值 = lnΣi=lnrp
- n = 策略执行天数
Benchmark Volatility(基准波动率)
意义:
Benchmark Volatility 用来测量基准的风险性,波动越大代表基准风险越高
公式:
- rm = 其次每日收益第
- r- m = 基准每日收益的平均值 = lnΣi=lnrm
- n = 策略执行天数
Max Drawdown(最大回撤)
意义:
Max Drawdown 描述策略可能出现最糟糕的情况,最极端可能的亏损
公式:
- Px, Pv = 策略某日股票和现金的总价值
注:本文章为个人学习笔记,参考了一些书籍与官方教程,不作任何商业用途!
网友评论