商品期货量化交易

2024-09-04 08:45:49 浏览数 (2)

这里我们使用https://www.youquant.com/

  • 获取螺纹钢数据
代码语言:javascript复制
def main():
    exchange.SetContractType('rb888')
    Log(exchange.GetTicker())

运行结果

代码语言:javascript复制
{'Time': 1692975480000, 'Open': 3689.0, 'High': 3690.0, 'Low': 3688.0, 'Sell': 3690.0, 'Buy': 3688.0, 'Last': 3689.0, 'Volume': 193568.0, 'OpenInterest': 1228380.0}

结果中,Time为时间戳,Open为开盘价,High为最高价,Low为最低价,Sell为卖1价,Buy为买1价,Last为最新价,Volume为成交量,OpenInterest为成交额。

  • 获取订单深度
代码语言:javascript复制
def main():
    exchange.SetContractType('rb888')
    depth = exchange.GetDepth()
    # 获取买1价格,Bids为买1价列表,
    price = depth['Bids'][0]['Price']
    # 获取买1的数量
    amount = depth['Bids'][0]['Amount']
    Log(price, amount)

运行结果

代码语言:javascript复制
3688.0 1000.0

这里需要说明的是在实盘中,如果买1数量为0,那么则是跌停。

  • 获取历史K线数据
代码语言:javascript复制
def main():
    exchange.SetContractType('rb888')
    # 获取两分钟K线数据
    Log(exchange.GetRecords(60 * 2))
    # 获取十五分钟K线数据
    Log(exchange.GetRecords(PERIOD_M15))

运行结果

这里我们会发现,它没有买1和卖1价格。

  • 商品期货策略框架
代码语言:javascript复制
def main():
    if exchange.IO('status'): # 是否连接期货公司前置机
        exchange.SetContractType('rb888')
        ticker = exchange.GetTicker()
        depth = exchange.GetDepth()
        records = exchange.GetRecords()
        Log(ticker)
        Log(records)
        Log(records)
        # CTP为期货公司前置机,_D()当前时间戳
        LogStatus(_D(), '已连接CTP')
    else:
        LogStatus(_D(), '未连接CTP')
  • 订单交易
代码语言:javascript复制
def main():
    while True:
        if exchange.IO('status'): # 是否连接期货公司前置机
            futures = exchange.SetContractType('rb888')
            Log('订阅的合约详情', futures)
            ticker = exchange.GetTicker()
            # 交易方向,买入开多仓
            exchange.SetDirection('buy')
            # 以买1的价格买入1手
            id = exchange.Buy(ticker['Buy'], 1)
            Log('买入开多仓', id)
            break
        else:
            LogStatus(_D(), "未连接CTP")

运行结果

这里需要说明的是买入开多仓即做多,是指投资者预期期货合约价格未来会上涨,从而先买入合约建立多头头寸。

代码语言:javascript复制
def main():
    while True:
        if exchange.IO('status'): # 是否连接期货公司前置机
            futures = exchange.SetContractType('rb888')
            Log('订阅的合约详情', futures)
            ticker = exchange.GetTicker()
            # 交易方向,卖出开空仓
            exchange.SetDirection('sell')
            # 以买1价格卖出1手
            id1 = exchange.Sell(ticker['Buy'], 1)
            Log('卖出开空仓', id1)
            Log('当前持仓', exchange.GetPosition())
            Sleep(1000 * 60)
            ticker = exchange.GetTicker()
            # 交易方向,买入平空仓
            exchange.SetDirection('closesell')
            # 以卖1价格买入1手
            id2 = exchange.Buy(ticker['Sell'], 1)
            Log('买入平空仓', id2)
            Log('当前持仓', exchange.GetPosition())
            break
        else:
            LogStatus(_D(), "未连接CTP")

运行结果

这里需要说明的是卖出开空仓指投资者在没有持有相应期货合约的情况下,先卖出合约,期望在未来价格下跌时再买入合约进行平仓,从而获取利润。买入平空仓是指当你进行了卖出开空仓操作后,即预期期货合约价格会下跌而先卖出了合约。如果后续市场走势与你的预期不同,价格出现上涨或者你认为价格不会再继续下跌时,为了结束这笔空头交易,就需要进行买入平空仓操作。每个期货合约都有具体的到期日。在到期日之前,你可以根据自己的判断随时进行买入平空仓操作。但如果临近到期日仍未平仓,交易所可能会根据规定采取强制平仓等措施。

当然我们也可以取消持仓订单

代码语言:javascript复制
def main():
    while True:
        if exchange.IO('status'): # 是否连接期货公司前置机
            futures = exchange.SetContractType('rb888')
            Log('订阅的合约详情', futures)
            ticker = exchange.GetTicker()
            # 交易方向,卖出开空仓
            exchange.SetDirection('sell')
            # 以卖1 10的价格卖出1手
            id = exchange.Sell(ticker['Sell']   10, 1)
            # 获取订单详情
            Log(exchange.GetOrder(id))
            # 取消订单
            exchange.CancelOrder(id)
            Log(exchange.GetOrder(id))
            break
        else:
            LogStatus(_D(), "未连接CTP")

运行结果

这里打印的两个订单详情,第一个的状态为订单未完成,第二个的状态为订单已撤销。

  • 获取账户和持仓信息
代码语言:javascript复制
def main():
    while True:
        if exchange.IO('status'): # 是否连接期货公司前置机
            futures = exchange.SetContractType('rb888')
            Log('订阅的合约详情', futures)
            # 获取账户信息
            account = exchange.GetAccount()
            Log("挂单前")
            Log("账户可用资金", account['Balance'])
            Log("账户冻结资金", account['FrozenBalance'])
            ticker = exchange.GetTicker()
            # 交易方向,买入开多仓
            exchange.SetDirection('buy')
            # 以买1-5的价格买入1手
            id = exchange.Buy(ticker['Buy'] - 5, 1)
            account = exchange.GetAccount()
            Log("挂单后")
            Log("账户可用资金", account['Balance'])
            Log("账户冻结资金", account['FrozenBalance'])
            break
        else:
            LogStatus(_D(), "未连接CTP")

运行结果

这里需要说明的是由于我们挂单的价格为买1-5的价格,所以是没有成交的。

代码语言:javascript复制
def main():
    codes = ['rb888', 'i888', 'MA888'] # 螺纹钢主力合约,铁矿石主力合约,甲醇主力合约
    while True:
        if exchange.IO('status'): # 是否连接期货公司前置机
            for code in codes:
                futures = exchange.SetContractType(code)
                Log('订阅的合约详情', futures)
                ticker = exchange.GetTicker()
                # 交易方向,卖出开空仓
                exchange.SetDirection('sell')
                # 以买1-10的价格卖出1手
                id = exchange.Sell(ticker['Buy'] - 10, 1, '合约:', code, '->', futures['InstrumentID'])
            orders = exchange.GetOrders()
            Log('订单长度', len(orders), '所有未完成订单:', orders)
            # 获取所有持仓
            pos = exchange.GetPosition()
            for p in pos:
                Log(p)
            break
        else:
            LogStatus(_D(), "未连接CTP")

运行结果

由于我们以买1还低10块挂单,所以很快就成交了,所有的订单都转化成了持仓。这里我们可以看到合约: rb888 -> rb2410,这是由螺纹钢主力合约映射的螺纹钢2410合约。

0 人点赞