大家好,在上节课的自定义函数课程中,我们进行的都是简单的逻辑判断或者指标的计算,然而通常情况下,在实际的量化测量策略中,我们通常需要多个成熟的指标进行综合应用和逻辑比较。因此,在策略函数中可以使用成熟的内置函数,可以避免代码的臃肿,减轻我们的工作量。
内置函数
Pine语言内置函数分类有以下几种:
- 1、字符串处理函数str.系列。
- 2、颜色值处理函数color.系列。
- 3、参数输入函数input.系列。
- 4、指标计算函数ta.系列。
- 5、画图函数plot.系列。
- 6、数组处理函数array.系列。
- 7、交易相关函数strategy.系列。
- 8、数学运算相关函数math.系列。
- 9、其它函数(时间处理、非plot系列画图函数、request.系列函数、类型处理函数等)。
可以看到,内置函数确实有很多类,如果你想实现一个函数功能,但是又不想重复造轮子,你可以很方便地在优宽社区帮助文档中查询。在这其中,color.系列,input.系列,和plot.系列我们在以前的课程都讲述过。本节课的内容,我将集中于数学运算相关函数math.系列和指标计算函数ta.系列内置函数的讲解。
math.系列内置函数
math.系列内置函数涉及到对交易指标的原始计算,基本上所有基础的对于数字和集合的处理,math系列函数都可以满足。如果你觉得成熟的指标过于老旧,喜欢挑战原创交易指标的同学,你一定不要错过。
math系列内置函数有很多,因此我进行了分类帮助大家更方便的记忆。
基本上可以分为三类,第一种处理单个数字,比如取整,取不同对数,或者获得数字符号等:
- math.abs(number) 绝对值
- math.ceil(number) 大于等于取整整数
- math.floor(number) 小于等于取整整数
- math.round(number) 四舍五入到最接近的整数; 如果使用了 precision 参数,则返回一个四舍五入到小数位数的浮点值
- math.exp(number) e的number次方
- math.log(number) 自然对数
- math.log10(number) 以10为底的对数
- math.pow(base, exponent) 数学幂函数
- math.sign(number) >0: 1; =0: 0; <0: -1
- math.sqrt(number) 平方根
runtime.log('绝对值',math.abs(-5)) // 5
runtime.log('⼤于等于取整',math.ceil(3.14)) //4
runtime.log('⼩于等于取整',math.floor(3.14)) //3
runtime.log('四舍五⼊',math.round(3.14,precision= 1) ) //3.1
runtime.log('e的number次⽅ ',math.exp(1)) //2.718281828459045
runtime.log('⾃然对数',math.log(math.e)) //1
runtime.log('以10为底的对数 ',math.log10(10)) //1
runtime.log('数学幂函数 ',math.pow(math.e, 1)) //2.718281828459045
runtime.log('符号',math.sign(-5) ) //-1
runtime.log('开方',math.sqrt(9) ) //3
第二种处理角度,根据三角函数,获得不同角度对应值。
- math.acos() 数字的反余弦
- math.asin() 反正弦
- math.atan() 反正切
- math.cos() 余弦
- math.sin() 正弦
- math.tan() 三角正切
- math.todegrees(radians) 返回以度为单位的近似等效角度
- math.toradians(degrees) 返回以弧度为单位的近似等效角度
math.sin(math.pi/6) // 0.4999
math.asin(0.5) // 0.52 = math.pi/6
math.todegrees(math.pi)// 180
第三种处理数据集合,比如取最大值,最小值和随机数等,这部分的内容会和array函数有些重合,我们后续会为大家讲解。
- math.max(number0, number1, …) 返回多个值中最大值
- math.min(number0, number1, …) 最小值
- math.avg(number0, number1, …) 平均值
- math.sum(source, length) 返回x的最后y值的滑动综合
- math.random(min, max, seed) 返回伪随机值
math.max(1, 2, 3, 4, 5) //5
math.min(1, 2, 3, 4, 5) //1
math.avg(1, 2, 3, 4, 5) //3
math.sum(close, 3) //以3为周期的close滑动综合值
math.random(1, 5, 2) // 设定最小值为1,最大值为5,seed为2,每次随机返回值都一致
ta.系列内置函数
TA,全称“Technical Analysis”, 即技术分析指标,是Pine语言封装的金融量化的高级库,涵盖了50多种股票、期货交易软件中常用的技术分析指标,如 MACD、RSI、KDJ、动量指标、布林带等等。下面我为大家初步介绍下。
经过整理,ta.系列内置函数可分为以下子板块:
均线处理函数
研究发现,资产的长期价格呈现均值回复的特征,即从长期来看,资产的价格会回归均值。这也是均线理论被广泛应用的前提。因此,在量化指标中,方便的均线处理内置函数必不可少。
- ta.alma(series, length, offset, sigma, floor) Arnaud Legoux移动平均线。它使用高斯分布作为移动平均值的权重。
series (series int/float) 待执行的系列值。
length (series int) K线数量(长度).
offset (simple int/float) 控制平滑度(更接近1)和响应性(更接近0)之间的权衡。
sigma (simple int/float) 改变ALMA的平滑度。Sigma越大,ALMA越平滑。
floor (simple bool) 可选参数。在计算ALMA之前,指定偏移量计算是否为下限。默认值为false。
- ta.sma(source, length) 移动平均值
- ta.ema(source, length) 指数加权移动平均线
- ta.wma(source, length) 返回length K线的 source 的加权移动平均值
- ta.swma(source) 具有固定长度的对称加权移动平均线
- ta.hma(source, length) 船体移动平均线HMA
- ta.rma(source, length) RSI中使用的移动平均线
- ta.vwap(source) 成交量加权平均
- ta.vwma(source, length) length K线的 source 的成交量加权移动平均值
plot(ta.sma, 'sma')
plot(ta.ema, 'ema')
plot(ta.wma, 'wma')
指标计算
量化投资起源于上世纪60年代,而下面的每一个指标都曾“各领风骚”过,当然有些指标如今还在使用。如果你看到了某些指标符合你的交易思路,你可以在优宽平台一台代码尝试下。
- ta.rsi(source, length) 相对强度指数
- ta.tsi(source, short_length, long_length) 真实强弱指数
- ta.roc(source, length) lengthK线返回的source的变化率。
- ta.macd(source, fastlen, slowlen, siglen) MACD(平滑异同平均线)
- ta.bb(series, length, mult) 布林带。mult (simple int/float) 标准差因子。
- ta.bbw(series, length, mult) 布林带宽度。
- ta.cci(source, length) lengthK线返回的source的商品渠道指数。
- ta.cmo(series, length) 钱德动量摆动指标。
- ta.tr(handle_na) 真实范围
- ta.mfi(series, length) 资金流量指标。
- ta.kc(series, length, mult) 肯特纳通道。
- ta.kcw(series, length, mult) 肯特纳通道宽度。
- ta.atr(length) 真实波动幅度均值(ATR)
- ta.sar(start, inc, max) 抛物线转向指标。
start (simple int/float) 开始。
inc (simple int/float) 增加
max (simple int/float) 最大.
- ta.dmi(diLength, adxSmoothing) dmi函数返回动向指数DMI。
diLength (simple int) DI Period。
adxSmoothing (simple int) ADX平滑周期
- ta.pivothigh(source, leftbars, rightbars) 此函数返回枢轴高点的价格。 如果没有枢轴高点,则返回“NaN”。
- ta.pivotlow(source, leftbars, rightbars) 此函数返回枢轴低点的价格。 如果没有枢轴低点,它返回“NaN”。
- ta.stoch(source, high, low, length) 随机指标。
- ta.supertrend(factor, atrPeriod) 超级趋势指标。
- ta.wpr(length) 威廉姆斯指标Williams %R。
- ta.cog(source, length) 基于统计学和斐波那契黄金比例的指标
pine_rsi(x, y) =>
u = math.max(x - x[1], 0) // upward ta.change
d = math.max(x[1] - x, 0) // downward ta.change
rs = ta.rma(u, y) / ta.rma(d, y)
res = 100 - 100 / (1 + rs)
res
if ta.rsi <= 20
strategy.entry("buy", strategy.long, qty=1)
if ta.rsi >= 30
strategy.close_all("buy", comment = "close long")
if ta.rsi >= 80
strategy.entry("short", strategy.short, qty=1)
if ta.rsi <= 70
strategy.close_all("short", comment = "close short")
plot(ta.rsi(close, 7), 'rsi值')
相对强弱指标(RSI)是技术指标中的一种,强弱指标理论认为,任何市价的大涨或者大跌,均在0—100之间波动。 根据常态分析,认为RSI值在30-70之间的变动属正常情况,在80—90时,被认为市场已达超买状态,至此市场价格自然面临回落调整;而在10—20时,被认为市场已达超卖状态,至此市场价格自然面临企稳回升。
统计计算
期货作为时间序列的数据,当然少不了对它的统计计算。基本的指标,平均数,中位数,方差,百分位数等,内置函数都有包含;初步的统计分析,相关分析,线性回归分析等,pine语言也可以满足。
- ta.highest(source, length) 过去k线的给定数目的最高值。
- ta.highestbars(source, length) 偏移到最高k线。
- ta.lowest(source, length) 过去k线的给定数目的最低值。
- ta.lowestbars(source, length) 过去k线的给定数目的最低值偏移。
- ta.dev(source, length) 衡量系列与其ta.sma之间的差异
- ta.stdev(source, length, biased) 标准差
- ta.variance(source, length, biased) length K线返回的source的方差
- ta.range(source, length) 序列中最小值和最大值之间的差。
- ta.mode(source, length) 序列的众数
- ta.median(source, length) 序列的中位数
- ta.cum(source) source 的累积(全部的)总和。
- ta.correlation(source1, source2, length) 相关系数。
- ta.linreg(source, length, offset) 线性回归曲线。一条最符合用户定义时间段内指定价格的线。它是使用最小二乘法计算的。此函数的结果使用以下公式计算:linreg = intercept + slope * (length - 1 - offset),其中 intercept 和 slope 是使用 source 系列的最小二乘法计算的值。
- ta.change(source, length) 当前值与前一个值之间的差分
- ta.mom(source, length) source价格和source价格lengthK线之前的动量。
- ta.percentile_linear_interpolation(source, length, percentage) lengthK线返回的source系列的第P个百分位数。
- ta.percentile_nearest_rank(source, length, percentage) lengthK线返回的source系列的第P个百分位数。
- ta.percentrank(source, length) lengthK线返回的source百分比排名。
- ta.barssince(condition) 如状况为true的k线数目。
runtime.log('最⾼值',ta.highest(close, 10) )
runtime.log('最⾼k线',ta.highestbars(close, 10) )
runtime.log('衡量均值差异', ta.dev(close, 10) )
runtime.log('标准差', ta.stdev(close, 10))
runtime.log('⽅差',ta.variance(close, 10))
runtime.log('range',ta.range(close, 10))
runtime.log('众数', ta.mode(close, 10))
runtime.log('中位数', ta.median(close, 10))
runtime.log('总和',ta.cum(close,10))
runtime.log('差分',ta.change(close,10))
runtime.log('百分比排名',ta.percentrank(close,10))
runtime.log(ta.barssince(close>open) )
plot(ta.correlation(close, volume, 14),'相关系数',overlay= false)
plot(ta.linreg(close, 14,0) ,'线性回归预测值',overlay= true)
逻辑判断
最后,ta系列内置函数还有一些帮助逻辑判断的函数
- ta.cross(source1, source2) 如果两个系列相互交叉则为true,否则为false。
- ta.crossover(source1, source2) 如果source1穿过source2则为true,否则为false。
- ta.crossunder(source1, source2) 如果source1在source2下交叉,则为true,否则为false。
- ta.falling(source, length) 如果当前 source 值小于 length K线返回的任何先前 source 值,则为true,否则为false。
- ta.rising(source, length) 如果当前 source 值大于 length K线返回的任何先前 source 值,则为true,否则为false。
- ta.valuewhen(condition, source, occurrence) 返回第n次最近出现的“condition”为true的K线的“source”系列值。
设置condition条件为’close>open’,即为阳线,设置返回值为close,出现次数为n:
runtime.log('第一根阳线收盘价', ta.valuewhen(close > open , close, 0))
runtime.log('第二根阳线收盘价', ta.valuewhen(close > open , close, 1))
总体而言,本节课的内容确实比较多,其实大家也不必太过担心记忆这些函数。你可以首先记住大致的概念,而在你对大盘市场观察过程中,如果发现某些交易思路或者交易指标比较适合,你可以重新回想起来这些指标,去使用它,或者在此基础上编写新的量化指标,添加进入你的量化策略,也许下一个量化指标就是由你来命名的。