Python3 Linux Cenots 安装Talib 教程

指令:

yum install gcc gcc-c++ -y
yum install python36-devel -y

sudo wget http://prdownloads.sourceforge.net/ta-lib/ta-lib-0.4.0-src.tar.gz
tar -zxvf ta-lib-0.4.0-src.tar.gz
cd ta-lib/
sudo ./configure --prefix=/usr  
sudo make
sudo make install
echo "export LD_LIBRARY_PATH=/usr/local/lib:$LD_LIBRARY_PATH" >> /etc/profile
source /etc/profile

pip3 install --upgrade pip
pip3 install numpy==1.16.6
pip3 install TA-Lib

yum install python36-devel -y 这句要根据python版本修改


安装成功后删除文件:

cd ..
rm -rf ta-lib*

苏慕白 发布于  2021-11-23 17:32 

Python3 获取小数位数 删除小数尾部0 教程

今天做获取小数位数的时候遇到了两个坑

  1. 浮点数 尾部0也计入了
  2. 用float 或者 format 把尾部0清除 太小的数会变成科学计数

下面我的解决方法

import re

def WeiShu(val):
    val_str = str(val)
    if "." not in val_str:
        return 0

    #删除尾部0,float不行,会科学计数
    rgx = re.compile(r'(?:(\.)|(\.\d*?[1-9]\d*?))0+(?=\b|[^0-9])')
    val_str = rgx.sub(r'\2', val_str)

    digits_location = val_str.find('.')
    if digits_location:
        return len(val_str[digits_location + 1:])

    return 0

a = '0.00000010'
print(WeiShu(a))

结果:7


苏慕白 发布于  2021-11-23 17:12 

【扩展】VWAP+Fibo 反转策略 组合投资 策略

1.原理

之前我做的策略和回测都是单个交易对交易,那么我们可不可以多个交易对同时进行交易呢?

下面找了八个交易对,然后使用VWAP+Fibo 反转策略: https://sumubai.cc/post/40
一起交易

因为杠杠的存在,我们可以每个交易对都满仓
比如每个交易对买一份,共买8份,杠杠开8倍即可

单个交易对最大回撤是30%, 但是组合在一起后最大回撤没有出现30%+30%=60%的情况
因为这个交易对出现最大回撤了,但是其他交易对这个时间都赚钱了

唯一的风险就是所有交易对同时亏钱,这个就需要实盘运行时加一个风控管理
控制账户最大浮亏


2. 回测结果

2021年 不复利
图片alt


10月-12月 不复利
图片alt


复利回测就没必要看了,好几个亿


苏慕白 发布于  2021-11-23 14:58 

VWAP+Fibo斐波那契 反转策略 策略

1.策略原理

VWAP:交易量加权平均线,这里周期用的一周,也就是每周一早上八点重置
Fibo:斐波那契黄金分割线

根据VWAP线+Fibo比例,设置四条轨道,突破上轨后做空,突破下轨后做多
价格回到VWAP线平仓

图片alt

2.回测结果

PS:参数没有做最优化

ETH 今年回测结果:
图片alt

BTC 今年回测结果:
图片alt

3. 结语

交易次数低,收益也过少,不如趋势策略,不过胜在胜率高
并且全品种通用,期货之类也是

可以考虑加止盈止损调参


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

多缓空急 笔记

多缓空急,意思是趋势上涨缓慢,下跌迅速,跌完就没了
因为均线都有滞后性,那么会不会是均线类策略无法做空盈利的原因呢?

这里我觉得可以用止盈出场,或者用其他指标出场例如ATR


苏慕白 发布于  2021-11-21 00:28 

LGB机器学习预测数字货币涨跌 策略

1. 模型选择

LGB全名LigthGBM是boosting集合模型中的新进成员,它和xgboost一样是对GBDT的高效实现,很多方面会比xgboost表现的更为优秀。原理上它和GBDT及xgboot类似,都采用损失函数的负梯度作为当前决策树的残差近似值,去拟合新的决策树。

一开始选择的是LSTM,不过经过各种折腾,对我这个新手小白都不好解决欠拟合和过拟合
参考了以下文章后选择了LGB
文章:

  1. 送你一份年化100%+的策略
  2. LightGBM模型简单预测股票涨跌情况
  3. LightGBM(lgb)介绍

2. 数据来源

我这边选择的是爬取币安给出的2020年至今的几大主流币历史合约K线数据,周期为5m
主流币选择,看总市值排行选择出来的币:
'BTCUSDT',
'ETHUSDT',
'LTCUSDT',
'BNBUSDT',
'XMRUSDT',
'XRPUSDT',
'XTZUSDT',
'ADAUSDT',
'BCHUSDT',


3. 模型问题

LGB可以解决多分类问题、线性问题、二分类问题,我这边选择的是二分类问题
也就是下一根收盘价大于这一根收盘价标记为1,反之为0,让LGB去预测分类

代码:

features['label'] = ((features['next_close'] / features['Close'] - 1) > 0)
features['label'] = features['label'].astype('int')

4. 模型特征

在我每天尝试几个指标,尝试了几十个指标(说多了都是泪,每个指标Talib没有的得自己实现,实现后再慢慢调参):
图片alt

最后组合出来了以下做为特征:
'close_tf',
'vol_tf',
'high_tf',
'low_tf',
'hlc_tf',
'zhenfu',
'macd',
'adx',
'rsi',
'dpo',


5. 数据处理

处理就是把缺少数据的行给删除
我还做了以下尝试,效果都没优化:

  1. 删除涨幅小的数据,删除后预测效果更差了
  2. 删除inf值的数据,删除后预测效果更差了

LGB不像神经网络需要对异常值很敏感,所以就不处理其他的了

然后再划分出训练集和测试集
训练集:20200101-20210601
测试集:20210601-20211101
图片alt


6. 模型训练

代码:

import lightgbm as lgb
param = {
     'num_leaves': 31,
     'learning_rate': 0.06,
     "boosting": "gbdt",
     "metric": 'auc',
     'device': 'gpu',
     "verbosity": -1,
}

trn_data = lgb.Dataset(trn, label=trn_label)
val_data = lgb.Dataset(val, label=val_label)
num_round = 500
#clf = lgb.train(param, trn_data, num_round, valid_sets=[trn_data, val_data])
clf = lgb.train(param, trn_data, num_round)
#clf.save_model("v6_8-25.txt")
test_lgb = clf.predict(val, num_iteration=clf.best_iteration)
pd.DataFrame({
        'column': feature_col,
        'importance': clf.feature_importance(),
    }).sort_values(by='importance', ascending=False)

参数为第一篇文章所给的参数,在这里感谢下他的分享

训练结果:
图片alt

正确率为52.2%


6. 模型回测

模型训练完,那么就让他在测试集表现一下如何

回测设置:双边万4%,杠杠5,不复利

因为手续费的问题
这里设置的为预测下一根K线涨跌概率大于63%才开仓
要不然会赔的裤衩子都不剩,如果有手续费为0的账号那么55%概率就可以开仓了
退出条件为5m走完就平仓

回测结果:
图片alt
图片alt

7. 结语

我做量化以来踩过3个坑,其中这个机器学习就占了两个

  1. 我做了一个策略,回测今年每个月都有一次30%以上的大回撤并且2020年无法盈利,还是让它上线了,前面翻倍,后面本金腰斩
  2. 一开始做这个机器学习,测试集只用了80天,年初也无法盈利,导致过拟合本金腰斩
  3. 最后呢 机器学习终于做出来了,杠杠开太大25倍,本金腰斩,哈哈哈哈

唯一没赔钱的一次还是靠爬交易所公告,找即将上线的新币梭哈的

因为水平有限,我现在做量化暂时不用机器学习这种方式了
原因是我的水平只能做类似黑盒测试,无法了解他的运行原理,导致我无法再优化它

不要灰心,这个模型到现在11月20日也是盈利的状态,什么时候失效就不知道了

并且做机器学习的这几个月让我知道了很多指标的计算方式和使用方式
可以尝试根据自己对指标的认知做策略了,策略稳定盈利后再来剖析机器学习


最后给打算接触的一些建议:

  1. 不要尝试预测价格,否则最优结果永远是上一根K线收盘价,预测涨跌、收益率
  2. 初学者做这个很难分辨策略是不是过拟合了(大佬除外)
  3. 可以尝试预测高频,高频数据的拟合更加容易
  4. 也可以去试试NLP自然语言处理,爬各种动态新闻,先行一步入场,做庄家肚子里的蛔虫

苏慕白 发布于  2021-11-20 22:44 

【原生代码】Pyrhon3实现VWAP成交量加权平均线 指标

1. VWAP成交量加权平均线算法:

公式: (price * Volume) / Volume


详细解释:
当日累积((High+Low+Close) / 3 * Volume)
再除以当日累积交易量


当日是指每天早上8点重置累积的量(TradingView中是这样)
有需求可以自行看代码自行修改重置的时间


2. 代码实现:

impot time

"""字典转数组"""
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 GetTime(x, style="%H:%M:%S"):
    x = int(str(x)[:10])
    time_local = time.localtime(x)
    dt = time.strftime(style,time_local)
    return dt

"""成交量加权平均线"""
def VWAP(r, dayTime='08:00', name='h+l+c',):
    src = GetSrc(r, name)
    emas = [0 for i in range(len(src))]  # 创造一个和cps一样大小的集合

    srcVol,Vol = 0, 0
    for i in range(len(src)):
        if GetTime(r[i]['Time'], "%H:%M") == dayTime: #每天早上八点重置
            Vol = r[i]['Volume']
            srcVol = src[i] * r[i]['Volume']
        else:
            Vol += r[i]['Volume']
            srcVol += src[i] * r[i]['Volume']
        emas[i] = srcVol / Vol

    return emas

3. 变量r 结构图如下:

{
    {
        'Time': 0, #时间戳
        'Close': 0,
        'Open': 0,
        'High': 0,
        'Low': 0,
        'Volume': 0, #成交量
    }
}

4. 调用:

vwap = VWAP(r)

结果基本和TradingView一致


苏慕白 发布于  2021-11-20 20:46 

EMA交叉策略 V2 【金三角回调】 策略

1. 策略原理

V1版本: https://sumubai.cc/post/12

原理基本和第一个版本一致,只是增加了入场的两个条件:

  1. 增加一条超长线,例如EMA200,然后短线必须在超长线之上,之间的标准差一样做归一化阈值过滤,(短线可以选择不在中线之上)
  2. 形成回调后入场

回调例子:
图片alt
图片alt

回调代码描述:

df['bars_max'] = df['Close'].rolling(seting['bars']).max()
df['bars_min'] = df['Close'].rolling(seting['bars']).min()
bars = df['Low'][i] > df['bars_min'][i] and df['High'][i] < df['bars_max'][i]

不过经过我的测试增加一条超长线就行了,回调可有可无


出场:短线下穿中线和强止损,(如果开仓短线已经在中线下方了,那就下一次下穿)

2. 回测结果

2021年 15m周期 不使用回调入场 短线可在中线下方
图片alt


2021年 30m周期 使用回调入场 短线可在中线下方
图片alt

3.总结

虽然收益率没之前的好,但是开阔了思路(胜率也提高了),值得写一篇文章


苏慕白 发布于  2021-11-19 22:15 

【原生代码】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