零基础量化交易入门(一)18行代码完成一个网格策略

1,288 阅读5分钟

UniYM 科技

专业团队,公司资质可查询。

专业从事量化交易开发、Web 开发、微信小程序开发等; 团队精通 Golang 、H5 、Python 、Java 、Rust 、C#等设计语言与相关设计框架 。

免费咨询开发:技术客服

微信:uni_ym

商务合作: business@uniym.cn

小鸣最近被公司的宣传忙破了头,许多客户想定制量化交易策略却无从下手或者需求不明确,于是想给大家大概科普一下几种比较基础的量化策略。

今天给大家科普一下量化交易中相对最基础的一个策略:网格策略

一、什么是网格策略

网格策略内核思想就是一直保持一定价格间隔的低买高卖,在相对震荡的行情中网格策略的表现是非常不错的。

我们把价格离散化,比如在BTC现货行情波动的时候,每100美元价格区间画一条线,价格每向下100美元,我们买入一个BTC,每向上100美元我们卖出一个BTC,这样每次波动我们都能赚取100美元。

价格被每根线分成了一段段网格,这就是网格策略的核心思想。

二、网格策略主要参数

最基本的网格策略主要是网格区间间隔,也就是价格间隔买入数量

这里我们使用python作为伪代码实现一个基本的网格策略:

# 价格间隔 100美元
net_space = 100
# 买入BTC的数量
buy_amount = 1
# 策略运行BTC初始价格
init_price = get_price('BTC')
# 当前价格
price = init_price

func run_grid_strategy():
    
    # 仓位状态字典
    pos_pair = dict()

    # 无限循环
    while True:
        # 当前价格所在网格线
        line = (price - init_price) // net_price
        
        # 如果下面那根网格线持有仓位,则优先进行平仓操作
        if pos_pair.get(line-1) is not None:
            # 卖出一个BTC
            sell('BTC',buy_amount)
            
            # 仓位状态设置为空
            pos_pair[line-1] = None
            
        elif pos_pair.get(line) is None:
            # 如果当前网格线没有仓位,则进行开仓操作
            
            # 买入一个BTC
            buy('BTC',buy_amount)
            
            # 仓位状态设置为非空
            pos_pair[line] = buy_amount
        
        # 更新当前价格
        price = get_price()
        
        # 程序休息一秒
        time.sleep(1)
    
# 程序入口
if __name__ == '__main__':
    # 运行网格策略
    run_grid_strategy()

三、策略问题

这里不算注释和空行以及导入交易所api的话,我们总共使用了18行代码实现了一个极为基础的网格策略,网格策略的核心思想也在代码中体现了出来。

But,策略的最大弊端就是我们没法保证当前策略获取到的价格一定是交易所的最新价格,当价格剧烈波动时,我们没法保证当前计算出来的网格线所在价格一定是网格线的理论价格(有点拗口)。

这样说吧:比如BTC当前价格是20000美元,理论上我们的策略应在19900美元买入,20000美元卖出,假设策略实际获取到价格为19899美元,这时我们判断出准备执行买入操作,然而在执行前价格突然上涨到20000美元,于是我们被迫买入了20000美元的BTC,下一次轮询时判断出应执行卖出操作,在卖出之前价格猛跌到19900美元,虽然程序逻辑没有问题,但是这样我们就被迫亏损了100美元。

四、交易容错思想

  1. 持仓风险:如果价格猛烈上涨(下跌同理)超过两根网格线,当前策略只会卖出下面那根网格线持有的仓位,然而下面那根网格线没有仓位,我们没法卖出当前已有持仓,会不断增加我们的持仓风险,所以优化后的核心思想是:判断低于当前网格线的仓位是否存在来进行卖出

  2. 策略亏损:如果价格上下猛烈波动,就会出现上面说的策略亏损问题,我们可以通过使用websocket来响应式获取交易价格计算交易深度,预测交易成交价格设置立即成交或撤销订单等。

  3. 交易所api容错:策略所运行的服务器和交易所肯定是有延迟的,这个延迟有时候是致命的,有时候执行了买入或者卖出操作,实际上交易所并没有执行这个操作,或者交易超时了,又或者只买入成功了一部分,所以我们必须给交易进行容错处理,比如增加滑点买入后获取交易订单,订单成功了才算交易成功循环买入直到成功或者价格偏离过大

五、风险控制

我们完成了基本的策略,也大概思考了如何进行交易容错,容错是为了在策略框架下运行时不发生逻辑一外的错误,现在我们来思考策略逻辑中容易出现的问题。

1.单向行情风险:假如行情持续下跌,我们的仓位将越来越大,最终被死死套牢,假如价格持续上涨,我们持续卖出,可能就错失了上涨行情。这里一般的办法是划定网格策略的运行区间,比如BTC价格在15000美元-20000美元区间时我们的策略有效运行,超出这个区间,我们可以选择清仓或者继续持有。

2.策略开始运行的时机:如果是现货网格,我们应尽量在现货低位时运行网格,预期现货在低位震荡后也能上涨赚取利润。如果是做空的网格,则相反。

3.网格间隔:如果网格间隔过大,我们的策略可能一直不触发,甚至超出区间之后清仓亏损,网格间隔过小,会有一定的持仓头寸风险,所以我们可能需要一定的策略组合,许多投资者一般采用大网、中网、小网的策略组合:大网网格间距大,交易量大,交易次数少;中小网间距小,交易量小,交易次数多,这样可以覆盖多种行情。