@Channelchan
2018-01-24T19:26:20.000000Z
字数 1872
阅读 37088
利用价值因子选股后,在大盘低于MA30时,卖出一张股指期货作为对冲大盘风险。
import numpy as np
import talib as ta
import pandas as pd
import rqalpha
from rqalpha.api import *
from fxdayu_data import DataAPI
from rqalpha.const import INSTRUMENT_TYPE
def init(context):
df = DataAPI.candle('000001.XSHE', 'D')
df['MA_hedge'] = ta.abstract.DEMA(df, 4)
context.df = df
codes = pd.read_excel('factor.xlsx')
context.codes = codes.set_index('date')
def find_pool(context, date):
codes = context.codes.loc[date]
stocks = codes.index[codes == 1]
return stocks
def handle_bar(context, bar_dict):
hedge(context)
buy(context, bar_dict)
def buy(context, bar_dict):
try:
pool = find_pool(context, context.now)
except KeyError:
return
if pool is not None:
stocks_len = len(pool)
for stock in context.portfolio.positions:
instrument = instruments(stock)
if instrument.enum_type == INSTRUMENT_TYPE.FUTURE:
continue
if stock not in pool:
order_target_percent(stock, 0)
result = []
try:
for codes in pool:
data_c = history_bars(codes, 25, '1d', 'close', adjust_type='post')
ma = ta.MA(data_c, timeperiod=20)
if len(ma) > 3 and context.df.close.loc[context.now] > context.df.MA_hedge.loc[context.now]:
if ma[-1] > ma[-2] and ma[-2] > ma[-3] and codes not in result and codes not in context.portfolio.positions:
result.append(codes)
except KeyError:
return
if len(result):
for r in result:
order_target_percent(r, 1.0 / stocks_len)
def hedge(context):
for future in get_future_contracts("IF"):
try:
sell_qty = context.portfolio.positions[future].sell_quantity
if context.df.close.loc[context.now] < context.df.MA_hedge.loc[context.now] and sell_qty == 0:
sell_open(future, 1)
if context.df.close.loc[context.now] > context.df.MA_hedge.loc[context.now] and sell_qty > 0:
buy_close(future, 1)
except KeyError:
continue
config = {
"base": {
"start_date": "2016-08-01",
"end_date": "2017-08-01",
"frequency": '1d',
"accounts": {'stock':1000000, 'future':1000000},
"benchmark": "000300.XSHG"
},
"extra": {
"log_level": "verbose",
},
"mod": {
"sys_analyser": {
"enabled": True,
"plot": True
}
}
}
rqalpha.run_func(init=init, handle_bar=handle_bar, config=config)