【量化策略一】多因子策略收益高,回撤也大

本策略每隔1个月定时触发,根据基本面(归属母公司净利润增长率)。

策略思路:

每个月选择归属母公司净利润增长率前五的股票,平掉掉出前五的,买入新增的
结论:策略累计收益率19%,平均年化2%
沪深300累计收益率-14%,

2010-01-01至2020-01-01,沪深300累计收益率15%,
5只创业板,也是策略累计收益率654%,平均年化65%

2018-01-01至2019-01-01,沪深300累计收益率-26%,
20只创业板,策略累计收益率-26%,沪深300累计收益率-26%,
5只创业板,也是策略累计收益率-26%,

2020-01-01至2020-06-19,沪深300累计收益率-1.2%,每月调仓
20只创业板,策略累计收益率42%,年化90%
10只创业板,策略累计收益率46%,年化98%
5只创业板,策略累计收益率61%,年化131%
每周调仓,5只创业板,策略累计收益率55%,年化111%
# coding=utf-8
from __future__ import print_function, absolute_import, unicode_literals
import numpy as np
import pandas as pd
from gm.api import *



def init(context):
    # 每月第一个交易日的09:40 定时执行algo任务
    schedule(schedule_func=algo, date_rule='1m', time_rule='09:40:00')
    # 数据滑窗
    # context.date = 5
    # 设置开仓的最大资金量
    context.ratio = 0.8
    # 沪深300 SHSE.000300,创业板指 SZSE.399006
    context.index = "SHSE.000300"
    context.num = 5
    context.list =[]
    subscribe(symbols= context.index, frequency='1d', count=2)
    context.symbol="SHSE.000300"
    # 默认回撤超过10%即止损
    context.stop_loss = 0.1
    context.high = 0

def algo(context):
    now = context.now
    order_close_all()
    symbol_list = get_history_constituents(index=context.index, start_date=now)[0].get("constituents").keys()
    # NPGRT  归属母公司净利润增长率 (本期归属母公司净利润 - 上年同期归属母公司净利润)/上年同期归属母公司净利润*100%
    
    df = get_fundamentals_n(table="deriv_finance_indicator",symbols=symbol_list,end_date=now, fields="NPGRT", count=1, df=True)
   
    df['sum'] = df['NPGRT_sort']+df['ROE_sort']

    df = df.sort_values(["sum"], ascending=False)

    target_list = df["symbol"].values
    target_list = target_list[:context.num]

    # 计算要卖出的差集
    have_list = context.list
    sell_list = list(set(have_list).difference(set(target_list)))
    print(str(now) + '卖出:\n' + str(sell_list))

    buy_list = list(set(target_list).difference(set(have_list)))
    print(str(now) + '买入:\n' + str(buy_list))
    context.list=target_list
    for symbol in target_list:
        order_target_percent(symbol=symbol, percent=1./context.num, order_type=OrderType_Market, position_side=PositionSide_Long)
    print(str(now) + '持仓:\n' + str(target_list))

# 查看最终的回测结果
def on_backtest_finished(context, indicator):
    print(indicator)

if __name__ == '__main__':
    '''
    strategy_id策略ID,由系统生成
    filename文件名,请与本文件名保持一致
    mode实时模式:MODE_LIVE回测模式:MODE_BACKTEST
    token绑定计算机的ID,可在系统设置-密钥管理中生成
    backtest_start_time回测开始时间
    backtest_end_time回测结束时间
    backtest_adjust股票复权方式不复权:ADJUST_NONE前复权:ADJUST_PREV后复权:ADJUST_POST
    backtest_initial_cash回测初始资金
    backtest_commission_ratio回测佣金比例
    backtest_slippage_ratio回测滑点比例
    '''

    run(strategy_id='7092c40b-8829-11ea-b2b5-0a0027000006',
        filename='multiple_factor_base.py',
        mode=MODE_BACKTEST,
        token='9b06ce1b5a39ac39d71e58836549a95259fdcb60',
        backtest_start_time='2010-01-01 08:00:00',
        backtest_end_time='2012-01-01 16:00:00',
        backtest_adjust=ADJUST_PREV,
        backtest_initial_cash=1000000,
        backtest_commission_ratio=0.0003,
        backtest_slippage_ratio=0.0001)

猜你喜欢

转载自blog.csdn.net/luansj/article/details/108298771