在量化交易中,Scale指标是一项重要的工具,用于衡量当前K线的主动买入比例。它反映了市场中主动性交易的活跃程度,帮助识别买卖力量的强弱,并为一些策略提供参考依据。然而,目前市面上常见的量化交易平台并未提供直接的Scale指标计算函数,因为它需要逐笔数据支持,而K线数据并不包含主动买卖比例信息。因此,我们需要通过连续时间段内的成交数据来进行统计,从而实现Scale指标的计算。本文将在优宽量化平台进行手动实现。
在讲解Scale指标时候,我们需要了解两个概念:“主动性买盘"和"主动性卖盘”,在交易界面通常显示为内盘(主动性买盘)和外盘(主动性卖盘),它们帮助我们更好地理解市场的买卖动态和成交情况。
主动性买盘(Aggressive Buying): 主动性买盘指的是以市价成交的买单,即买家愿意以当前的市价快速买入资产而不是等待更低价位。主动性买盘通常意味着买家对资产的需求较为迫切,可能是出于预期价格上涨或者其他市场因素的考量。
主动性卖盘(Aggressive Selling): 主动性卖盘则是以市价成交的卖单,即卖家愿意以当前的市价快速卖出资产而不是等待更高价位。主动性卖盘表明卖家可能认为当前价格较为合适或者预期价格可能下跌,因此愿意以较低价格出售资产。
主动性买盘加上主动性卖盘就是整体的成交量。在计算Scale指标时,我们关注的是主动性买盘占据总体成交量的百分比,因为它们反映了市场中的买卖力量和交易行为。通过实时跟踪该指标,我们可以动态了解多方和空方力量悬殊对比,从而更好地理解市场的买卖情况,并据此进行交易策略的制定和执行。
获取Tick数据: 首先,我们需要获取最新的Tick数据,包括买一价、卖一价、最新价、成交量等信息。
判断是否进入新的交易日: Scale指标计算一般是以日级别为单位的,所以我们需要检查当前Tick的成交量是否小于之前的成交量,或者是否是第一个Tick数据。如果是,则说明可能进入了新的交易日,我们需要重新初始化指标相关的变量。
更新主动买入和卖出的成交量: 对于每一个Tick,我们需要根据Tick数据的变化来更新主动买入和卖出的成交量。一般来说,如果最新价等于卖一价,那么该Tick被认为是主动买入;反之,如果最新价小于卖一价(这里不设置为等于买一价,是因为考虑买一价和卖一价存在两跳以上的情况,所以最新价可能位于买一价和卖一价之间,这里归类为小于买一价),那么该Tick被认为是主动卖出。我们只考虑最新价大于等于卖一价或小于等于买一价的情况,因为这表示买卖价位上的主动性成交。
计算Scale指标的数值: Scale指标的数值表示在当前K线内主动买入成交量占总成交量的比例。因此,我们可以使用以下公式来计算Scale指标的数值:
[ \text{Scale} = \frac{\text{主动买入成交量}}{\text{主动买入成交量} + \text{主动卖出成交量}} ]
其中,主动买入成交量和主动卖出成交量是在当前K线内的成交量。为了防止分母为0,如果主动买入成交量和主动卖出成交量都为零,则Scale指标数值为零。
下面是通过Python代码实现上述逻辑的详细步骤:
import json
def main():
# 初始化结果表格
rTbl = {
"type": "table",
"title": "Scale指标",
"cols": ["Symbol", "Time", "买一价", "卖一价", "最新价", "主动性买盘", "主动性卖盘", "持仓量", "Scale数值"],
"rows": []
}
# 连接交易所
while not exchange.IO("status"):
Sleep(1000)
# 设置合约类型
_C(exchange.SetContractType, "hc2410")
scale = 0
buyVolume = 0
sellVolume = 0
preVolume = 0
preTime = 0
while True:
# 获取当前Tick数据
ticker = exchange.GetTicker()
if ticker.Time != preTime:
preTime = ticker.Time
# 判断是否更新交易日
if preVolume > ticker.Volume or preVolume == 0:
Log('更新交易日,指标重新计算#ff0000')
scale = 0
buyVolume = 0
sellVolume = 0
preVolume = ticker.Volume
else:
# 根据Tick数据计算主动买卖量
if ticker.Last == ticker.Sell:
buyVolume += ticker.Volume - preVolume
else:
sellVolume += ticker.Volume - preVolume
# 计算Scale指标
scale = buyVolume / (buyVolume + sellVolume) if (buyVolume + sellVolume) != 0 else 0
preVolume = ticker.Volume
# 将结果添加到结果表格中
rTbl["rows"].append([
"hc2410",
_D(ticker.Time/1000),
ticker.Buy,
ticker.Sell,
ticker.Last,
buyVolume,
sellVolume,
ticker.OpenInterest,
scale
])
# 保留最近10条记录用于展示
if len(rTbl["rows"]) > 10:
rows_to_display = rTbl["rows"][-10:]
else:
rows_to_display = rTbl["rows"]
# 更新结果表格并展示
rTbl = {
"type": "table",
"title": "Scale指标",
"cols": ["Symbol", "Time", "买一价", "卖一价", "最新价", "主动性买盘", "主动性卖盘", "持仓量", "Scale数值"],
"rows": rows_to_display
}
LogStatus('`' + json.dumps(rTbl) + '`')
我们输出图表看一下:
主动性买盘:第二行数据,当最新价等于卖一价,证明买盘强烈,所以主动性买盘数量增加; 主动性卖盘:第三行数据,当最新价小于卖一价,等于买一价,证明卖盘强烈,所以主动性卖盘数量增加。
使用实时的主动性买盘数量除以总体的交易量,可以获取实时的Scale指标,为交易者提供更全面的市场信息,帮助其进行交易决策。