股票平台突破策略量化回测
策略逻辑:
在振幅为15%以内(20cm的在30%以内),横盘60天左右。昨日涨停并且收盘价突破盘整平台最高价。次日以开盘价买入。
买卖点:
买入次日开盘价低开3%以上的直接以开盘价止损。
高开5个点、非一字板的以开盘价卖出。
账户止损:当账户中某只股票损失成本的13%时清仓。
账户止盈:当账户中某只股票盈利15%时清仓;300和688的盈利30%清仓。
代码:
from jqdata import *
import datetime
### 初步筛选出 300天内非st的、上市满300天的所有沪深股票
class Code(object):
def __init__(self):
## 获取今天的日期
self.today = datetime.date.today()
### 获取300天之前的日期
self.day1 = datetime.date.today()-datetime.timedelta(300)
self.day2 = datetime.datetime.strftime(self.today,"%Y-%m-%d" )
def get_code1(self):
### 获取所有股票代码
all_stock = get_all_securities(types=['stock'], date=self.day2)
code = all_stock['name']
return code
def get_code2(self):
code = list(Code.get_code1(self).index)
# 判断最近300天是否ST 并且删除st的股票代码
df_st=get_extras('is_st',code,start_date=self.day1,end_date=self.day2)
for i in code:
if any(df_st[i].values):
code.remove(i)
stock_list=[]
for i in code:
start_date=get_security_info(i).start_date
days=(self.today-start_date).days
if days>=300: #### 选出上市满天300的股票
stock_list.append(i)
return stock_list
### 开盘前选出股票池,减少回测负担,要不然回测更慢
def market_open(context):
code_demo = Code()
code1 = code_demo.get_code2()
return code1
def initialize(context):
# 设定上证指数作为基准
set_benchmark('000001.XSHG')
# 开启动态复权模式(真实价格)
set_option('use_real_price', True)
# 设置滑点 为0.01
set_slippage(FixedSlippage(0.01))
g.security = market_open(context)
### 交易过程
def handle_data(context,data):
cur_date = context.current_dt.strftime('%Y-%m-%d')
yesterday = (context.current_dt-datetime.timedelta(1)).strftime('%Y-%m-%d')
try:
for i in g.security:
zt_p = get_current_data()[i].high_limit
dt_p = get_current_data()[i].low_limit
open_p = get_current_data()[i].last_price ### day_open
df=get_price(i,end_date=yesterday,count=60,frequency='daily',fields=['high','low','close','open'])
df_open = df.open[-1]
df_low = df.low[:-1].min()
df_high = df.high[:-1].max()
df_close = df.close[-1]
df_before_close = df.close[-2]
if i in context.portfolio.positions.keys() and context.portfolio.positions[i].init_time.strftime('%Y-%m-%d')!=cur_date:
if context.portfolio.positions[i].init_time.strftime('%Y-%m-%d')!=cur_date:
### 每日低开3个点以上的 开盘价卖出
if zt_p<open_p<df_close*0.96:
order_target(i, 0)
### 高开5个点以上,非一字板的卖出
if df_close/df_open>0.95 and open_p>df_close*1.05 and open_p<zt_p:
order_target(i, 0)
### 买入当天被套5个点以上的,成本超过成本13个点割肉
if df_close/df_open<0.95 and open_p<0.87*context.portfolio.positions[i].avg_cost:
order_target(i, 0)
### 止盈
if i[:2] == '60' or i[:2]=='00' and open_p/context.portfolio.positions[i].avg_cost>1.15:
order_target(i, 0)
if i[:2] == '30' or i[:2]=='68' and open_p/context.portfolio.positions[i].avg_cost>1.30:
order_target(i, 0)
if context.portfolio.available_cash>=100000:
if i not in context.portfolio.positions.keys():
if i[:2] =='60' or i[:2]=='00':
if dt_p*1.05<open_p<zt_p and df_high/df_low< 1.2 and df_close/df_before_close>1.099 and 1.01<df_close/df_high<1.05:
order_target_value(i, 200000) ### 每只股票买20万
if i[:2] == '30' or i[:2] == '68':
if dt_p*1.15<open_p<zt_p and df_high/df_low< 1.4 and df_close/df_before_close>1.199 and 1.02<df_close/df_high<1.1:
order_target_value(i, 200000) ### 每只股票买10万
except Exception as e: # 未捕获到异常,程序直接报错
print (e)