Warning: file_exists(): open_basedir restriction in effect. File(/www/wwwroot/com.xiximiao.oa/com.cmstop/public/www/wp-content/db.php) is not within the allowed path(s): (/www/wwwroot/com.xiximiao.oa/com.cmstop/public/www/:/tmp/:/proc/:/var/log/nginx/:/www/wwwroot/com.xiximiao.oa/com.cmstop/public/:/www/wwwroot/com.xiximiao.oa/com.cmstop/vendor/:/www/wwwroot/com.xiximiao.oa/com.cmstop/ppk/) in /www/wwwroot/com.xiximiao.oa/com.cmstop/public/www/wp-includes/load.php on line 707
2018 6年17倍的etf+分级b的轮动趋势策略跟随感悟.py » 轻知量化 QMT、PTrade、聚宽策略分享交流平台

2018 6年17倍的etf+分级b的轮动趋势策略跟随感悟.py

# 风险及免责提示:该策略由聚宽用户分享,仅供学习交流使用。
# 原文一般包含策略说明,如有疑问建议到原文和作者交流讨论。
# 克隆自聚宽文章:https://www.joinquant.com/post/28324
# 标题:6年17倍的etf+分级b的轮动趋势策略跟随感悟
# 作者:大吃一鲸

# 克隆自聚宽文章:https://www.joinquant.com/post/24417
# 标题:策略coding吐槽帖——以“网红”ETF轮动为例
# 作者:jqz1226

# 克隆自聚宽文章:https://www.joinquant.com/post/24321
# 标题:无杠杆,稳定盈利的etf轮动,06年开始3000%收益
# 作者:热爱大自然

# 克隆自聚宽文章:https://www.joinquant.com/post/22857
# 标题:无杠杆,回撤更小的etf轮动
# 作者:智习

from jqdata import *
import pandas as pd
import talib

'''
原理:在8个种类的ETF中,持仓三个,ETF池相应的指数分别是
        '159915.XSHE' #创业板、
        '159949.XSHE' #创业板50
        '510300.XSHG' #沪深300
        '510500.XSHG' #中证500
        '510880.XSHG' #红利ETF
        '159905.XSHE' #深红利
        '510180.XSHG' #上证180
        '510050.XSHG' #上证50
持仓原则:
    1、对泸深指数的成交量进行统计,如果连续6(lag)天成交量小于7(lag0)天成交量的,空仓处理(购买货币基金511880 银华日利或国债 511010 )
    2、13个交易日内(lag1)涨幅大于1的,并且“均线差值”大于0的才进行考虑。
    3、对符合考虑条件的ETF的涨幅进行排序,买涨幅最高的三个。
'''


def initialize(context):
    set_params()
    #
    set_option("avoid_future_data", True)
    set_option('use_real_price', True)  # 用真实价格交易
    set_benchmark('399001.XSHE')
    log.set_level('order', 'error')
    #
    # 将滑点设置为0
    set_slippage(FixedSlippage(0))
    # 手续费: 采用系统默认设置 

    # 开盘前运行
    run_daily(before_market_open, time='before_open', reference_security='000300.XSHG')
    # 11:30 计算大盘信号
    run_daily(get_signal, time='11:30')
    # 14:40 进行交易
    run_daily(ETFtrade, time='14:40')


# 1 设置参数
def set_params():
    g.use_dynamic_target_market = True  # 是否动态改变大盘热度参考指标
    # g.target_market = '000300.XSHG'
    g.target_market = '399001.XSHE'
    g.empty_keep_stock = '511880.XSHG'  # 闲时买入的标的
    # g.empty_keep_stock = '601318.XSHG'#闲时买入的标的
    g.signal = 'BUY'  # 交易信号初始化
    g.emotion_rate = 0  # 市场热度
    g.lag = 6  # 大盘成交量连续跌破均线的天数,发出空仓信号
    g.lag0 = 7  # 大盘成交量监控周期
    g.lag1 = 13  # 比价均线周期
    g.lag2 = 13  # 价格涨幅计算周期
    #
    g.buy = []  # 购买股票列表
    # 指数、基金对, 所有想交易的etf都可以,会自动过滤掉交易时没有上市的
    g.ETF_targets =  {
        '399001.XSHE':'150019.XSHE',#银华锐进
        #'399905.XSHE':'159902.XSHE',#中小板指
        #'399975.XSHE':'150201.XSHE',#券商B
        #'399632.XSHE':'159901.XSHE',#深100etf
        #'162605.XSHE':'162605.XSHE',#景顺鼎益
        '000016.XSHG':'510050.XSHG',#上证50
        '000010.XSHG':'510180.XSHG',#上证180
        #'000015.XSHG':'510880.XSHG',#红利ETF
        '399324.XSHE':'159905.XSHE',#深红利
        '399006.XSHE':'159915.XSHE',#创业板
        #'399006.XSHE':'150153.XSHE',#创业板B
        #'000300.XSHG':'510300.XSHG',#沪深300
        '000905.XSHG':'510500.XSHG',#中证500
        '399673.XSHE':'159949.XSHE',#创业板50
        '399976.XSHE':'515700.XSHG',# 新能车etf
        #'399967.XSHE':'512660.XSHG',# 军工etf 
        #'399933.XSHE':'512010.XSHG',# 医药etf 
        '399441.XSHE':'512290.XSHG',# 生物医药etf 
        #'512480.XSHG':'512480.XSHG',# 半导体etf缺指数
        #'000935.XSHG':'515000.XSHG',# 科技etf 
    }
    #
    stocks_info = "\n股票池:\n"
    for security in g.ETF_targets.values():
        s_info = get_security_info(security)
        stocks_info += "【%s】%s 上市日期:%s\n" % (s_info.code, s_info.display_name, s_info.start_date)
    log.info(stocks_info)

def get_before_after_trade_days(date, count, is_before=True):
    """
    来自: https://www.joinquant.com/view/community/detail/c9827c6126003147912f1b47967052d9?type=1
    date :查询日期
    count : 前后追朔的数量
    is_before : True , 前count个交易日  ; False ,后count个交易日
    返回 : 基于date的日期, 向前或者向后count个交易日的日期 ,一个datetime.date 对象
    """
    all_date = pd.Series(get_all_trade_days())
    if isinstance(date, str):
        date = datetime.datetime.strptime(date, '%Y-%m-%d').date()
    if isinstance(date, datetime.datetime):
        date = date.date()

    if is_before:
        return all_date[all_date <= date].tail(count).values[0]
    else:
        return all_date[all_date >= date].head(count).values[-1]



后续代码已更新,正式用户可见

⚠️
本站资源大多来自网络,仅供网友学习交流,未经作者或上传书面授权,请勿作他用。
站长 vx: xiangyin615 或者 留言反馈 ,我们将尽快处理。
Notice: When you of the legal rights be violate, please stir to vx: xiangyin615
个人中心
购物车
优惠劵
搜索