import numpy as np
import pandas as pd
from datetime import datetime, timedelta
from jqdata import *
def initialize(context):
set_benchmark('000300.XSHG')
set_option('use_real_price', True)
log.set_level('order', 'error')
g.today = datetime.now().date()
g.bought_stocks = set()
g.stock_count = 0
def before_trading_start(context):
g.all_stocks = get_all_securities(types=['stock'], date=g.today).index
# 剔除 ST、退市、停牌、科创板股票
g.all_stocks = [stock for stock in g.all_stocks if not is_st_stock(stock) and not is_suspended(stock) and 'KCB' not in stock and 'STAR' not in stock]
# 剔除近 20 日有过涨停和跌停的股票
g.all_stocks = [stock for stock in g.all_stocks if not has_limit_up_down(stock, 20)]
def handle_data(context, data):
for stock in g.all_stocks:
if stock not in g.bought_stocks and g.stock_count < 20:
close_price = data.current(stock, 'close')
ma5 = data.current(stock, 'ma5')
if close_price > ma5:
order_value(stock, 10000)
g.bought_stocks.add(stock)
g.stock_count += 1
# 判断持股是否满 5 个交易日并在收盘前一分钟卖出
for stock in list(g.bought_stocks):
holding_days = (datetime.now().date() - context.portfolio.positions[stock].last_price_date.date()).days
if holding_days >= 5:
order_target(stock, 0)
g.bought_stocks.remove(stock)
g.stock_count -= 1
# 判断股票在过去 n 天内是否有过涨停或跌停
def has_limit_up_down(stock, days):
end_date = datetime.now().date()
start_date = end_date - timedelta(days=days)
df = get_price(stock, start_date=start_date, end_date=end_date, frequency='daily')
for _, row in df.iterrows():
if row['high'] / row['close'] >= 1.095 or row['low'] / row['close'] < = 0.905:
return True
return False
2024-09-20