如何编写股票交易中从起始日期开始的ROC滚动偏度Pine Script代码
实现从指定起始日期开始的ROC滚动偏度(Pine Script)
我之前在mr_statler的帮助下完成了股票价格图表上从指定起始日期计算ROC滚动均值的Pine Script代码。现在想要实现从起始日期开始的滚动偏度(累积所有起始日期后的数据计算偏度,而非固定窗口),但无法将均值代码转换成偏度代码,附上相关代码请求协助。
mr_statler编写的滚动均值代码
//@version=5 indicator("My script") var roc_array = array.new_float(0) float avg_roc_array = array.avg(roc_array) start = input.time(timestamp("04 Oct 2022 00:00:00"), "Start date") if time >= start roc = ((close / close[1]) - 1) * 100 array.push(roc_array, roc) avg_roc_array := array.avg(roc_array) plot(avg_roc_array)
我尝试编写的滚动偏度代码
//@version=5 indicator("running skew") //roc length = input.int(1, minval=1) source = input(close, "Source") roc = 100 * (source - source[length])/source[length] plot(roc, color=#2962FF, title="ROC") hline(0, color=#787B86, title="Zero Line") //skew skewness(roc, length) => avg = ta.sma(roc, length) stdv = ta.stdev(roc, length) sum = math.pow(roc - avg, 3) for i = 1 to length - 1 sum := sum + math.pow(roc[i] - avg, 3) ((sum / length) / math.pow(stdv, 3)) skew = skewness(roc, length) //initializiation var roc_array = array.new_float(0) float skew_roc_array = skew start = input.time(timestamp("04 Oct 2022 00:00:00"), "Start date") //running skew if time >= start skew = skewness(roc, length) array.push(skew_array, skew) skew_roc_array := (roc_array) plot(skew_roc_array, title="skew", color=color.yellow)
2023年7月6日更新版代码
//@version=5 indicator("running skew of roc") //roc roclength = input.int(1, minval=1) length = input.int(2, minval=1) source = input(close, "Source") roc = 100 * (source - source[roclength])/source[roclength] // plot(roc, color=#2962FF, title="ROC") // hline(0, color=#787B86, title="Zero Line") //skew skewness(roc, length) => avg = ta.sma(roc, length) stdv = ta.stdev(roc, length) sum = math.pow(roc - avg, 3) for i = 1 to length - 1 sum := sum + math.pow(roc[i] - avg, 3) ((sum / length) / math.pow(stdv, 3)) _skew = skewness(roc, length) start = input.time(timestamp("13 Oct 2022 09:30:00"), "Start date") skew = time >= start ? _skew : na plot(skew, title="skew", color=color.yellow)
问题分析与修正后的代码
你的尝试存在几个核心问题:
- 自定义
skewness函数用ta.sma计算的是固定窗口均值,而非起始日期后的累积均值;循环遍历的roc[i]只能获取当前K线前固定数量的数据,无法累积所有起始日期后的记录。 - 数组操作存在变量未定义(
skew_array未初始化)、赋值错误(skew_roc_array := (roc_array))等问题。
以下是实现从起始日期开始的累积滚动偏度的正确代码:
//@version=5 indicator("累积ROC滚动偏度", overlay=false) // 输入参数 start_date = input.time(timestamp("04 Oct 2022 00:00:00"), "起始日期") roc_length = input.int(1, minval=1, title="ROC计算周期") // 存储起始日期后的ROC数据 var roc_data = array.new_float() // 计算ROC并添加到数组(起始日期后) if time >= start_date roc_val = 100 * (close - close[roc_length]) / close[roc_length] array.push(roc_data, roc_val) // 计算累积滚动偏度 float running_skew = na array_size = array.size(roc_data) if array_size >= 3 // 偏度计算至少需要3个数据点 // 计算数组内所有ROC的均值 avg = array.avg(roc_data) // 计算总体标准差 sum_sq = 0.0 for i = 0 to array_size - 1 sum_sq += math.pow(array.get(roc_data, i) - avg, 2) std_dev = math.sqrt(sum_sq / array_size) // 计算三阶中心矩 sum_cubed = 0.0 for i = 0 to array_size - 1 sum_cubed += math.pow(array.get(roc_data, i) - avg, 3) third_moment = sum_cubed / array_size // 计算偏度 running_skew = third_moment / math.pow(std_dev, 3) // 绘制结果 plot(running_skew, title="累积滚动偏度", color=color.yellow, linewidth=2) hline(0, color=color.gray, title="零线")
代码说明
- 用
var定义数组roc_data,确保仅初始化一次,用于累积存储起始日期后的所有ROC值。 - 当K线时间≥起始日期时,计算ROC并添加到数组中。
- 偏度计算需至少3个数据点,因此当数组大小≥3时才执行计算:
- 先计算数组内所有ROC值的均值。
- 基于总体标准差公式(除以数组大小)计算标准差。
- 计算三阶中心矩(每个数据与均值差的三次方的平均值)。
- 最终偏度 = 三阶中心矩 / (标准差的三次方)。
内容的提问来源于stack exchange,提问作者lvbx9
相关产品推荐
相关产品推荐

