tqsdk.tafunc - 序列计算函数

Functions

abs(series)

获取series的绝对值

avedev(series, n)

平均绝对偏差: 求series在n周期内的平均绝对偏差

barlast(cond)

最近一次条件 cond 成立到当前的周期数

count(cond, n)

统计n周期中满足cond条件的个数

crossdown(a, b)

向下穿越: 表示当a从上方向下穿b,成立返回1, 否则返回0

crossup(a, b)

向上穿越: 表当a从下方向上穿过b, 成立返回1, 否则返回0

ema(series, n)

指数加权移动平均线: 求series序列n周期的指数加权移动平均

ema2(series, n)

线性加权移动平均: 求series值的n周期线性加权移动平均 (也称WMA)

every(cond, n)

判断n个周期内, 是否一直满足cond条件, 若满足则值为1, 不满足为0

exist(cond, n)

判断n个周期内, 是否有满足cond的条件, 若满足则值为1, 不满足为0

harmean(series, n)

调和平均值: 求series在n个周期内的调和平均值

hhv(series, n)

求series在n个周期内的最高值

llv(series, n)

求在n个周期内的最小值

ma(series, n)

简单移动平均线: 求series序列n周期的简单移动平均

max(series1, series2)

获取series1和series2中的最大值

median(series, n)

中位数: 求series在n个周期内居于中间的数值

min(series1, series2)

获取series1和series2中的最小值

numpow(series, n, m)

自然数幂方和

ref(series, n)

简单移动: 求series序列位移n个周期的结果

sma(series, n, m)

扩展指数加权移动平均: 求series序列n周期的扩展指数加权移动平均

std(series, n)

标准差: 求series序列每n个周期的标准差

time_to_datetime(input_time)

将传入的时间转换为 datetime.datetime 类型

time_to_ns_timestamp(input_time)

将传入的时间转换为int类型的纳秒级时间戳

time_to_s_timestamp(input_time)

将传入的时间转换为int类型的秒级时间戳

time_to_str(input_time)

将传入的时间转换为 %Y-%m-%d %H:%M:%S.%f 格式的 str 类型

trma(series, n)

三角移动平均: 求series的n周期三角移动平均值

tqsdk.tafunc.ref(series, n)

简单移动: 求series序列位移n个周期的结果

注意: 当n为0, 函数返回原序列; 当n为有效值但当前的series序列元素个数不足 n + 1 个, 函数返回 NaN 序列

Args:

series (pandas.Series): 数据序列

n (int): 位移周期

Returns:

pandas.Series: 位移后的序列

Example:

from tqsdk import TqApi, TqSim, tafunc

api = TqApi(TqSim())
klines = api.get_kline_serial("CFFEX.IF1908", 24 * 60 * 60)
pre_close = tafunc.ref(klines.close, 1)  # 将收盘价序列右移一位, 得到昨收盘序列
change = klines.close - pre_close        # 收盘价序列 - 昨收盘序列, 得到涨跌序列
print(list(change))
tqsdk.tafunc.std(series, n)

标准差: 求series序列每n个周期的标准差

注意: n为0的情况下, 或当n为有效值但当前的series序列元素个数不足n个, 函数返回 NaN 序列

Args:

series (pandas.Series): 数据序列

n (int): 标准差的周期

Returns:

pandas.Series: 标准差序列

Example:

from tqsdk import TqApi, TqSim, tafunc

api = TqApi(TqSim())
klines = api.get_kline_serial("CFFEX.IF1908", 24 * 60 * 60)
std = tafunc.std(klines.close, 5)  # 收盘价序列每5项计算一个标准差
print(list(std))
tqsdk.tafunc.ma(series, n)

简单移动平均线: 求series序列n周期的简单移动平均

计算公式: ma(x, 5) = (x(1) + x(2) + x(3) + x(4) + x(5)) / 5

注意: 1. 简单移动平均线将设定周期内的值取平均值, 其中各元素的权重都相等 2. n为0的情况下, 或当n为有效值但当前的series序列元素个数不足n个, 函数返回 NaN 序列

Args:

series (pandas.Series): 数据序列

n (int): 周期

Returns:

pandas.Series: 简单移动平均值序列

Example:

from tqsdk import TqApi, TqSim, tafunc

api = TqApi(TqSim())
klines = api.get_kline_serial("CFFEX.IF1908", 24 * 60 * 60)
ma = tafunc.ma(klines.close, 5)
print(list(ma))
tqsdk.tafunc.sma(series, n, m)

扩展指数加权移动平均: 求series序列n周期的扩展指数加权移动平均

计算公式: sma(x, n, m) = sma(x, n, m).shift(1) * (n - m) / n + x(n) * m / n

注意: n必须大于m

Args:

series (pandas.Series): 数据序列

n (int): 周期

m (int): 权重

Returns:

pandas.Series: 扩展指数加权移动平均序列

Example:

from tqsdk import TqApi, TqSim, tafunc

api = TqApi(TqSim())
klines = api.get_kline_serial("CFFEX.IF1908", 24 * 60 * 60)
sma = tafunc.sma(klines.close, 5, 2)  # 收盘价序列每5项计算一个扩展指数加权移动平均值
print(list(sma))
tqsdk.tafunc.ema(series, n)

指数加权移动平均线: 求series序列n周期的指数加权移动平均

计算公式:

ema(x, n) = 2 * x / (n + 1) + (n - 1) * ema(x, n).shift(1) / (n + 1)

注意:
  1. n 需大于等于1

  2. 对距离当前较近的k线赋予了较大的权重

Args:

series (pandas.Series): 数据序列

n (int): 周期

Returns:

pandas.Series: 指数加权移动平均线序列

Example:

from tqsdk import TqApi, TqSim, tafunc

api = TqApi(TqSim())
klines = api.get_kline_serial("CFFEX.IF1908", 24 * 60 * 60)
ema = tafunc.ema(klines.close, 5)
print(list(ema))
tqsdk.tafunc.ema2(series, n)

线性加权移动平均: 求series值的n周期线性加权移动平均 (也称WMA)

计算公式:

ema2(x, n) = [n * x(0) + (n - 1) * x(1) + (x - 2) * x(2) + ... + 1 * x(n - 1)] / [n + (n - 1) + (n - 2) + ... + 1]

注意: 当n为有效值但当前的series序列元素个数不足n个, 函数返回 NaN 序列

Args:

series (pandas.Series): 数据序列

n (int): 周期

Returns:

pandas.Series: 线性加权移动平均线序列

Example:

from tqsdk import TqApi, TqSim, tafunc

api = TqApi(TqSim())
klines = api.get_kline_serial("CFFEX.IF1908", 24 * 60 * 60)
ema2 = tafunc.ema2(klines.close, 5)  # 求收盘价在5个周期的线性加权移动平均值
print(list(ema2))
tqsdk.tafunc.crossup(a, b)

向上穿越: 表当a从下方向上穿过b, 成立返回1, 否则返回0

Args:

a (pandas.Series): 数据序列1

b (pandas.Series): 数据序列2

Returns:

pandas.Series: 上穿标志序列

Example:

from tqsdk import TqApi, TqSim, tafunc

api = TqApi(TqSim())
klines = api.get_kline_serial("CFFEX.IF1908", 24 * 60 * 60)
crossup = tafunc.crossup(tafunc.ma(klines.close, 5), tafunc.ma(klines.close, 10))
print(list(crossup))
tqsdk.tafunc.crossdown(a, b)

向下穿越: 表示当a从上方向下穿b,成立返回1, 否则返回0

Args:

a (pandas.Series): 数据序列1

b (pandas.Series): 数据序列2

Returns:

pandas.Series: 下穿标志序列

Example:

from tqsdk import TqApi, TqSim, tafunc

api = TqApi(TqSim())
klines = api.get_kline_serial("CFFEX.IF1908", 24 * 60 * 60)
crossdown = tafunc.crossdown(tafunc.ma(klines.close, 5), tafunc.ma(klines.close, 10))
print(list(crossdown))
tqsdk.tafunc.count(cond, n)

统计n周期中满足cond条件的个数

注意: 如果n为0, 则从第一个有效值开始统计

Args:

cond (array_like): 条件

n (int): 周期

Returns:

pandas.Series: 统计值序列

Example:

from tqsdk import TqApi, TqSim, tafunc

api = TqApi(TqSim())
klines = api.get_kline_serial("CFFEX.IF1908", 24 * 60 * 60)
# 统计从申请到的行情数据以来到当前这段时间内, 5周期均线上穿10周期均线的次数:
count = tafunc.count(tafunc.crossup(tafunc.ma(klines.close, 5), tafunc.ma(klines.close, 10)), 0)
print(list(count))
tqsdk.tafunc.trma(series, n)

三角移动平均: 求series的n周期三角移动平均值

计算方法:

三角移动平均线公式, 是采用算数移动平均, 并且对第一个移动平均线再一次应用算数移动平均

注意: n为0的情况下, 或当n为有效值但当前的series序列元素个数不足n个, 函数返回 NaN 序列

Args:

series (pandas.Series): 数据序列

n (int): 周期

Returns:

pandas.Series: 三角移动平均值序列

Example:

from tqsdk import TqApi, TqSim, tafunc

api = TqApi(TqSim())
klines = api.get_kline_serial("CFFEX.IF1908", 24 * 60 * 60)
trma = tafunc.trma(klines.close, 10)
print(list(trma))
tqsdk.tafunc.harmean(series, n)

调和平均值: 求series在n个周期内的调和平均值

计算方法:

harmean(x, 5) = 1 / [(1 / x(1) + 1 / x(2) + 1 / x(3) + 1 / x(4) + 1 / x(5)) / 5]

注意: 1. 调和平均值与倒数的简单平均值互为倒数 2. 当n为0, 或当n为有效值但当前的series序列元素个数不足n个, 函数返回 NaN 序列

Args:

series (pandas.Series): 数据序列

n (int): 周期

Returns:

pandas.Series: 调和平均值序列

Example:

from tqsdk import TqApi, TqSim, tafunc

api = TqApi(TqSim())
klines = api.get_kline_serial("CFFEX.IF1908", 24 * 60 * 60)
harmean = tafunc.harmean(klines.close, 5)  # 求5周期收盘价的调和平均值
print(list(harmean))
tqsdk.tafunc.numpow(series, n, m)

自然数幂方和

计算方法:

numpow(x, n, m) = n ^ m * x + (n - 1) ^ m * x.shift(1) + (n - 2) ^ m * x.shift(2) + ... + 2 ^ m * x.shift(n - 2) + 1 ^ m * x.shift(n - 1)

注意: 当n为有效值但当前的series序列元素个数不足n个, 函数返回 NaN 序列

Args:

series (pandas.Series): 数据序列

n (int): 自然数

m (int): 实数

Returns:

pandas.Series: 幂方和序列

Example:

from tqsdk import TqApi, TqSim, tafunc

api = TqApi(TqSim())
klines = api.get_kline_serial("CFFEX.IF1908", 24 * 60 * 60)
numpow = tafunc.numpow(klines.close, 5, 2)
print(list(numpow))
tqsdk.tafunc.abs(series)

获取series的绝对值

注意: 正数的绝对值是它本身, 负数的绝对值是它的相反数, 0的绝对值还是0

Args:

series (pandas.Series): 数据序列

Returns:

pandas.Series: 绝对值序列

Example:

from tqsdk import TqApi, TqSim, tafunc

api = TqApi(TqSim())
klines = api.get_kline_serial("CFFEX.IF1908", 24 * 60 * 60)
abs = tafunc.abs(klines.close)
print(list(abs))
tqsdk.tafunc.min(series1, series2)

获取series1和series2中的最小值

Args:

series1 (pandas.Series): 数据序列1

series2 (pandas.Series): 数据序列2

Returns:

pandas.Series: 最小值序列

Example:

from tqsdk import TqApi, TqSim, tafunc

api = TqApi(TqSim())
klines = api.get_kline_serial("CFFEX.IF1908", 24 * 60 * 60)
min = tafunc.min(klines.close, klines.open)
print(list(min))
tqsdk.tafunc.max(series1, series2)

获取series1和series2中的最大值

Args:

series1 (pandas.Series): 数据序列1

series2 (pandas.Series): 数据序列2

Returns:

pandas.Series: 最大值序列

Example:

from tqsdk import TqApi, TqSim, tafunc

api = TqApi(TqSim())
klines = api.get_kline_serial("CFFEX.IF1908", 24 * 60 * 60)
max = tafunc.max(klines.close, klines.open)
print(list(max))
tqsdk.tafunc.median(series, n)

中位数: 求series在n个周期内居于中间的数值

注意:
  1. 当n为有效值但当前的series序列元素个数不足n个, 函数返回 NaN 序列

  2. 对n个周期内所有series排序后, 若n为奇数, 则选择第(n + 1) / 2个为中位数, 若n为偶数, 则中位数是(n / 2)以及(n / 2 + 1)的平均数

Args:

series (pandas.Series): 数据序列

n (int): 周期

Returns:

pandas.Series: 中位数序列

Example:

例1:
    # 假设最近3日的收盘价为2727, 2754, 2748, 那么当前 median(df["close"], 3) 的返回值是2748
    median3 = tafunc.median(df["close"], 3)

例2:
    # 假设最近4日的开盘价为2752, 2743, 2730, 2728, 那么当前 median(df["open"], 4) 的返回值是2736.5
    median4 = tafunc.median(df["open"], 4)
tqsdk.tafunc.exist(cond, n)

判断n个周期内, 是否有满足cond的条件, 若满足则值为1, 不满足为0

Args:

cond (array_like): 条件

n (int): 周期

Returns:

pandas.Series: 判断结果序列

Example:

from tqsdk import TqApi, TqSim, tafunc

api = TqApi(TqSim())
klines = api.get_kline_serial("CFFEX.IF1908", 24 * 60 * 60)
# 判断4个周期中是否存在收盘价大于前一个周期的最高价, 存在返回1, 不存在则返回0
exist = tafunc.exist(klines.close > klines.high.shift(1), 4)
print(list(exist))
tqsdk.tafunc.every(cond, n)

判断n个周期内, 是否一直满足cond条件, 若满足则值为1, 不满足为0

Args:

cond (array_like): 条件

n (int): 周期

Returns:

pandas.Series: 判断结果序列

Example:

from tqsdk import TqApi, TqSim, tafunc

api = TqApi(TqSim())
klines = api.get_kline_serial("CFFEX.IF1908", 24 * 60 * 60)
# 判断在4周期内, 3周期的简单移动平均是否一直大于5周期的简单移动平均
every = tafunc.every(tafunc.ma(klines.close, 3) > tafunc.ma(klines.close, 5), 4)
print(list(every))
tqsdk.tafunc.hhv(series, n)

求series在n个周期内的最高值

注意: n为0的情况下, 或当n为有效值但当前的series序列元素个数不足n个, 函数返回 NaN 序列

Args:

series (pandas.Series): 数据序列

n (int): 周期

Returns:

pandas.Series: 最高值序列

Example:

from tqsdk import TqApi, TqSim, tafunc

api = TqApi(TqSim())
klines = api.get_kline_serial("CFFEX.IF1908", 24 * 60 * 60)
hhv = tafunc.hhv(klines.high, 4)  # 求4个周期最高价的最大值, 即4周期高点(包含当前k线)
print(list(hhv))
tqsdk.tafunc.llv(series, n)

求在n个周期内的最小值

注意: n为0的情况下, 或当n为有效值但当前的series序列元素个数不足n个, 函数返回 NaN 序列

Args:

series (pandas.Series): 数据序列

n (int): 周期

Returns:

pandas.Series: 最小值序列

Example:

from tqsdk import TqApi, TqSim, tafunc

api = TqApi(TqSim())
klines = api.get_kline_serial("CFFEX.IF1908", 24 * 60 * 60)
llv = tafunc.llv(klines.low, 5)  # 求5根k线最低点(包含当前k线)
print(list(llv))
tqsdk.tafunc.avedev(series, n)

平均绝对偏差: 求series在n周期内的平均绝对偏差

算法:

计算avedev(df["close"],3)在最近一根K线上的值: (abs(df["close"] - (df["close"] + df["close"].shift(1) + df["close"].shift(2)) / 3) + abs( df["close"].shift(1) - (df["close"] + df["close"].shift(1) + df["close"].shift(2)) / 3) + abs( df["close"].shift(2) - (df["close"] + df["close"].shift(1) + df["close"].shift(2)) / 3)) / 3

注意: n为0的情况下, 或当n为有效值但当前的series序列元素个数不足n个, 函数返回 NaN 序列

Args:

series (pandas.Series): 数据序列

n (int): 周期

Returns:

pandas.Series: 平均绝对偏差序列

Example:

from tqsdk import TqApi, TqSim, tafunc

api = TqApi(TqSim())
klines = api.get_kline_serial("CFFEX.IF1908", 24 * 60 * 60)
# 计算收盘价在5周期内的平均绝对偏差, 表示5个周期内每个周期的收盘价与5周期收盘价的平均值的差的绝对值的平均值, 判断收盘价与其均值的偏离程度:
avedev = tafunc.avedev(klines.close, 5)
print(list(avedev))
tqsdk.tafunc.time_to_ns_timestamp(input_time)

将传入的时间转换为int类型的纳秒级时间戳

Args:
input_time (str/ int/ float/ datetime.datetime): 需要转换的时间:
  • str: str 类型的时间,如Quote行情时间的datetime字段 (eg. 2019-10-14 14:26:01.000000)

  • int: int 类型的纳秒级或秒级时间戳

  • float: float 类型的纳秒级或秒级时间戳,如K线或tick的datetime字段 (eg. 1.57103449e+18)

  • datetime.datetime: datetime 模块中的 datetime 类型时间

Returns:

int : int 类型的纳秒级时间戳

Example:

from tqsdk.tafunc import time_to_ns_timestamp
print(time_to_ns_timestamp("2019-10-14 14:26:01.000000"))  # 将%Y-%m-%d %H:%M:%S.%f 格式的str类型转为纳秒时间戳
print(time_to_ns_timestamp(1571103122))  # 将秒级转为纳秒时间戳
print(time_to_ns_timestamp(datetime.datetime(2019, 10, 14, 14, 26, 1)))  # 将datetime.datetime时间转为纳秒时间戳
tqsdk.tafunc.time_to_s_timestamp(input_time)

将传入的时间转换为int类型的秒级时间戳

Args:
input_time (str/ int/ float/ datetime.datetime): 需要转换的时间:
  • str: str 类型的时间,如Quote行情时间的datetime字段 (eg. 2019-10-14 14:26:01.000000)

  • int: int 类型的纳秒级或秒级时间戳

  • float: float 类型的纳秒级或秒级时间戳,如K线或tick的datetime字段 (eg. 1.57103449e+18)

  • datetime.datetime: datetime 模块中的 datetime 类型时间

Returns:

int : int类型的秒级时间戳

Example:

from tqsdk.tafunc import time_to_s_timestamp
print(time_to_s_timestamp(1.57103449e+18))  # 将纳秒级时间戳转为秒级时间戳
print(time_to_s_timestamp("2019-10-14 14:26:01.000000"))  # 将%Y-%m-%d %H:%M:%S.%f 格式的str类型时间转为秒级时间戳
print(time_to_s_timestamp(datetime.datetime(2019, 10, 14, 14, 26, 1)))  # 将datetime.datetime时间转为秒时间戳
tqsdk.tafunc.time_to_str(input_time)

将传入的时间转换为 %Y-%m-%d %H:%M:%S.%f 格式的 str 类型

Args:

input_time (int/ float/ datetime.datetime): 需要转换的时间:

  • int: int 类型的纳秒级或秒级时间戳

  • float: float 类型的纳秒级或秒级时间戳,如K线或tick的datetime字段 (eg. 1.57103449e+18)

  • datetime.datetime: datetime 模块中的 datetime 类型时间

Returns:

str : %Y-%m-%d %H:%M:%S.%f 格式的 str 类型时间

Example:

from tqsdk.tafunc import time_to_str
print(time_to_str(1.57103449e+18))  # 将纳秒级时间戳转为%Y-%m-%d %H:%M:%S.%f 格式的str类型时间
print(time_to_str(1571103122))  # 将秒级时间戳转为%Y-%m-%d %H:%M:%S.%f 格式的str类型时间
print(time_to_str(datetime.datetime(2019, 10, 14, 14, 26, 1)))  # 将datetime.datetime时间转为%Y-%m-%d %H:%M:%S.%f 格式的str类型时间
tqsdk.tafunc.time_to_datetime(input_time)

将传入的时间转换为 datetime.datetime 类型

Args:

input_time (int/ float/ str): 需要转换的时间:

  • int: int 类型的纳秒级或秒级时间戳

  • float: float 类型的纳秒级或秒级时间戳,如K线或tick的datetime字段 (eg. 1.57103449e+18)

  • str: str 类型的时间,如Quote行情时间的 datetime 字段 (eg. 2019-10-14 14:26:01.000000)

Returns:

datetime.datetime : datetime 模块中的 datetime 类型时间

Example:

from tqsdk.tafunc import time_to_datetime
print(time_to_datetime(1.57103449e+18))  # 将纳秒级时间戳转为datetime.datetime时间
print(time_to_datetime(1571103122))  # 将秒级时间戳转为datetime.datetime时间
print(time_to_datetime("2019-10-14 14:26:01.000000"))  # 将%Y-%m-%d %H:%M:%S.%f 格式的str类型时间转为datetime.datetime时间
tqsdk.tafunc.barlast(cond)

最近一次条件 cond 成立到当前的周期数 (如果 cond 长度为0或cond中无 True,函数返回-1)

请注意:为了便于获取更多的 barlast 数据及统一函数返回值类型,在1.5.2版 tqsdk 将会把这个函数返回值改为一个 pandas.Series 类型的序列!

Args:

cond (pandas.Series): 条件序列(序列中的值为 True 或 False)

Returns:

int : 周期数

Example:

from tqsdk import TqApi
from tqsdk.tafunc import barlast

api = TqApi()
klines = api.get_kline_serial("SHFE.cu2001", 10)
# print(list(klines.close))
# print(list(klines.open))
# print(list(klines.close > klines.open))
n = barlast(klines.close > klines.open)  # 计算最后一次k线收盘价大于开盘价到当前的周期数
print(n)
api.close()