首页 > 其他分享 >量化交易:财务选股RSRS择时的策略

量化交易:财务选股RSRS择时的策略

时间:2024-05-14 19:22:21浏览次数:13  
标签:RSRS df roe 择时 context 选股 security

哈喽,大家好,我是木头左!

引言

本文将介绍一种结合财务指标选股和RSRS(Risk-Adjusted Return to Strength Ratio)择时的策略,旨在帮助投资者在复杂的市场环境中做出更明智的决策。 感兴趣的朋友,可以在下方公号内回复:001,即可获取源码,共同交流!

策略原理

财务指标选股

财务指标选股是一种基于公司财务报表数据来评估股票价值的方法。常见的财务指标包括市盈率(PE)、市净率(PB)、净资产收益率(ROE)等。这些指标可以帮助投资者判断公司的盈利能力、资产状况和成长潜力。在本策略中,使用市净率(PB)和净资产收益率(ROE)作为选股的主要依据。

RSRS择时

RSRS择时是一种基于历史价格数据的技术分析方法,用于评估市场的风险和收益。RSRS通过计算价格序列的回归斜率来衡量市场趋势的强度。当斜率大于买入阈值时,认为市场风险在合理范围内,可以进行买入操作;当斜率小于卖出阈值时,认为市场风险过大,应保持空仓状态。

在聚宽平台运行Python代码

初始化函数

在聚宽平台上,首先需要导入所需的函数库,并在initialize函数中设置策略的基本参数,如股票交易的手续费、基准指数等。

def initialize(context):
    set_option('use_real_price', True)
    set_parameter(context)
    set_order_cost(OrderCost(close_tax=0.001, open_commission=0.0003, close_commission=0.0003, min_commission=5), type='stock')
    run_daily(before_market_open, time='before_open', reference_security='000300.XSHG')
    run_daily(market_open, time='open', reference_security='000300.XSHG')

参数设置

set_parameter函数中,设置了RSRS指标中N和M的值,以及买入和卖出的阈值。此外,还计算了2005年1月5日至回测开始日期的RSRS斜率指标。

def set_parameter(context):
    g.N = 18
    g.M = 1100
    g.init = True
    g.stock_num = 10
    g.security = '000300.XSHG'
    set_benchmark(g.security)
    g.days = 0
    g.buy = 0.7
    g.sell = -0.7
    # ... 省略部分代码 ...

开盘前和开盘时运行函数

before_market_openmarket_open函数中,根据RSRS指标的计算结果来决定是否进行交易。如果RSRS指标大于买入阈值,则调用trade_func函数进行交易;如果小于卖出阈值且持有股票,则卖出所有股票。

security = g.security
    # 填入各个日期的RSRS斜率值
    beta=0
    r2=0
    if g.init:
        g.init = False
    else:
        #RSRS斜率指标定义
        prices = attribute_history(security, g.N, '1d', ['high', 'low'])
        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标准分
    zscore_rightdev= zscore*beta*r2
    
    # 如果上一时间点的RSRS斜率大于买入阈值, 则全仓买入
    if zscore_rightdev > g.buy:
        # 记录这次买入
        log.info("市场风险在合理范围")
        #满足条件运行交易
        trade_func(context)
    # 如果上一时间点的RSRS斜率小于卖出阈值, 则空仓卖出
    elif (zscore_rightdev < g.sell) and (len(list(context.portfolio.positions.keys())) > 0):
        # 记录这次卖出
        log.info("市场风险过大,保持空仓状态")
        # 卖出所有股票,使这只股票的最终持有量为0
        for s in list(context.portfolio.positions.keys()):
            order_target(s, 0)

策略选股买卖部分

trade_func函数中,首先获取股票池,然后根据市净率(PB)和净资产收益率(ROE)进行筛选和打分,最后根据得分选取前10只股票进行买入或卖出操作。

def trade_func(context):
    #获取股票池
    df = get_fundamentals(query(valuation.code,valuation.pb_ratio,indicator.roe))
    #进行pb,roe大于0筛选
    df = df[(df['roe']>0) & (df['pb_ratio']>0)].sort('pb_ratio')
    #以股票名词作为index
    df.index = df['code'].values
    #取roe倒数
    df['1/roe'] = 1/df['roe']
    #获取综合得分
    df['point'] = df[['pb_ratio','1/roe']].rank().T.apply(f_sum)
    #按得分进行排序,取指定数量的股票
    df = df.sort('point')[:g.stock_num]
    pool = df.index
    log.info('总共选出%s只股票'%len(pool))
    #得到每只股票应该分配的资金
    cash = context.portfolio.total_value/len(pool)
    #获取已经持仓列表
    hold_stock = list(context.portfolio.positions.keys()) 
    #卖出不在持仓中的股票
    for s in hold_stock:
        if s not in pool:
            order_target(s,0)
    #买入股票
    for s in pool:
        order_target_value(s,cash)

回测效果

通过在聚宽平台上运行上述策略,得到了以下回测效果:

从回测结果可以看出,该策略收益实在不怎么样,后续反向优化。

策略的缺点

  • 适用性 :在高波动性或快速变化的市场中,RSRS策略可能难以适应,导致投资组合表现不佳。
  • 交易成本 :为了降低交易成本,应合理控制交易频率,或者通过设置较长的交易周期或采用定期再平衡的方式来减少交易次数。
    市场有风险,交易需谨慎。感兴趣的朋友,可以在下方公号内回复:001,即可获取源码,共同交流!

我是木头左,感谢各位童鞋的点赞、收藏,我们下期更精彩!

标签:RSRS,df,roe,择时,context,选股,security
From: https://www.cnblogs.com/bigleft/p/18192035

相关文章

  • 2024-05-05 通达信选股 双黄连
     黄金阴:=O>REF(C,1)ANDC<OANDV<REF(V,1)*SL2;黄金阳:=C>OANDO<REF(C,1)ANDV<REF(V,1)*SL1ANDC<REF(C,1);COUNT(黄金阳,1)>=1ANDCOUNT(黄金阴,5)>=1;-------------------------------------------------------------------------------------......
  • Python量化交易系统实战--设计交易策略:选股策略
     作者:麦克煎蛋  出处:https://www.cnblogs.com/mazhiyong/转载请保留这段声明,谢谢! 这一节主要是了解基于“动量因子”的选股策略。动量因子指的是股票在一段周期内的涨跌幅度,其本质是追涨杀跌。而选股策略,指的是基于这个因子的表现进行股票筛选,以及买入、卖出的操作。该......
  • Python量化交易系统实战--设计交易策略:择时策略
     作者:麦克煎蛋  出处:https://www.cnblogs.com/mazhiyong/转载请保留这段声明,谢谢! 一、双均线策略1、什么是均线2、双均线策略  3、生成交易信号简单的根据金叉和死叉生成交易信号:defma_strategy(data,short_window=5,long_window=20):"""双均线策......
  • 通达信条件预警使用教程(引用选股公式盘中实时监控)
    步骤汇总:第1步:设置预警范围第2步:设置选股公式(预警公式)第3步:运行效果以下是详细步骤:第一步:设置预警范围 单击通达信右下角条件预警图标,单击设置,设置已有公式,过程如下:  注意事项:预警对电脑配置要求高,低配置的电脑不宜监控太多目标,建议只监控备选,此处我选择的是我之前......
  • 搜索的技巧VS选股
    今天在补充论文的文献部分,发现只有作者和年份如李晨(2003),本以为利用这两个数据查找引用的文献会很麻烦,没想到在百度学术上直接搜索李晨(2003)就出来了对应的文章。令我没想到的是,我本以为百度学术上搜索会和百度搜索与一样搜出一大堆无关的东西,或者叫李晨的写的文章很多,给我搜出......
  • 怎样选出绩优股?绩优股选股公式+人工复选(十步排雷)
    原始知识来源: https://xueqiu.com/9561240987/170507893 根据知识内容,自写指标,初选ROE优质企业。F10查看ROE: 十步排雷:排雷第1步:非金融行业要排除掉资产负债比率超过50%的或超过行业平均水平的,或者加权净资产收益率逐年降低,资产负债比率逐年走高的。为什么金融行业需要区......
  • MySQL如何选择时间类型
    日常业务中经常需要记录时间,如订单生成时间、记录保存时间、更新时间等。如何选择MySQL表的时间字段类型呢?一句话,看业务,具体是看业务是否会跨时区。MySQL的日期类型可以用于记录日期的格式有:Datatype实例备注DATE'0000-00-00'日期(年月日)TIME'00:00:00'......
  • 通达信骑牛找马选股指标公式源码附图
    {通达信骑牛找马选股指标公式源码附图}VAR1:=35;VAR2:=45;VAR3:=REF(CLOSE,1);VAR4:=SMA(MAX(CLOSE-VAR3,0),7,1)/SMA(Abs(CLOSE-VAR3),7,1)*100;VAR5:=SMA(MAX(CLOSE-VAR3,0),7,1)/SMA(ABS(CLOSE-VAR3),7,1)*100;牛股:=SMA(MAX(CLOSE-VAR3,0),7,1)/SMA(ABS(CLOSE-VAR3),......
  • 通达信回调选升级选股指标公式源码
    {通达信回调选升级选股指标公式源码}T:=IF(NAMELIKE('ST'),0,1)ANDIF(NAMELIKE('*'),0,1);T2:=NOT(CODELIKE('688'));T3:=NOT(CODELIKE('3'));T5:=NOT(CODELIKE('4'));T6:=NOT(CODELIKE('8'));T7:=NOT(INBLOCK('......
  • 通达信神舟一号选股指标公式源码副图选股
    {通达信神舟一号选股指标公式源码副图选股}QQ:=REF(LLV(LOW,30),1);DD:=REF(HHV(HIGH,30),1);ZZ:=REF(MA(V,3),1);VV:=((DD-QQ)/QQ)<10;BB:=V>=1.5*ZZ;CC:=(C-REF(C,1))/REF(C,1)>=0.05ANDDD/C<1.03;QQ1:=LLV(LOW,18);DD1:=HHV(HIGH,18);ZZ1:=MA(V,3);VV1:=((DD1......