Pharos
TAMath ops

SUM - 求和

TA.SUM() - 指定周期内的累加和

返回数学运算目录


语法

python
result = TA.SUM(records, period)

参数

参数类型说明
recordsarrayK线数据数组
periodint周期长度

返回值

返回一个数组,每个元素是对应周期内的收盘价之和。

计算方法

plaintext
SUM[i] = Σ(Close[i-period+1] to Close[i])

对指定周期内的所有值求和。

使用场景

  1. 成交量统计:计算一段时间的总成交量
  2. 累计涨跌:计算总涨跌幅
  3. 移动平均辅助:MA = SUM / period

基础示例

python
def onTick():
    exchange.SetContractType("swap")
    records = exchange.GetRecords()
    
    if len(records) < 30:
        return
    
    # 计算20日收盘价总和
    sum_20 = TA.SUM(records, 20)
    
    # 手动计算均线
    ma_20 = sum_20[-1] / 20
    
    Log("20日收盘价总和:", sum_20[-1])
    Log("20日均价:", ma_20)

高级应用

1. 累计成交量

python
def onTick():
    records = exchange.GetRecords()
    
    # 构造成交量数组
    volume_records = [{'Close': r.Volume} for r in records]
    
    # 20日累计成交量
    volume_sum = TA.SUM(volume_records, 20)
    
    current_volume = records[-1].Volume
    
    # 当前成交量占比
    volume_ratio = current_volume / volume_sum[-1]
    
    Log(f"当前成交量占20日总量: {volume_ratio*100:.2f}%")
    
    if volume_ratio > 0.1:  # 单日成交量超过20日总量的10%
        Log("异常放量!")

2. 累计涨跌幅

python
def onTick():
    records = exchange.GetRecords()
    
    # 计算每日涨跌幅
    returns = []
    for i in range(1, len(records)):
        ret = (records[i].Close - records[i-1].Close) / records[i-1].Close
        returns.append(ret)
    
    # 构造涨跌幅数组
    return_records = [{'Close': r} for r in returns]
    
    # 20日累计涨跌幅
    if len(return_records) >= 20:
        cumulative_return = TA.SUM(return_records, 20)
        
        Log(f"20日累计涨跌: {cumulative_return[-1]*100:.2f}%")
        
        # 累计跌幅过大,超跌反弹
        if cumulative_return[-1] < -0.2:  # 跌超20%
            Log("超跌,寻找反弹机会")
            
            rsi = TA.RSI(records, 14)
            if rsi[-1] < 30:
                exchange.SetDirection("buy")
                exchange.Buy(-1, 1)

3. 资金流向

python
def onTick():
    records = exchange.GetRecords()
    
    # 计算资金流向(简化版OBV)
    money_flow = []
    
    for i in range(1, len(records)):
        if records[i].Close > records[i-1].Close:
            # 上涨日,资金流入
            money_flow.append(records[i].Volume)
        else:
            # 下跌日,资金流出
            money_flow.append(-records[i].Volume)
    
    mf_records = [{'Close': mf} for mf in money_flow]
    
    # 20日累计资金流
    if len(mf_records) >= 20:
        net_flow = TA.SUM(mf_records, 20)
        
        Log("20日净资金流:", net_flow[-1])
        
        if net_flow[-1] > 0:
            Log("资金持续流入")
        else:
            Log("资金持续流出")

4. 波动率累计

python
def onTick():
    records = exchange.GetRecords()
    
    # 计算每日波动幅度
    volatility = []
    for r in records:
        daily_range = (r.High - r.Low) / r.Close
        volatility.append(daily_range)
    
    vol_records = [{'Close': v} for v in volatility]
    
    # 20日累计波动
    if len(vol_records) >= 20:
        total_volatility = TA.SUM(vol_records, 20)
        avg_volatility = total_volatility[-1] / 20
        
        Log(f"20日平均波动: {avg_volatility*100:.2f}%")
        
        current_vol = volatility[-1]
        
        if current_vol > avg_volatility * 2:
            Log("今日波动异常放大")

5. 均线斜率

python
def onTick():
    records = exchange.GetRecords()
    
    ma20 = TA.MA(records, 20)
    
    # 计算均线变化
    ma_changes = []
    for i in range(1, len(ma20)):
        change = ma20[i] - ma20[i-1]
        ma_changes.append(change)
    
    ma_change_records = [{'Close': c} for c in ma_changes]
    
    # 10日均线变化总和(斜率)
    if len(ma_change_records) >= 10:
        ma_slope = TA.SUM(ma_change_records, 10)
        
        if ma_slope[-1] > 0:
            Log("均线持续上行,趋势向上")
        else:
            Log("均线持续下行,趋势向下")

注意事项

  1. 前期数据:前period-1个数据点无法计算完整周期
  2. 数据类型:确保records格式正确
  3. 大数累加:注意数值溢出问题

相关函数

  • MA - 移动平均(SUM/period)
  • MAX - 最大值
  • MIN - 最小值

返回数学运算目录 | 返回TA指标