需要帮助?

试试AI小助手吧

Deepseek写网格交易策略,能用,测试513050ETF

用户头像韭菜来割
2025-02-08 发布

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 # 更新基准价为当前价格

收益&风险
源码

评论

用户头像
2025-02-10 17:52:54

history_data = history_bars(context.security, context.history_window, '1d',** ['close']**)# 脚本要修改一下,否则执行报错。

测试成效怎么很低:

37a8b53899006488c6a88897d333a06e.png

如果调整交易参数,能提高效率吗?

评论
用户头像
2025-02-11 17:48:50

history_data = history_bars(context.security, context.history_window, '1d',** ['close']**)# 脚本要修改一下,否则执行报错。

测试成效怎么很低:

37a8b53899006488c6a88897d333a06e.png

如果调整交易参数,能提高效率吗?

评论