Python双均线策略回测(2021-10-12)

Python双均线策略回测
1.择时策略简介
根据百度百科的解释,择时交易是指利用某种方法来判断大势的走势情况,是上涨还是下跌或者是盘整。如果判断是上涨,则买入持有;如果判断是下跌,则卖出清仓,如果是盘整,可以高抛低吸。
从量化角度来说,择时是通过资产的数据构造出买卖信号,按照买卖信号进行交易。回测就是实现这整个过程。
本文以最简单的双均线策略为例进行回测,具体规则如下:
·短均线上穿长均线(金叉),且当前无持仓:买入;
·短均线下穿长均线(死叉),且当前持仓,卖出;
·其他情况,保持之前仓位;
·可以考虑控制回撤,单次亏损超过一定幅度平仓。
2.回测评价
年化收益
回测起点到终点的累积收益年化,算复利或单利都可以,复利假设策略的盈利也会被用于投资,因此复利算出来结果会更好看一些。
夏普比
夏普比 = (策略期望收益率 - 无风险收益率)/策略波动率
夏普比综合衡量了收益和风险,是最广泛应用的指标。
胜率
统计胜率要先统计交易次数,然后计算所以交易中盈利次数占的比例
最大回撤率
回撤是策略从前期最高点到当前时点的亏损,最大回撤是所有回撤中的最大值,反映的是策略的最大可能损失。
单次最大亏损
所有单次交易中的最大亏损
策略阶段性表现
对策略时间段进行分割,统计每个时间段内上述指标的变化情况,本文按年进行分割,统计测年逐年的收益率和相对于基准的超额收益率。
其他
除此外,还有波动率、下行风险、索提诺比率等各种指标,python中有专门的模块可以计算各种指标,这里我们自己算出各种指标,供参考。

此外,还需要测试策略的稳定性,对策略中参数进行扰动,检验策略的敏感性情况,好的策略应该是参数不敏感的。
3.回测说明
回测标的:贵州茅台(600519.SH)
回测区间:2011.01.01-2021.10.08
代码说明:回测代码分成两块,一块是策略函数(Strategy),一块是评价函数(Performance),策略函数通过指数的收盘价构造信号,计算策略净值,统计策略的每笔交易的情况。评价函数根据策略净值和策略每笔交易的情况计算策略的上述各个指标。
数据说明:策略所用数据来源于“Tushare大数据社区”,https://waditu.com/,大家可自行注册学习(强烈推荐)!!!
4.策略代码
导入所需数据库

import tushare as ts
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from pyecharts.charts import *
from pyecharts import options as opts
from pyecharts.globals import ThemeType

#=1.以贵州茅台(600519.SH)为例获取数据=

token='你的token'
pro=ts.pro_api(token)
df_price=pro.daily(ts_code='600519.SH',start_date='20110101',end_date='20211008',fields='ts_code,trade_date,close,open,high,low')
df_price.index=pd.to_datetime(df_price.trade_date)
df_price['year']=df_price.index.year
df_price=df_price.sort_index()
print(df_price.iloc[0:5,:])

在这里插入图片描述
#=2.策略函数=

def Strategy(data_price,window_short=5,window_long=10,loss_ratio=0.20):
    #df_price:价格数据;
    #window_short:短均线周期,默认为5;
    #window_long:长均线周期,默认为10;
    #lossratio:止损率,默认为1%,即开仓后下跌超过1%止损。

    ##2.1绘制K线和均线
    data_price=data_price.copy()
    data_price.index=data_price.index.strftime('%Y%m%d')
    data_price['sma']=data_price.close.rolling(window_short).mean()
    data_price['lma']=data_price.close.rolling(window_long).mean()
    data_price['position']=0#记录仓位
    data_price['flag']=0#记录买卖

    kline=Kline( init_opts=opts.InitOpts(width='1200px',height='600px',theme=ThemeType.DARK) )  
    kline.add_xaxis( data_price.index.tolist() )
    y=list( data_price.loc[:,['open','close','low','high']].round(2).values )#现在里面的单个元素是数组
    y=[i.tolist() for i in y]#里面的单个数组也必须转换成list
    kline.add_yaxis( 'K线',y )
    #kline.extend_axis(yaxis=opts.AxisOpts( axislabel_opts=opts.LabelOpts(formatter="{value}") ))
    kline.set_series_opts(label_opts=opts.LabelOpts(is_show=False))#是否显示数据标签                        
    kline.set_global_opts(
        xaxis_opts=opts.AxisOpts(is_scale=True,axislabel_opts=opts.LabelOpts(rotate=60)),
        yaxis_opts=
  • 15
    点赞
  • 89
    收藏
    觉得还不错? 一键收藏
  • 8
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值