# 风险及免责提示:该策略由聚宽用户分享,仅供学习交流使用。
# 原文一般包含策略说明,如有疑问建议到原文和作者交流讨论。
# 克隆自聚宽文章:https://www.joinquant.com/post/26117
# 标题:持续跑赢大盘-真蓝筹v2(资金容量千万以上)
# 作者:柱子嗨翻天
# 导入函数库
import statsmodels.api as sm
import pandas as pd
import numpy as np
import datetime as dt
from jqdata import *
# 初始化函数,设定基准等等
def initialize(context):
# 开启动态复权模式(真实价格)
set_option('use_real_price', True)
# 过滤掉order系列API产生的比error级别低的log
log.set_level('order', 'error')
# 股票类每笔交易时的手续费是:买入时佣金万分之三,卖出时佣金万分之三加千分之一印花税, 每笔交易佣金最低扣5块钱
set_order_cost(OrderCost(close_tax=0.001, open_commission=0.0003, close_commission=0.0003, min_commission=5), type='stock')
# 设置RSRS指标
set_parameter_RSRS(context)
# 设置一般参数
g.trend='None'
g.day_count=0
g.period=22
# 开盘前运行
run_daily(before_market_open, time='9:20', reference_security='000300.XSHG')
# 开盘时运行
run_daily(market_open, time='open', reference_security='000300.XSHG')
#################################参数设置部分#################################
def set_parameter_RSRS(context):
# 设置RSRS指标
#统计周期
g.N = 18
#统计样本长度
g.M = 1100
# g.M = 600
#首次运行判断
g.init = True
#风险参考基准
g.security = '000300.XSHG' #沪深300
# 设定策略运行基准
set_benchmark(g.security)
# 买入阈值
g.buy = 0.7
g.sell = -0.7
#用于记录回归后的beta值,即斜率
g.ans = []
#用于计算被决定系数加权修正后的贝塔值
g.ans_rightdev= []
# 计算2005年1月5日至回测开始日期的RSRS斜率指标
# 获得回测前一天日期,千万避免未来数据
previous_date = context.current_dt - datetime.timedelta(days=2)
prices = get_price(g.security, '2005-01-05', previous_date, '1d', ['high', 'low'])
prices[np.isnan(prices)] = 0
prices[np.isinf(prices)] = 0
highs = prices.high
lows = prices.low
g.ans = []
for i in range(len(highs))[g.N:]:
data_high = highs.iloc[i-g.N+1:i+1]
data_low = lows.iloc[i-g.N+1:i+1]
X = sm.add_constant(data_low)
model = sm.OLS(data_high,X)
results = model.fit()
g.ans.append(results.params[1])
#计算r2
g.ans_rightdev.append(results.rsquared)
## 开盘前运行函数
def before_market_open(context):
# 计算RSRS斜率数据,判断多空时机
# 填入各个日期的RSRS斜率值
beta=0
r2=0
if g.init:
g.init = False
else:
#RSRS斜率指标定义
prices = attribute_history(g.security, g.N, '1d', ['high', 'low'])
prices[np.isnan(prices)] = 0
prices[np.isinf(prices)] = 0
highs = prices.high
lows = prices.low
X = sm.add_constant(lows)
model = sm.OLS(highs, X)
beta = model.fit().params[1]
g.ans.append(beta)
#计算r2
r2=model.fit().rsquared
g.ans_rightdev.append(r2)
# 计算标准化的RSRS指标
section = g.ans[-g.M:]
# 计算均值序列
mu = np.mean(section)
# 计算标准化RSRS指标序列
sigma = np.std(section)
zscore = (section[-1]-mu)/sigma
#计算右偏RSRS标准分
g.zscore_rightdev= zscore*beta*r2
# 如果上一时间点的RSRS斜率大于买入阈值, 则全仓买入
if g.zscore_rightdev > g.buy:
log.info("市场风险在合理范围。做多。")
g.trend='up'
# 如果上一时间点的RSRS斜率小于卖出阈值, 则空仓卖出
if g.zscore_rightdev < g.sell:
log.info("市场风险过大。不做多")
g.trend='down'
log.info('趋势',g.trend)
log.info('今日右偏RSRS标准分:',g.zscore_rightdev)
⚠️
本站资源大多来自网络,仅供网友学习交流,未经作者或上传书面授权,请勿作他用。
站长 vx: xiangyin615 或者 留言反馈 ,我们将尽快处理。
Notice: When you of the legal rights be violate, please stir to vx: xiangyin615
站长 vx: xiangyin615 或者 留言反馈 ,我们将尽快处理。
Notice: When you of the legal rights be violate, please stir to vx: xiangyin615
