【原生代码】Python3 实现TradingView中的STDEV标准差 指标

TradingView Pine原版代码

plot(stdev(close, 5))

//the same on pine
isZero(val, eps) => abs(val) <= eps

SUM(fst, snd) =>
    EPS = 1e-10
    res = fst + snd
    if isZero(res, EPS)
        res := 0
    else
        if not isZero(res, 1e-4)
            res := res
        else
            15

pine_stdev(src, length) =>
    avg = sma(src, length)
    sumOfSquareDeviations = 0.0
    for i = 0 to length - 1
        sum = SUM(src[i], -avg)
        sumOfSquareDeviations := sumOfSquareDeviations + sum * sum

    stdev = sqrt(sumOfSquareDeviations / length)
plot(pine_stdev(close, 5))

Python3实现:

import math  #求平方根

"""字典转数组"""
def GetSrc(r, name):
    if name == 'o+h+l+c':
        src = [ (v['Open'] + v['High'] + v['Low'] + v['Close']) / 4 for v in r ]

    elif name == 'h+l+c':
        src = [ (v['High'] + v['Low'] + v['Close']) / 3 for v in r ]

    elif name == 'h+l':
        src = [ (v['High'] + v['Low']) / 2 for v in r ]

    else:
        src = [ v[name] for v in r ] if name else r

    return src

#移动平均线
def SMA(r, days, name=0):
    cps = GetSrc(r, name)
    emas = [0 for i in range(len(cps))]  # 创造一个和cps一样大小的集合

    for i in range(len(cps)):
        if i < days-1:
            emas[i] = 0
        else:
            ma = 0
            for i2 in range(i-days,i):
                i2 += 1
                ma += cps[i2]
            emas[i] = ma / days
    return emas

def STDEV_isZero(val, eps):
    return abs(val) <= eps

def STDEV_SUM(fst, snd):
    res = fst + snd
    if STDEV_isZero(res, 1e-10):
        res = 0
    elif STDEV_isZero(res, 1e-4):
        res = 15
    return res

def STDEV(r, days, name=0):
    src = GetSrc(r, name)
    avg = SMA(src, days)
    stdev = [0 for i in range(len(src))]
    for i in range(len(src)):
        if i > days:
            sumOfSquareDeviations = 0
            for i2 in range(days):
                i3 = i-i2
                sum = STDEV_SUM(src[i3], -avg[i])
                sumOfSquareDeviations = sumOfSquareDeviations + sum * sum
            stdev[i] = math.sqrt(sumOfSquareDeviations / days)

    return stdev

调用方法:STDEV(r, 5, "Close")
结果基本一致

或者使用Talib里的库:

import talib
talib.STDDEV(df['Close'].values, timeperiod=200)

结果也是一样的


苏慕白 发布于  2021-11-17 20:57 

虚拟币与标普500指数、总市值的关联性 笔记

1. ETH涨跌与标普500指数相关

图片alt

2. ETH涨跌与虚拟币总市值相关

图片alt

只需要在标普500指数跌了或者虚拟币总市值跌了提前做空,反之做多


苏慕白 发布于  2021-11-17 18:04 

Python3计算TradingView中的linreg线性回归曲线 指标

线性回归曲线。最符合用户指定时间区间内价格的曲线。 使用最小二乘法计算。该函数结果使用以下公式计算:linreg = intercept + slope *(length - 1 - offset),其中length是y参数,offset是z参数,intercept和slope是用源系列最小二乘法计算的值 (x参数)。

代码:

import talib as tl
tl.LINEARREG(df['Close'].values, 10)  #线性回归   

结果和TradingVeiw计算的一致,但是少了个offset参数


苏慕白 发布于  2021-11-17 18:01 

【67%胜率】每个月底25号买入,下个月6号卖出 策略

很有意思的一个定投规律
每个月底25号买入,下个月6号卖出
重复这样三年,胜率居然可以达到67%
并且刚好躲过每次大跌,哈哈

ETHUSDT交易对
图片alt
图片alt


BTCUSDT交易对
图片alt
图片alt


苏慕白 发布于  2021-11-17 01:14 

机器学习 笔记

TradingVeiw的一个大神成功用神经网络深度学习预测了何时卖何时卖
https://cn.tradingview.com/script/ZLKmDgjC-IW-bitfinex-ADAUSD/

图片alt

1h

"macd", "macdx", "macdw", "rsi", "rsi7","rsi20", "ema7", "ema10", "ema20", "ema20volume","ema50", "ema100", "ema200", "sma10", "sma20","sma50", "sma100", "sma200", "gaps","candlepos", "opex", "roc", "bbl", "bbu","highest14", "lowest14", "williams", "psar", "sto"


苏慕白 发布于  2021-11-17 00:42 

11-14日 实盘策略 实盘

实盘已停止

2021-11-29日:
经过半个月的苦苦等待,嗯,就交易了几次
而且都是只能做多的策略加上大饼暴跌=亏钱

我这半个月也陆陆续续做了几个可以做空的策略
并且学会了多交易对组合投资

所以决定全面更换为短线策略:
最新实盘策略地址:
https://sumubai.cc/post/52



1. SuperTrend

名称:Supertrend
介绍:中文名超级趋势,只用到了ATR一个指标,ATR通道随着波动不断缩小,突破买入卖出
文章:https://sumubai.cc/post/16
周期:2h
杠杠: 1.6倍
最大回撤:-18.83%
实盘日期:2021-11-14 09:23
带杠杠回测:
图片alt


2. Keltner2通道

名称:Keltner2通道
介绍:根据移动平均线再加上ATR计算上轨和下轨,突破上轨且ADX指标满足开多,突破下轨平仓
文章:https://sumubai.cc/post/23
周期:1h
杠杠: 2.5倍
最大回撤:-12.75%
实盘日期:2021-11-16 09:57
带杠杠回测:
图片alt


3. 自己做的一个策略

名称:无
介绍:EMA > MA、且MACD上穿时开多,再根据ATR移动止损平仓
文章:https://sumubai.cc/post/26
周期:5m
最大回撤:-21.25%
实盘日期:2021-11-15 21:34
带杠杠回测:
图片alt


苏慕白 发布于  2021-11-16 15:11 

拒绝赌博式量化 笔记

《以交易为生》 说的三个目标:

第一目标是:必须长期生存下去
第二目标是:资本的稳定增长
第三目标才是:赚取高额的利润

所以我的策略开了杠杆的历史回测结果最大回撤必须控制在30%以内
超过就停机


苏慕白 发布于  2021-11-16 15:00 

【总结】打造一个自己的策略 策略

1. 总结

有实盘意义的策略:

  1. bias乖离率
  2. 短周期+长周期 Open+Close交叉
  3. Supertrend超级趋势(ATR通道)
  4. 金字塔买入策略
  5. Keltner渠道 (三重EMA+ATR渠道)
  6. Keltner渠道 v2 (MA+ATR渠道)
  7. 鳄鱼线
  8. EMA交叉

没实盘意义的策略:

  1. 快速MACD、MACD的各种交叉(什么二次金叉,水上水下)
  2. RSI、KDJ、MFI、BOLL啥逆转抄底,进场还行,出场拉夸
  3. ..... 不写了,太多了几十个。哈哈

买入卖出:

  1. 构造EMA+ATR通道 突破上轨买入
  2. 突破ATR买入卖出
  3. EMA交叉买入卖出
  4. 每上穿一次买入一份 金字塔式买入

过滤方法:

  1. EMA标准差归一化阈值
  2. ADX过滤方法
  3. 收盘价必须在上轨以下才买入
  4. ema250 > ema500 顺大势
  5. 相同长度ema > ma时才开仓
  6. 大周期 ema线顺势
  7. ATR > ATR[1]
  8. KDJ逆转
  9. RSI阈值

移动止损:

  1. 每出现开仓信号一次,把止损线移动到开仓信号,可以固定比例,也可以是ATR

以上就是我这半个月的总结了,做个记录

2. 打造一个自己的策略

一句话说的很好 “徒弟会进场,师傅会出场”
EMA交叉买入卖出 优点进场快 但是死于缠绕震荡
ATR突破买入卖出 优点不会频繁出场 但是频次慢

因为长线的持仓和等待太过煎熬,本文打算要做一个适用于高频短线的策略。

策略大概构想:

  1. 入场:MACD、ADX、Ema < Ma 三者满足时
  2. 出场:ATR移动出场(每出现一次开仓信号移动)

虽然Keltner渠道也是把移动平均线和ATR结合了,但是短线表现不好

最后各种测试和修改,花了用了两天的时间,成功做了出来(大部分时间都花在了遗传算法选优上)
再用遗传算法选2021年表现最优的参数
因为5m短线数据量太大,回测选参数太慢,所以就只用了一年的数据
这就是为啥下面的回测2021年表现最好

3. 回测结果

2018年,大半年都在跌,短线表现很差
图片alt

2019年,表现勉勉强强
图片alt

2020年
图片alt

2021年
图片alt

2021年复利的情况
图片alt

4. 策略对比

对比一下之前做过的 EMA交叉、Supertrend、Keltner渠道2 这三个策略

图片alt

本文所做的策略,属于5m高频短线策略,所以相比其他策略,没复利的情况下可能不如其他长线策略,但是复利起来就很恐怖了
但是也有短线策略回撤大的毛病。。。相信未来可以继续学习改善
完~


苏慕白 发布于  2021-11-14 11:01 

11-13 随笔 笔记

今天尝试了下用python回测股票
速度惨不忍睹。。
放弃了
准备尝试期货

主要是4000多只股票,然后每个都要计算指标值太慢了

最后这句话绝对真实:徒弟会入场,师傅会出场
策略何尝不是呢


苏慕白 发布于  2021-11-13 21:24 

【原生代码】Python3 计算DI、ADX趋向指标 指标

1.引用:

import pandas as pd
import numpy as np

2.代码

#RSI中使用的移动平均线。 它是指数加权移动平均线,alpha加权值 = 1 /长度
def RMA(r, days, name=0):
    cps = [ v[name] for v in r ] if name else r
    rmas = [0 for i in range(len(cps))]  # 创造一个和cps一样大小的集合
    alpha = 1 / days

    for i in range(len(cps)):
        if i > days-1:
            if rmas[i-1] and not np.isnan(rmas[i-1]):
                rmas[i] = alpha * cps[i] + (1 - alpha) * rmas[i-1]
            else:
                ma = 0
                for i2 in range(i-days,i):  #求平均值
                    ma += cps[i2+1]
                rmas[i] = ma / days

    return rmas

#其他MA类型看上一篇文章
def ATR(r, days, ma='sma'):
    tr = [0]
    for i in range(len(r)):
        if i:
            tr.append(max(r[i]['High']-r[i]['Low'], abs(r[i]['High'] - r[i-1]['Close']), abs(r[i]['Low'] - r[i-1]['Close'])))

    if ma == 'rma':
        return RMA(tr, days)

    if ma == 'ema':
        return EMA(tr, days)

    if ma == 'sma':
        return SMA(tr, days)

    if not ma:
        return tr

"""DI"""
def DI(r, days):
    df = pd.DataFrame(r)
    df['up'] = df['High'] - df['High'].shift(1)
    df['down'] = -(df['Low'] - df['Low'].shift(1))
    df['truerange'] = RMA(ATR(r, days=0, ma=0), days)
    df['plus'] = RMA([df['up'][i] if df['up'][i] > df['down'][i] and df['up'][i]> 0 else 0 for i in range(len(df['up']))], days) / df['truerange']
    df['minus'] = RMA([df['down'][i] if df['down'][i] > df['up'][i] and df['down'][i]> 0 else 0 for i in range(len(df['up']))], days) / df['truerange']

    df['plus'] = df['plus'].apply(float) * 100
    df['minus'] = df['minus'].apply(float) * 100
    return df['plus'], df['minus']

"""ADX趋向指标"""
def ADX(r, diDays, adxDays):
    df = pd.DataFrame(r)
    df['plus'], df['minus'] = DI(r, diDays)
    df['sum'] = df['plus'] + df['minus']
    df['adx'] = [abs(df['plus'][i] - df['minus'][i]) / (1 if df['sum'][i] == 0 else df['sum'][i]) for i in range(len(df['sum']))]
    df['adx'] = RMA(df['adx'].values, adxDays)
    df['adx'] = df['adx'].apply(float) * 100

    return df['adx'], df['plus'], df['minus']

3.使用例子

指标计算的值我都和TradingView对比过,放心使用~
r为K线数据

df['adx'], df['plus'], df['minus'] = ADX(r, 14, 14)

图片alt


苏慕白 发布于  2021-11-13 21:16 

【Keltner渠道2】MA+ATR通道 策略

1.策略原理

和上一个版本的做了以下修改:

  1. 不使用三重EMA平滑 单纯的MA
  2. 突破下轨才平仓 原来是突破中轨
  3. 移动止损:例如止损4%,每出现一次开仓信号,止损价格按开仓信号的收盘价重新计算
  4. ema46 < ma46时开仓 (没什么软用, 不加的效果更好)
  5. 增加ADX过滤开仓 (看上一篇文章)
  6. 开盘价必须在上轨的下方

2.回测结果

2020年-2021年 1h
图片alt

2019年 1h
图片alt

2020年-2021年
图片alt


苏慕白 发布于  2021-11-13 19:50 

金字塔买入策略 策略

1.策略原理

刚刚看到一个金字塔买入策略

中线上穿长线 并且 短线上穿中短线 时买入一份
最多持有七份

买入后设置每份的固定止盈止损

这个类似于网格和马丁
但是这个有止损不会爆仓和被套
如果连续几次买入七份都被止损才会爆仓
就是赌会继续上涨,

2.回测结果

这里设置的是 每份止盈3% 止损10%
图片alt
图片alt

3.随笔

可以不可以用于股票呢?分成十份资金,按照指标开仓,止盈止损


苏慕白 发布于  2021-11-11 23:31 

ADX(DI)过滤开仓信号 指标

1. ADX指标可视化

//@version=5
indicator("Average Directional Index", shorttitle="ADX", format=format.price, precision=2, timeframe="", timeframe_gaps=true)
adxlen = input(14, title="ADX Smoothing")
dilen = input(14, title="DI Length")
dirmov(len) =>
    up = ta.change(high)
    down = -ta.change(low)
    plusDM = na(up) ? na : (up > down and up > 0 ? up : 0)
    minusDM = na(down) ? na : (down > up and down > 0 ? down : 0)
    truerange = ta.rma(ta.tr, len)
    plus = fixnan(100 * ta.rma(plusDM, len) / truerange)
    minus = fixnan(100 * ta.rma(minusDM, len) / truerange)
    [plus, minus]
adx(dilen, adxlen) =>
    [plus, minus] = dirmov(dilen)
    sum = plus + minus
    adx = 100 * ta.rma(math.abs(plus - minus) / (sum == 0 ? 1 : sum), adxlen)
    [adx, plus, minus]

[sig, up, down] = adx(dilen, adxlen)
plot(sig, color=color.red, title="ADX")
plot(up, color=color.blue, title="up")
plot(down, color=color.green, title="up")

hline(27)

图片alt

2. 代码过滤逻辑

说是ADX,其实只用到了ADX中的DI指标值

DI参数:19
做多:
up > down and up > 27


苏慕白 发布于  2021-11-11 22:28 

一种止盈止损方式 笔记

1.核心代码

图片alt

2.原理

开仓后根据开仓价格设置
4.5% 止盈平仓15%
20% 止盈平仓75%
4% 止损平仓100%

指标出场信号 平仓100%

图片alt

3.PS

感觉止盈完全没必要,跑出来的结果只是胜率提高了,最终盈利结果没有提高


苏慕白 发布于  2021-11-11 21:37 

【Keltner渠道】EMA+ATR通道策略 策略

1.核心代码

图片alt

2.策略原理

当突破上轨时做多,突破中轨时平多
当突破下轨时做空,突破中轨时平空
图片alt

3.回测结果

45m周期 今年
图片alt

1小时周期 最近两年
图片alt

1小时周期 最近三年
图片alt


苏慕白 发布于  2021-11-11 11:05