首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在数值约束范围内计算报价量(用于金融工具)

在数值约束范围内计算报价量(用于金融工具)
EN

Code Review用户
提问于 2020-03-16 14:33:56
回答 1查看 49关注 0票数 5

下面的功能是交易系统的一部分。它的目的是根据position_size参数的值,为出价(购买)报价和询问(出售)报价分配数量(订单大小)。

这个交易系统在任何一个方向上都不能超过100的仓位限制,因此我们的订单数量与current position的绝对值相结合时,不应超过100。

然而,有一个警告。偶尔,由于无法控制的外部原因,一个出价或要求(买卖订单)将执行两次,然后它的价格可以重新调整。

因此,这个函数返回的任何bid_volumeask_volume最多只需要100 - position_size值的一半,以便解释偶尔的双重执行。

这就是为什么在任何一步如果-否则块以下,加倍的ask_volumebid_volumecurrent_position将不会超过100。

除了下面的代码之外,用Python实现这一目标的最快方法是什么?

代码语言:javascript
运行
复制
def adjust_volume(position_size):

    # Long.
    if position_size > 0:

        if position_size < 45:
            bid_volume = 45 - position_size
            ask_volume = 50

        elif position_size >= 45 and position_size < 65:
            bid_volume = 65 - position_size
            ask_volume = 50

        elif position_size >= 65 and position_size < 82:
            bid_volume = 82 - position_size
            ask_volume = 50

        elif position_size >= 82 and position_size < 100:
            bid_volume = 91 - position_size
            ask_volume = 85

    # Short.
    elif position_size < 0:

        abs_position_size = abs(position_size)

        if position_size > -45:
            bid_volume = 10
            ask_volume = 45 - abs_position_size

        elif position_size <= -45 and position_size > -65:
            bid_volume = 50
            ask_volume = 65 - abs_position_size

        elif position_size <= -65 and position_size > -82:
            bid_volume = 50
            ask_volume = 82 - abs_position_size

        elif position_size <= -82 and position_size > -100:
            bid_volume = 75
            ask_volume = 85 - abs_position_size

        elif position_size == 0:

            bid_volume = 30
            ask_volume = 30

    return position_size, bid_volume, ask_volume


position_size, bid_volume, ask_volume = adjust_volume(-76)

print("bid_volume:", bid_volume)
print("ask_volume:", ask_volume)
EN

回答 1

Code Review用户

回答已采纳

发布于 2020-03-16 17:42:39

Bug

adjust_volume(0)目前的成果是:

UnboundLocalError:赋值前引用的局部变量“bid_volume”

由于if position_size == 0:当前在elif position_size < 0:语句中缩进,因此无法访问。(这可能是将代码复制到问题帖子时格式错误的结果。)

可能的Bug

一些体积计算结果为负体积。(adjust_volume(99)bid_volume == -8adjust_volume(-99)ask_volume == -14,这看起来是无效的结果。)

可能的Bug

如果adjust_volume()被赋予一个参数>= 100或<= -100,那么它在UnboundLocalError中也会失败。应该检查限制并提高一个ValueError

这个交易系统在任何一个方向上都不能超过100的仓位限制,因此我们的订单数量与current position的绝对值相结合时,不应超过100。

100不超过100,所以原来的实现可能也应该允许+100-100。但这些目前导致了UnboundLocalError

链式比较

我不得不说,这种情况使我的大脑受伤:

代码语言:javascript
运行
复制
    elif position_size <= -65 and position_size > -82:

我花了几分钟才解开距离,我不得不三次检查是否正确。将更清楚地表示为:

代码语言:javascript
运行
复制
    elif -82 < position_size and position_size <= -65:

或者使用链接比较操作:

代码语言:javascript
运行
复制
    elif -82 < position_size <= -65:

等分

你有9个范围:

  • -100 < position_size <= -82
  • -82 < position_size <= -65
  • -65 < position_size <= -45
  • -45 < position_size <0
  • 0 <= position_size <= 0
  • 0< position_size < 45
  • 45 <= position_size < 65
  • 65 <= position_size < 82
  • 82 <= position_size < 100

与使用一棵if-elif-else语句树来定位正确的范围不同,您可以通过bisect列表-81, -64, -44, 0, 1, 45, 65, 82来确定正确的范围桶。

注:当position_size从负值到正值时,负桶限增加了1,以说明是否包括下限或上限的差异。

代码语言:javascript
运行
复制
from bisect import bisect

POSITION = (-81, -64, -44, 0, 1, 45, 65, 82,)
BID_ASK = (
    (75, 85), # -100 < pos <= -82
    (50, 82), # -82 < pos <= -65
    (50, 65), # -65 < pos <= -45
    (10, 45), # -45 < pos < 0
    (30, 30), # 0 <= pos <= 0
    (45, 50), # 0 < pos < 45
    (65, 50), # 45 <= pos < 65
    (82, 50), # 65 <= pos < 82
    (91, 85), # 82 <= pos < 100
)

def adjust_volume(position_size):

    if not(-100 < position_size < 100):
        raise ValueError("position size out of range")

    bucket = bisect(POSITION, position_size)

    bid_volume, ask_volume = BID_ASK[bucket]
    if position >= 0:
        bid_volume -= position_size
    else:
        ask_volume -= abs(position_size)

    return position_size, bid_volume, ask_volume
票数 5
EN
页面原文内容由Code Review提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://codereview.stackexchange.com/questions/238998

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档