import numpy as np
def init(context):
设置基准收益:沪深300指数
set_benchmark('000300.SH')
log.info('策略开始运行,初始化函数全局只运行一次')
设置股票类交易手续费
set_commission(PerShare(type='stock', cost=0.0003, min_trade_cost=5.0))
设置股票交易滑点
set_slippage(PriceSlippage(0.005))
设置要操作的股票
context.security = '513050.SH'
设置买入和卖出的股数
context.buy_quantity = 30000 # 下跌时买入30000股
context.sell_quantity = 15000 # 上涨时卖出15000股
设置最大仓位比例
context.max_position_ratio = 0.9
设置初始持仓标志
context.initialized = False
设置历史数据窗口长度(用于计算波动率)
context.history_window = 20 # 使用过去20天的数据计算波动率
初始化网格间距
context.grid_size = 0.03 # 默认网格间距为3%
def handle_bar(context, bar_dict):
获取当前时间
time = get_datetime().strftime('%Y-%m-%d %H:%M:%S')
log.info('{} 盘中运行'.format(time))
初始化持仓:买入20000股,并以建仓当日的开盘价为基准价
if not context.initialized:
current_price = bar_dict[context.security].open # 以开盘价为基准价
available_cash = context.portfolio.cash
if available_cash >= current_price * 20000: # 初始化建仓调整为20000股
order(context.security, 20000)
log.info('初始化持仓,买入20000股,开盘价:{}'.format(current_price))
context.base_price = current_price # 设置基准价为建仓当日的开盘价
context.initialized = True
else:
log.info('资金不足,无法初始化持仓')
return
获取历史价格数据,计算波动率
history_data = history_bars(context.security, context.history_window, '1d', ['close'])
if len(history_data) >= context.history_window:
close_prices = np.array([bar['close'] for bar in history_data]) # 提取收盘价
returns = np.diff(close_prices) / close_prices[:-1] # 计算每日收益率
volatility = np.std(returns) # 计算波动率(标准差)
动态调整网格间距
if volatility < 0.03: # 波动率低于3%,网格间距固定为3%
context.grid_size = 0.03
elif volatility > 0.05: # 波动率高于5%,网格间距固定为5%
context.grid_size = 0.05
else: # 波动率在3%到5%之间,网格间距等于波动率
context.grid_size = volatility
log.info('当前波动率:{:.4f},动态网格间距:{:.4f}'.format(volatility, context.grid_size))
获取当前价格
current_price = bar_dict[context.security].close
计算网格的上下限
upper_bound = context.base_price * (1 + context.grid_size)
lower_bound = context.base_price * (1 - context.grid_size)
卖出逻辑
if current_price >= upper_bound:
position = context.portfolio.positions[context.security].quantity
如果持仓低于5000股,停止卖出
if position <= 5000:
log.info('持仓低于5000股,停止卖出')
return
sell_quantity = min(position - 5000, context.sell_quantity) # 确保卖出后不低于5000股
if sell_quantity > 0:
order(context.security, -sell_quantity)
log.info('卖出{}股,价格:{}'.format(sell_quantity, current_price))
context.base_price = current_price # 更新基准价为当前价格
买入逻辑
elif current_price <= lower_bound:
available_cash = context.portfolio.cash
max_buy_quantity = int(available_cash / current_price)
buy_quantity = min(max_buy_quantity, context.buy_quantity) # 确保买入数量不超过每次买入的股数
if buy_quantity > 0:
order(context.security, buy_quantity)
log.info('买入{}股,价格:{}'.format(buy_quantity, current_price))
context.base_price = current_price # 更新基准价为当前价格