策略分享

创业板ETF天弘159977

由bq0r1l32创建,最终由bq0r1l32 被浏览 60 用户

from jqdata import * import talib

初始化函数,设定基准等等 def initialize(context): # 设定沪深300作为基准 set_benchmark('000300.XSHG') # 设定交易手续费,买入时万分之二,卖出时万分之二加千分之一印花税 set_commission(PerTrade(buy_cost=0.0002, sell_cost=0.0002, min_cost=5)) # 设定成交量比率,高于2时不交易 g.volume_rate = 2 # 设定下跌幅度和反弹幅度 g.fall_rate = 0.2 g.back_rate = 0.05 # 设定上涨幅度和回落幅度 g.rise_rate = 0.15 g.fall_back_rate = 0.06 # 获取天弘创业板ETF的基金信息 g.etf = '159977.XSHE' g.etf_info = get_extras('fund_nav', [g.etf], start_date=context.current_dt.strftime("%Y-%m-%d"), end_date=context.current_dt.strftime("%Y-%m-%d"), df=True) # 获取天弘创业板ETF的历史数据 g.etf_history = attribute_history(g.etf, 72, '1d', ('close'), skip_paused=True, df=True) g.etf_close = g.etf_history['close'] # 获取天弘创业板ETF的交易状态 g.etf_trading_status = get_security_info(g.etf).is_trading # 记录当天是否已经交易过 g.traded = False

策略入口函数,每个单位时间调用一次 def handle_data(context, data): # 获取当前时间 now = context.current_dt.time()

如果当前时间不在交易时间段内,则退出策略

if now < datetime.time(9, 30) or now > datetime.time(15, 0): return

如果天弘创业板ETF停牌,则退出策略

if not g.etf_trading_status: return

获取天弘创业板ETF的历史数据中最近30天的收盘价

close_30 = g.etf_close[-30:]

获取天弘创业板ETF的历史数据中最近72天的收盘价

close_72 = g.etf_close

计算30日均线和72日均线的平均数

base_price = talib.MA((close_30 + close_72) / 2, timeperiod=1)[-1]

获取天弘创业板ETF的当前价格

current_price = g.etf_info.loc[context.current_dt.strftime("%Y-%m-%d"), g.etf]

获取天弘创业板ETF的当前成交量

current_volume = data[g.etf].volume

判断是否在上次成交之后的下一个交易日,如果是就将traded设为False

if not g.traded: if (context.current_dt - g.last_dt).days > 1: g.traded = False

如果当前价格跌破基准价,则买入1000份天弘创业板ETF

if current_price < base_price * (1 - g.fall_rate): if (current_price / base_price) > 1 - g.back_rate: if not g.traded and current_volume < g.volume_rate * g.etf_info.loc[context.current_dt.strftime("%Y-%m-%d"), '{}_volume'.format(g.etf)]: order_value(g.etf, 1000 * current_price) g.traded = True g.last_dt = context.current_dt

如果当前价格涨到基准价的上涨幅度,则卖出1000份天弘创业板ETF

elif current_price > base_price * (1 + g.rise_rate): if (current_price / base_price) < 1 - g.fall_back_rate: if not g.traded and current_volume < g.volume_rate * g.etf_info.loc[context.current_dt.strftime("%Y-%m-%d"), '{}_volume'.format(g.etf)]: order_target(g.etf, 0) g.traded = True g.last_dt = context.current_dt

评论
  • 6 第一次看到有人想搞ETF
  • 想法很棒,值得学习
{link}