You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何编写股票交易中从起始日期开始的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)

问题分析与修正后的代码

你的尝试存在几个核心问题:

  1. 自定义skewness函数用ta.sma计算的是固定窗口均值,而非起始日期后的累积均值;循环遍历的roc[i]只能获取当前K线前固定数量的数据,无法累积所有起始日期后的记录。
  2. 数组操作存在变量未定义(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时才执行计算:
    1. 先计算数组内所有ROC值的均值。
    2. 基于总体标准差公式(除以数组大小)计算标准差。
    3. 计算三阶中心矩(每个数据与均值差的三次方的平均值)。
    4. 最终偏度 = 三阶中心矩 / (标准差的三次方)。

内容的提问来源于stack exchange,提问作者lvbx9

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 21:55:44