分享

多因子策略(一) | RiceQuant米筐量化社区 交易策略论坛

 pangQ 2017-06-30
回测收益回测年化收益基准收益AlphaBetaSharpe最大回撤
444.638%77.435%103.825%0.19170.85561.073354.812%
Created with Highstock 4.2.4缩放1月3月6月1年全部2010-01-042015-12-18累计收益20112012201320142015-50.00%0%50.00%100.00%150.00%200.00%250.00%300.00%350.00%400.00%450.00%500.00%550.00%600.00%650.00%

2015-12-18 00:00:00

  • 我的策略累计收益: 444.638%
  • 基准策略累计收益: 103.825%
  • 收益
    1个月(策略&基准)
    3个月(策略&基准)
    6个月(策略&基准)
    12个月(策略&基准)
  • 2010.01
    N/A    N/A
    N/A    N/A
    N/A    N/A
    N/A    N/A
  • 2010.02
    N/A    N/A
    N/A    N/A
    N/A    N/A
    N/A    N/A
  • 2010.03
    N/A    N/A
    N/A    N/A
    N/A    N/A
    N/A    N/A
  • 2010.04
    N/A    N/A
    N/A    N/A
    N/A    N/A
    N/A    N/A
  • 2010.05
    N/A    N/A
    N/A    N/A
    N/A    N/A
    N/A    N/A
  • 2010.06
    N/A    N/A
    N/A    N/A
    N/A    N/A
    N/A    N/A
  • 2010.07
    N/A    N/A
    N/A    N/A
    N/A    N/A
    N/A    N/A
  • 2010.08
    N/A    N/A
    N/A    N/A
    N/A    N/A
    N/A    N/A
  • 2010.09
    N/A    N/A
    N/A    N/A
    N/A    N/A
    N/A    N/A
  • 2010.10
    N/A    N/A
    N/A    N/A
    N/A    N/A
    N/A    N/A
  • 2010.11
    N/A    N/A
    N/A    N/A
    N/A    N/A
    N/A    N/A
  • 2010.12
    N/A    N/A
    N/A    N/A
    N/A    N/A
    N/A    N/A
  • 2011.01
    N/A    N/A
    N/A    N/A
    N/A    N/A
    N/A    N/A
  • 2011.02
    N/A    N/A
    N/A    N/A
    N/A    N/A
    N/A    N/A
  • 2011.03
    N/A    N/A
    N/A    N/A
    N/A    N/A
    N/A    N/A
  • 2011.04
    N/A    N/A
    N/A    N/A
    N/A    N/A
    N/A    N/A
  • 2011.05
    N/A    N/A
    N/A    N/A
    N/A    N/A
    N/A    N/A
  • 2011.06
    N/A    N/A
    N/A    N/A
    N/A    N/A
    N/A    N/A
  • 2011.07
    N/A    N/A
    N/A    N/A
    N/A    N/A
    N/A    N/A
  • 2011.08
    N/A    N/A
    N/A    N/A
    N/A    N/A
    N/A    N/A
  • 2011.09
    N/A    N/A
    N/A    N/A
    N/A    N/A
    N/A    N/A
  • 2011.10
    N/A    N/A
    N/A    N/A
    N/A    N/A
    N/A    N/A
  • 2011.11
    N/A    N/A
    N/A    N/A
    N/A    N/A
    N/A    N/A
  • 2011.12
    N/A    N/A
    N/A    N/A
    N/A    N/A
    N/A    N/A
  • 2012.01
    N/A    N/A
    N/A    N/A
    N/A    N/A
    N/A    N/A
  • 2012.02
    N/A    N/A
    N/A    N/A
    N/A    N/A
    N/A    N/A
  • 2012.03
    N/A    N/A
    N/A    N/A
    N/A    N/A
    N/A    N/A
  • 2012.04
    N/A    N/A
    N/A    N/A
    N/A    N/A
    N/A    N/A
  • 2012.05
    N/A    N/A
    N/A    N/A
    N/A    N/A
    N/A    N/A
  • 2012.06
    N/A    N/A
    N/A    N/A
    N/A    N/A
    N/A    N/A
  • 2012.07
    N/A    N/A
    N/A    N/A
    N/A    N/A
    N/A    N/A
  • 2012.08
    N/A    N/A
    N/A    N/A
    N/A    N/A
    N/A    N/A
  • 2012.09
    N/A    N/A
    N/A    N/A
    N/A    N/A
    N/A    N/A
  • 2012.10
    N/A    N/A
    N/A    N/A
    N/A    N/A
    N/A    N/A
  • 2012.11
    N/A    N/A
    N/A    N/A
    N/A    N/A
    N/A    N/A
  • 2012.12
    N/A    N/A
    N/A    N/A
    N/A    N/A
    N/A    N/A
  • 2013.01
    N/A    N/A
    N/A    N/A
    N/A    N/A
    N/A    N/A
  • 2013.02
    N/A    N/A
    N/A    N/A
    N/A    N/A
    N/A    N/A
  • 2013.03
    N/A    N/A
    N/A    N/A
    N/A    N/A
    N/A    N/A
  • 2013.04
    N/A    N/A
    N/A    N/A
    N/A    N/A
    N/A    N/A
  • 2013.05
    N/A    N/A
    N/A    N/A
    N/A    N/A
    N/A    N/A
  • 2013.06
    N/A    N/A
    N/A    N/A
    N/A    N/A
    N/A    N/A
  • 2013.07
    N/A    N/A
    N/A    N/A
    N/A    N/A
    N/A    N/A
  • 2013.08
    N/A    N/A
    N/A    N/A
    N/A    N/A
    N/A    N/A
  • 2013.09
    N/A    N/A
    N/A    N/A
    N/A    N/A
    N/A    N/A
  • 2013.10
    N/A    N/A
    N/A    N/A
    N/A    N/A
    N/A    N/A
  • 2013.11
    N/A    N/A
    N/A    N/A
    N/A    N/A
    N/A    N/A
  • 2013.12
    N/A    N/A
    N/A    N/A
    N/A    N/A
    N/A    N/A
  • 2014.01
    N/A    N/A
    N/A    N/A
    N/A    N/A
    N/A    N/A
  • 2014.02
    N/A    N/A
    N/A    N/A
    N/A    N/A
    N/A    N/A
  • 2014.03
    N/A    N/A
    N/A    N/A
    N/A    N/A
    N/A    N/A
  • 2014.04
    N/A    N/A
    N/A    N/A
    N/A    N/A
    N/A    N/A
  • 2014.05
    N/A    N/A
    N/A    N/A
    N/A    N/A
    N/A    N/A
  • 2014.06
    N/A    N/A
    N/A    N/A
    N/A    N/A
    N/A    N/A
  • 2014.07
    N/A    N/A
    N/A    N/A
    N/A    N/A
    N/A    N/A
  • 2014.08
    N/A    N/A
    N/A    N/A
    N/A    N/A
    N/A    N/A
  • 2014.09
    N/A    N/A
    N/A    N/A
    N/A    N/A
    N/A    N/A
  • 2014.10
    N/A    N/A
    N/A    N/A
    N/A    N/A
    N/A    N/A
  • 2014.11
    N/A    N/A
    N/A    N/A
    N/A    N/A
    N/A    N/A
  • 2014.12
    N/A    N/A
    N/A    N/A
    N/A    N/A
    N/A    N/A
  • 2015.01
    N/A    N/A
    N/A    N/A
    N/A    N/A
    N/A    N/A
  • 2015.02
    N/A    N/A
    N/A    N/A
    N/A    N/A
    N/A    N/A
  • 2015.03
    N/A    N/A
    N/A    N/A
    N/A    N/A
    N/A    N/A
  • 2015.04
    N/A    N/A
    N/A    N/A
    N/A    N/A
    N/A    N/A
  • 2015.05
    N/A    N/A
    N/A    N/A
    N/A    N/A
    N/A    N/A
  • 2015.06
    N/A    N/A
    N/A    N/A
    N/A    N/A
    N/A    N/A
  • 2015.07
    N/A    N/A
    N/A    N/A
    N/A    N/A
    N/A    N/A
  • 2015.08
    N/A    N/A
    N/A    N/A
    N/A    N/A
    N/A    N/A
  • 2015.09
    N/A    N/A
    N/A    N/A
    N/A    N/A
    N/A    N/A
  • 2015.10
    N/A    N/A
    N/A    N/A
    N/A    N/A
    N/A    N/A
  • 2015.11
    N/A    N/A
    N/A    N/A
    N/A    N/A
    N/A    N/A
  • 2015.12
    N/A    N/A
    N/A    N/A
    N/A    N/A
    N/A    N/A

# 可以自己import我们平台支持的第三方python模块,比如pandas、numpy等。
import math
import numpy as np
import pandas as pd
import talib
OBSERVATION=40
# 在这个方法中编写任何的初始化逻辑。context对象将会在你的算法策略的任何方法之间做传递。
def init(context):
    context.benchmark='000037.XSHG'
    context.stocks =industry('C27')
    update_universe(context.stocks)
    get_parameter(context,None)
    context.number=12
    scheduler.run_weekly(get_parameter,weekday=1)
    scheduler.run_daily(handle_bar2)
# 你选择的证券的数据更新将会触发此段逻辑,例如日或分钟历史数据切片或者是实时数据切片更新
def get_parameter(context,bar_dict):
    #获取基本面数据
    fundamental_df = get_fundamentals(
        query(fundamentals.eod_derivative_indicator.pe_ratio,fundamentals.eod_derivative_indicator.pb_ratio,fundamentals.eod_derivative_indicator.market_cap,fundamentals.financial_indicator.inc_revenue,fundamentals.financial_indicator.inc_profit_before_tax
        ).filter(
             fundamentals.income_statement.stockcode.in_(context.stocks)
        ).filter(
            fundamentals.eod_derivative_indicator.pb_ratio>0
        ).filter(
            fundamentals.eod_derivative_indicator.pe_ratio>0
        ).filter(
            fundamentals.financial_indicator.inc_revenue>-99
        ).filter(
            fundamentals.financial_indicator.inc_profit_before_tax>-99
        )
    )
    df=fundamental_df.T
    
    #对基本面数据进行处理,便于计算
    pe_log=list(map(lambda x:math.log(float(x)),df.iloc[:,0]))
    pb_log=list(map(lambda x:(float(x)),df.iloc[:,1]))

    aaa=list(map(lambda x:float(x),df.iloc[:,2]))
    aaa=pd.DataFrame(aaa)
    meanc=float(df.iloc[:,2].mean())
    sdc=float(aaa.std())
    cap_sd=list(map(lambda x:(float(x)-meanc)/sdc,df.iloc[:,2]))
    inc_revenue=list(map(lambda x:math.log(float(x)*0.01+1),df.iloc[:,3]))
    inc_profit=list(map(lambda x:math.log(float(x)*0.01+1),df.iloc[:,4]))
    
    #通过多元回归得到相应的参数
    x=[]
    x.append(pb_log)
    x.append(inc_revenue)
    x.append(inc_profit)
    x.append(cap_sd)
    #x.append(pcf_log)
    x=np.mat(x)
    y=np.mat(pe_log)
    xx=(x*x.T).I
    beta=xx*(x*y.T)
    mean=np.mat([sum(pb_log)/len(pb_log),sum(inc_revenue)/len(inc_revenue),sum(inc_profit)/len(inc_profit),sum(cap_sd)/len(cap_sd)])
    alpha=sum(pe_log)/len(pe_log)-mean*beta
    
    context.alpha=alpha
    context.beta=beta
def handle_bar(context, bar_dict):
    pass
def handle_bar2(context, bar_dict):
    #获取基本面数据
    fundamental_df = get_fundamentals(
        query(fundamentals.eod_derivative_indicator.pe_ratio,fundamentals.eod_derivative_indicator.pb_ratio,fundamentals.eod_derivative_indicator.market_cap,fundamentals.financial_indicator.inc_revenue,fundamentals.financial_indicator.inc_profit_before_tax
        ).filter(
             fundamentals.income_statement.stockcode.in_(context.stocks)
        ).filter(
            fundamentals.eod_derivative_indicator.pb_ratio>0
        ).filter(
            fundamentals.eod_derivative_indicator.pe_ratio>0
        ).filter(
            fundamentals.financial_indicator.inc_revenue>-99
        ).filter(
            fundamentals.financial_indicator.inc_profit_before_tax>-99
        )
    )
    df=fundamental_df.T
    
    #处理基本面数据
    #logger.info(df)
    df['pe_log']=list(map(lambda x:math.log(float(x)),df.iloc[:,0]))
    pb_log=list(map(lambda x:(float(x)),df.iloc[:,1]))
    aaa=list(map(lambda x:float(x),df.iloc[:,2]))
    aaa=pd.DataFrame(aaa)
    meanc=float(df.iloc[:,2].mean())
    sdc=float(aaa.std())
    cap_sd=list(map(lambda x:(float(x)-meanc)/sdc,df.iloc[:,2]))
    inc_revenue=list(map(lambda x:math.log(float(x)*0.01+1),df.iloc[:,3]))
    inc_profit=list(map(lambda x:math.log(float(x)*0.01+1),df.iloc[:,4]))
    
    x=[]
    x.append(pb_log)
    x.append(inc_revenue)
    x.append(inc_profit)
    x.append(cap_sd)
    #x.append(pcf_log)
    x=np.mat(x)
    #利用回归参数计算价值
    pe_log_es=x.T*context.beta+context.alpha
    df['pe_log_es']=pe_log_es
    df['rate']=df['pe_log']/df['pe_log_es']
    df=df[df['rate']>0]
    df=df.sort(columns='rate')
    df=df.head(context.number)
    context.to_buy=df.T.columns.values
    
    rebalance(context, bar_dict)
    
def rebalance(context, bar_dict):
    stocks = set(context.to_buy)
    holdings = set(get_holdings(context))
    
    to_buy = stocks - holdings
    to_sell = holdings - stocks
    to_buy2= stocks - holdings
    for stock in to_sell:
        if bar_dict[stock].is_trading:
            order_target_percent(stock , 0)
    
                #logger.info(len(to_buy))  
    to_buy = get_trading_stocks(to_buy, context, bar_dict)
    if len(to_buy) >0:
        cash = context.portfolio.cash
        average_value = 0.98 * cash / len(to_buy)
    
        for stock in to_buy:
            if bar_dict[stock].is_trading:
                order_target_percent(stock , 0.142)
                
def get_trading_stocks(to_buy, context, bar_dict):
    trading_stocks = []
    for stock in to_buy:
        if bar_dict[stock].is_trading:
            trading_stocks.append(stock)
    
    return trading_stocks

def get_holdings(context):
    positions = context.portfolio.positions
    
    holdings = []
    for position in positions:
        if positions[position].quantity > 0:
            holdings.append(position)
    
    return holdings

策略名称: mutifactor 9
开始时间: 2010-01-01
结束时间: 2015-12-18
股票初始资金: undefined
回测频率: 1d
基准合约: --
佣金倍率:
撮合方式:
滑点:

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多