新手,请问这个怎么改,谢谢


(bennychen613) #1

找了一个代码策略练手,发现每次回测后都是持有同样的股票,我想改成全仓持股1只,然后隔天后卖出,真实价格。有哪位高手帮忙改一下。

# 函数:求满足平仓条件的股票列表
def close_pos_con(df):
    return list(df[df['close']<df['ma_5']].instrument)
# 初始化虚拟账户状态,只在第一个交易日运行
def initialize(context):
    # 设置手续费,买入时万3,卖出是千分之1.3,不足5元以5元计
    context.set_commission(PerOrder(buy_cost=0.0003, sell_cost=0.0013, min_cost=5))
    context.num_stock = 1 # 最多同时持有100只股票
    
# 策略交易逻辑,每个交易日运行一次
def handle_data(context, data):
    date = data.current_dt.strftime('%Y-%m-%d')  # 日期
    buy_stock = context.daily_stock_to_buy[date]  # 当日符合买入条件的股票
    sell_stock = context.daily_stock_to_sell[date]  # 当日符合卖出条件的股票
    weight = 1/context.num_stock   # 等权重配置
    stock_hold_num = len(context.portfolio.positions)  # 目前持有的股票数量
    remain_num = context.num_stock - stock_hold_num   # 还可以买入的股票数量,需要把卖出的股票加回来
    # 初始化当日买入订单的数量为0 
    order_count = 0
    # 买入股票
    for i in buy_stock:
        # 如果发送买入订单的股票数量已经超过了还可以买入的股票数量,那么应退出for循环
        if order_count >= remain_num:
            break
        # 对于没有买入的股票且可以交易的股票,应买入
        if context.portfolio.positions[context.symbol(i)].amount == 0 and data.can_trade(context.symbol(i)):
            order_target_percent(context.symbol(i), weight)
            order_count += 1  # 统计一下当天股票买入数量
    # 卖出股票
    for j in sell_stock:
        if context.portfolio.positions[context.symbol(j)].amount > 0 and data.can_trade(context.symbol(j)):
            order_target_percent(context.symbol(j), 0)
# 策略回测接口: https://bigquant.com/docs/strategy_backtest.html
m = M.trade.v3(
    instruments=D.instruments(market='CN_STOCK_A'),
    start_date='2018-07-01',
    end_date='2020-01-07',
    prepare=prepare, # 数据准备函数
    initialize=initialize, # 初始化函数
    handle_data=handle_data, # 策略主体函数
    # 买入订单以开盘价成交
    order_price_field_buy='open',
    # 卖出订单以开盘价成交
    order_price_field_sell='close',
    capital_base=100000,
    benchmark='000300.INDX',
)

(iQuant) #2

可以参考一下学院教程帖,持股数量,卖出时间及价格设定都有包含,同时,建议使用最新版可视化模块进行策略编写:https://bigquant.com/tutorial/