量化交易入门笔记-策略回测与评估

首先,编写一个简单的“双均线量化策略”

代码如下:

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)]

  • Rp = 策略年化收益率
  • Rm = 基准年化收益率
  • Rf = 无风险利率(默认是0.04)
  • βp = 策略beta值

根据公式得出:当 α > 0 ,策略相对于风险,获得了超额收益; α = 0,策略相对于风险,获得了适当收益; α < 0,策略相对于风险,获得了较少收益

Beta(贝塔)

意义:

Beta表示投资的系统性风险,反映了策略对大盘变化的敏感性。例如一个策略的Beta为1.5,则大盘涨1%时,策略可能涨1.5%,反之亦然;如果一个策略的Beta为-1.5,说明大盘涨1%的时候,策略可能跌1.5%,反之亦然

公式:
B e t a = β p = C o v ( D p , D m ) V a r ( D m ) Beta = β_p = \frac{Cov(D_p,D_m)}{Var(D_m)}

  • Dp = 策略每日收益
  • Dm = 基准每日收益
  • Cov(Dp,Dm) = 策略每日收益与基准每日收益的协方差
  • Var(Dm) = 基准每日收益的方差

当 β<0,投资组合和基准的走向通常相反,如空头头寸类。如果β=0,投资组合和基准的走向没有相关性,如固定收益类。0<β<1,投资组合和基准的走向相同,但是比基准的移动幅度更小。如果β=1,投资组合和基准的走向相同,并且和基准的移动同谋贴近。如果β>1,投资组合和基准的走向相同,但是比基准的移动幅度更大

Sharpe(夏普比率)

意义:

Sharpe表示每承受一单位总风险,会产生多少超额报酬,可以同时对策略的收益与风险进行综合考虑

公式:
S h a r p e R a t i o = R p R f σ p Sharpe Ratio = \frac{R_p - R_f}{σ_p}

  • Rp = 策略年化收益率
  • Rf = 无风险利率(默认值为0.04)
  • σp = 策略收益波动率

Sortino(索提诺比率)

意义:

Sortino 表示每承担一单位的下行风险,将会获得多少超额回报

公式:
S o r t i n o R a t i o = R p R f σ p d Sortino Ratio = \frac{R_p - R_f}{σ_pd}

  • Rp = 策略年化收益率
  • Rf = 无风险利率(默认值为0.04)
  • σpd = 策略下行波动率

Information Ratio(信息比率)

意义:

Information Ratio 是用来衡量单位超额风险带来的σp = 策略收益波动率。信息比率越大,说明该策略单位跟踪误差所获得的超额收益越高,因此,信息比率较大的策略的表现要优于信息比率较低的基准。合理的投资目标应该是在承担适度风险下,尽可能追求高信息比率

公式:
I n f o r m a t i o n R a t i o = R p R m σ t Information Ratio = \frac{R_p - R_m}{σ_t}

  • Rp = 策略年化收益率
  • Rm = 基准年华收益率
  • σt = 策略与基准每日收益差值的年化标准差

Volatility(策略波动率)

意义:

公式:
V o l a t i l i t y = σ p = 250 n 1 i = 1 n ( r p r p ) 2 Volatility = σ_p = \sqrt{\frac{250}{n-1} \sum_{i=1}^{n} (r_p-\overline{r_p})^2}

  • rp = 策略每日收益第
  • r- p = 策略每日收益的平均值 = lnΣi=lnrp
  • n = 策略执行天数

Benchmark Volatility(基准波动率)

意义:

Benchmark Volatility 用来测量基准的风险性,波动越大代表基准风险越高

公式:
B e n c h m a r k V o l a t i l i t y = σ m = 250 n 1 i = 1 n ( r m r m ) 2 Benchmark Volatility = σ_m = \sqrt{\frac{250}{n-1} \sum_{i=1}^{n} (r_m-\overline{r_m})^2}

  • rm = 其次每日收益第
  • r- m = 基准每日收益的平均值 = lnΣi=lnrm
  • n = 策略执行天数

Max Drawdown(最大回撤)

意义:

Max Drawdown 描述策略可能出现最糟糕的情况,最极端可能的亏损

公式:
M a x D r a w d o w n = M a x ( P x P v ) / P x Max Drawdown = Max(P_x - P_v)/P_x

  • Px, Pv = 策略某日股票和现金的总价值

注:本文章为个人学习笔记,参考了一些书籍与官方教程,不作任何商业用途!

猜你喜欢

转载自blog.csdn.net/weixin_38486884/article/details/83057351
今日推荐