策略代码
# 标题:首板低开策略
# 回测资金200000
from jqlib.technical_analysis import *
from jqfactor import *
from jqdata import *
import datetime as dt
import pandas as pd
def initialize(context):
# 系统设置
set_option('use_real_price', True)
set_option('avoid_future_data', True)
log.set_level('system', 'error')
# 每日运行
run_daily(buy, '09:30') #9:25分知道开盘价后可以提前下单
run_daily(sell, '11:28')
run_daily(sell, '14:50')
关键函数解锁后查看:
def sell(context):
# 基础信息
date = transform_date(context.previous_date, 'str')
current_data = get_current_data()
# 根据时间执行不同的卖出策略
if str(context.current_dt)[-8:] == '11:28:00':
for s in list(context.portfolio.positions):
if ((context.portfolio.positions[s].closeable_amount != 0) and (current_data[s].last_price < current_data[s].high_limit) and (current_data[s].last_price > context.portfolio.positions[s].avg_cost)):
order_target_value(s, 0)
print( '止盈卖出', [get_security_info(s, date).display_name, s])
print('———————————————————————————————————')
if str(context.current_dt)[-8:] == '14:50:00':
for s in list(context.portfolio.positions):
if ((context.portfolio.positions[s].closeable_amount != 0) and (current_data[s].last_price < current_data[s].high_limit)):
order_target_value(s, 0)
print( '止损卖出', [get_security_info(s, date).display_name, s])
print('———————————————————————————————————')
############################################################################################################################################################################
# 处理日期相关函数
def transform_date(date, date_type):
if type(date) == str:
str_date = date
dt_date = dt.datetime.strptime(date, '%Y-%m-%d')
d_date = dt_date.date()
elif type(date) == dt.datetime:
str_date = date.strftime('%Y-%m-%d')
dt_date = date
d_date = dt_date.date()
elif type(date) == dt.date:
str_date = date.strftime('%Y-%m-%d')
dt_date = dt.datetime.strptime(str_date, '%Y-%m-%d')
d_date = date
dct = {'str':str_date, 'dt':dt_date, 'd':d_date}
return dct[date_type]
def get_shifted_date(date, days, days_type='T'):
#获取上一个自然日
d_date = transform_date(date, 'd')
yesterday = d_date + dt.timedelta(-1)
#移动days个自然日
if days_type == 'N':
shifted_date = yesterday + dt.timedelta(days+1)
#移动days个交易日
if days_type == 'T':
all_trade_days = [i.strftime('%Y-%m-%d') for i in list(get_all_trade_days())]
#如果上一个自然日是交易日,根据其在交易日列表中的index计算平移后的交易日
if str(yesterday) in all_trade_days:
shifted_date = all_trade_days[all_trade_days.index(str(yesterday)) + days + 1]
#否则,从上一个自然日向前数,先找到最近一个交易日,再开始平移
else: #否则,从上一个自然日向前数,先找到最近一个交易日,再开始平移
for i in range(100):
last_trade_date = yesterday - dt.timedelta(i)
if str(last_trade_date) in all_trade_days:
shifted_date = all_trade_days[all_trade_days.index(str(last_trade_date)) + days + 1]
break
return str(shifted_date)
# 过滤函数
def filter_new_stock(initial_list, date, days=250):
d_date = transform_date(date, 'd')
return [stock for stock in initial_list if d_date - get_security_info(stock).start_date > dt.timedelta(days=days)]
def filter_st_stock(initial_list, date):
str_date = transform_date(date, 'str')
if get_shifted_date(str_date, 0, 'N') != get_shifted_date(str_date, 0, 'T'):
str_date = get_shifted_date(str_date, -1, 'T')
df = get_extras('is_st', initial_list, start_date=str_date, end_date=str_date, df=True)
df = df.T
df.columns = ['is_st']
df = df[df['is_st'] == False]
filter_list = list(df.index)
return filter_list
def filter_kcbj_stock(initial_list):
return [stock for stock in initial_list if stock[0] != '4' and stock[0] != '8' and stock[:2] != '68']
def filter_paused_stock(initial_list, date):
df = get_price(initial_list, end_date=date, frequency='daily', fields=['paused'], count=1, panel=False, fill_paused=True)
df = df[df['paused'] == 0]
paused_list = list(df.code)
return paused_list
# 每日初始股票池
def prepare_stock_list(date):
initial_list = get_all_securities('stock', date).index.tolist()
initial_list = filter_kcbj_stock(initial_list)
initial_list = filter_new_stock(initial_list, date)
initial_list = filter_st_stock(initial_list, date)
initial_list = filter_paused_stock(initial_list, date)
return initial_list
筛选计算涨停和连板的函数:
# 计算股票处于一段时间内相对位置
def get_relative_position_df(stock_list, date, watch_days):
if len(stock_list) != 0:
df = get_price(stock_list, end_date=date, fields=['high', 'low', 'close'], count=watch_days, fill_paused=False, skip_paused=False, panel=False).dropna()
close = df.groupby('code').apply(lambda df: df.iloc[-1,-1])
high = df.groupby('code').apply(lambda df: df['high'].max())
low = df.groupby('code').apply(lambda df: df['low'].min())
result = pd.DataFrame()
result['rp'] = (close-low) / (high-low)
return result
else:
return pd.DataFrame(columns=['rp'])
最后更新: 2025-02-24 09:34
