利用 Python 实现随机相对强弱指数 StochRSI

目录
  • 一、StochRSI如何运作?
  • 二、如何使用StochRSI?
  • 三、基于均值回归的StochRSI 策略
  • 四、StochRSI 和动量策略

随机相对强弱指数简称为StochRSI,是一种技术分析指标,用于确定资产是否处于超买或超卖状态,也用于确定当前市场的态势。顾名思义,StochRSI是标准相对强弱指数(RSI)的衍生,因此被视为是一种能够衡量指数的指数。它是一种振荡器,在中心线的上方和下方波动。

StochRSI最初是在1994年由Stanley KrollTushar Chande撰写的题为《The NewTechnical Trader》的书中描述。它经常被股票交易者使用。

一、StochRSI如何运作?

通过应用随机振荡器生成公式,从标准RSI生成StochRSI。其生成结果是单个数字评级,围绕中心线(0.5)在0-1的值域范围内上下摆动。但是,StochRSI的修改版本将结果乘以100,因此该值是介于0和100之间而不是0和1之间。通常还会参考3天内的简单移动平均线(SMA)以及StochRSI趋势,作为信号线,旨在降低虚假信号交易的风险。

标准随机震荡指数公式取决于资产的收盘价以及设定周期内的最高价和最低价。但是,当使用公式计算StochRSI时,它直接使用RSI数据(不考虑价格)。

Stoch RSI = (Current RSI - Lowest RSI)/(Highest RSI - Lowest RSI)

与标准RSI一样,StochRSI使用的最常见时间周期为14。StochRSI计算中涉及的14个周期基于图表时间范围。因此,每日图表会显示过去14天(K线图),每小时图表会显示过去14小时生成的StochRSI

周期可以设置为几天、几小时甚至几分钟,并且它们的使用方式也因交易者而异(根据他们的情况和策略而定)。还可以向上或向下调整周期数,以确定长期或短期趋势。将周期值设置为20,是StochRSI指标一个相当受欢迎的选择。

如上所述,某些StochRSI图表模式指定的范围值为0到100而不是0到1。在这些图表中,中心线为50而不是0.5。因此,通常在0.8处出现的超买信号将表示为80,而超卖信号表示为20而不是0.2。具有0-100设置的图表可能看起来略有不同,但实际原理解释是基本相同的。

二、如何使用StochRSI?

StochRSI指数如果出现在其范围的上限和下限附近,此时的意义是最重大的。因此,该指标的主要用途是确定潜在的买入和卖出点,以及价格发生的逆转。因此,0.2或以下的数值,会表明资产可能发生超卖,而0.8或以上的数值则表明该资产可能会发生超买。

此外,更接近中心线的数值也可以为交易者提供有关市场趋势的信息。例如,当中心线作为支撑线并且StochRSI线稳定移动到0.5以上时,尤其是数值趋近于0.8,则可能表明其继续看涨或呈上升趋势。同样,当数值始终低于0.5,趋近于0.2时,则表明下跌或呈下降趋势趋势。

我们将通过 Python 中的回测来介绍 RSI StochRSI 这两种方法。

三、基于均值回归的StochRSI 策略

最常见的 StochRSI 策略基于均值回归。与 RSI 一样,StochRSI 通常使用 80 来表示做空的超买水平,使用 20 来表示要买入的超卖水平。此外,14 天的回顾和平滑期很常见。出于我们的目的,我们将坚持使用这些标准值。

现在编写代码,让我们在 Python 中导入一些标准包。

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import yfinance as yf

接下来,我们将构建一个函数来计算我们的指标。我们将其称为 calcStochRSI(),它将依靠一些函数来计算 RSI 和随机振荡器,以获得我们选择的指标。

def calcRSI(data, P=14):
  # Calculate gains and losses
  data['diff_close'] = data['Close'] - data['Close'].shift(1)
  data['gain'] = np.where(data['diff_close']>0,
    data['diff_close'], 0)
  data['loss'] = np.where(data['diff_close']<0,
    np.abs(data['diff_close']), 0)
  # Get initial values
  data[['init_avg_gain', 'init_avg_loss']] = data[
    ['gain', 'loss']].rolling(P)
  # Calculate smoothed avg gains and losses for all t > P
  avg_gain = np.zeros(len(data))
  avg_loss = np.zeros(len(data))
  for i, _row in enumerate(data.iterrows()):
    row = _row[1]
    if i < P - 1:
      last_row = row.copy()
      continue
    elif i == P-1:
      avg_gain[i] += row['init_avg_gain']
      avg_loss[i] += row['init_avg_loss']
    else:
      avg_gain[i] += ((P - 1) * avg_gain[i] +
            row['gain']) / P
      avg_loss[i] += ((P - 1) * avg_loss[i] +
            row['loss']) / P
    last_row = row.copy()
  data['avg_gain'] = avg_gain
  data['avg_loss'] = avg_loss
  # Calculate RS and RSI
  data['RS'] = data['avg_gain'] / data['avg_loss']
  data['RSI'] = 100 - 100 / (1 + data['RS'])
  return data
def calcStochOscillator(data):
  data['low_N'] = data['RSI'].rolling(N).min()
  data['high_N'] = data['RSI'].rolling(N).max()
  data['StochRSI'] = 100 * (data['RSI'] - data['low_N']) / \
    (data['high_N'] - data['low_N'])
  return data
def calcStochRSI(data, P=14, N=14):
  data = calcRSI(data)
  data = calcStochOscillator(data)
  return data
def calcReturns(df):
  # Helper function to avoid repeating too much code
  df['returns'] = df['Close'] / df['Close'].shift(1)
  df['log_returns'] = np.log(df['returns'])
  df['strat_returns'] = df['position'].shift(1) * df['returns']
  df['strat_log_returns'] = df['position'].shift(1) * df['log_returns']
  df['cum_returns'] = np.exp(df['log_returns'].cumsum()) - 1
  df['strat_cum_returns'] = np.exp(df['strat_log_returns'].cumsum()) - 1
  df['peak'] = df['cum_returns'].cummax()
  df['strat_peak'] = df['strat_cum_returns'].cummax()
  return df

有了这些功能,我们只需要为我们的策略构建逻辑就可以了。还要注意,我们有一个名为 calcReturns 的辅助函数,我们可以快速将其应用于回测的结果以从中获取所有返回值。

这意味着回归模型将在 StochRSI 高于 80 时做空或卖出,并在低于 20 时买入。

def StochRSIReversionStrategy(data, P=14, N=14, short_level=80,
  buy_level=20, shorts=True):
  '''Buys when the StochRSI is oversold and sells when it's overbought'''
  df = calcStochRSI(data, P, N)
  df['position'] = np
  df['position'] = np.where(df['StochRSI']<buy_level, 1, df['position'])
  if shorts:
    df['position'] = np.where(df['StochRSI']>short_level, -1, df['position'])
  else:
    df['position'] = np.where(df['StochRSI']>short_level, 0, df['position'])
  df['position'] = df['position'].ffill()
  return calcReturns(df)
table = pd.read_html('https://en.wikipedia.org/wiki/List_of_S%26P_500_companies')
df = table[0]
syms = df['Symbol']
# Sample symbols
# ticker = np.random.choice(syms.values)
ticker = "BSX"
print(f"Ticker Symbol: {ticker}")
start = '2000-01-01'
end = '2020-12-31'
# Get Data
yfyfObj = yf.Ticker(ticker)
data = yfObj.history(startstart=start, endend=end)
data.drop(['Open', 'High', 'Low', 'Volume', 'Dividends',
    'Stock Splits'], inplace=True, axis=1)
# Run test
df_rev = StochRSIReversionStrategy(data.copy())
# Plot results
colors = plt.rcParams['axes.prop_cycle'].by_key()['color']
fig, ax = plt.subplots(2, figsize=(12, 8))
ax[0].plot(df_rev['strat_cum_returns']*100, label='Mean Reversion')
ax[0].plot(df_rev['cum_returns']*100, label='Buy and Hold')
ax[0].set_ylabel('Returns (%)')
ax[0].set_title('Cumulative Returns for Mean Reversion and' +
                f' Buy and Hold Strategies for {ticker}')
ax[0].legend(bbox_to_anchor=[1, 0.6])
ax[1].plot(df_rev['StochRSI'], label='StochRSI', linewidth=0.5)
ax[1].plot(df_rev['RSI'], label='RSI', linewidth=1)
ax[1].axhline(80, label='Over Bought', color=colors[1], linestyle=':')
ax[1].axhline(20, label='Over Sold', color=colors[2], linestyle=':')
ax[1].axhline(50, label='Centerline', color='k', linestyle=':')
ax[1].set_ylabel('Stochastic RSI')
ax[1].set_xlabel('Date')
ax[1].set_title(f'Stochastic RSI for {ticker}')
ax[1].legend(bbox_to_anchor=[1, 0.75])
plt.tight_layout()
plt.show()

在我们研究的 21 年期间,均值回归策略击败了Boston Scientific(BSX)的买入和持有策略,回报率为 28 倍,而后者为 2 倍。

在第二个图中显示了 StochRSI 和一些关键指标。我还添加了 RSI 以与更不稳定的 StochRSI 进行比较。这导致交易频繁,如果您的账户较小且交易成本相对较高,这可能会严重影响您的实际回报。我们只是在一个工具上运行它,所以最终进行了 443 笔交易,或者每 12 天交易一次,这看起来并不多。但是,如果我们要使用该指标管理适当的工具组合并频繁进行交易,我们每天可能会进出多笔交易,交易成本会变得很高。

# Get trades
diff = df_rev['position'].diff().dropna()
trade_idx = diff.index[np.where(diff!=0)]
fig, ax = plt.subplots(figsize=(12, 8))
ax.plot(df_rev['Close'], linewidth=1, label=f'{ticker}')
ax.scatter(trade_idx, df_rev[trade_idx]['Close'], c=colors[1],
           marker='^', label='Trade')
ax.set_ylabel('Price')
ax.set_title(f'{ticker} Price Chart and Trades for' +
             'StochRSI Mean Reversion Strategy')
ax.legend()
plt.show()

要查看整体策略的一些关键指标,让我们看看使用以下 getStratStats 函数。

def getStratStats(log_returns: pd.Series, risk_free_rate: float = 0.02):
  stats = {}
  # Total Returns
  stats['tot_returns'] = np.exp(log_returns.sum()) - 1
  # Mean Annual Returns
  stats['annual_returns'] = np.exp(log_returns.mean() * 252) - 1
  # Annual Volatility
  stats['annual_volatility'] = log_returns * np.sqrt(252)
  # Sortino Ratio
  annualized_downside = log_returns.loc[log_returns<0].std() * np.sqrt(252)
  stats['sortino_ratio'] = (stats['annual_returns'] - risk_free_rate) \
    / annualized_downside
  # Sharpe Ratio
  stats['sharpe_ratio'] = (stats['annual_returns'] - risk_free_rate) \
    / stats['annual_volatility']
  # Max Drawdown
  cum_returns = log_returns.cumsum() - 1
  peak = cum_returns.cummax()
  drawdown = peak - cum_returns
  stats['max_drawdown'] = drawdown.max()
  # Max Drawdown Duration
  strat_dd = drawdown[drawdown==0]
  strat_ddstrat_dd_diff = strat_dd.index[1:] - strat_dd.index[:-1]
  strat_dd_days = strat_dd_diff.map(lambda x: x.days)
  strat_dd_days = np.hstack([strat_dd_days,
      (drawdown.index[-1] - strat_dd.index[-1]).days])
  stats['max_drawdown_duration'] = strat_dd_days.max()
  return stats
rev_stats = getStratStats(df_rev['strat_log_returns'])
bh_stats = getStratStats(df_rev['log_returns'])
pd.concat([pd.DataFrame(rev_stats, index=['Mean Reversion']),
           pd.DataFrame(bh_stats, index=['Buy and Hold'])])

在这里,我们看到该策略的回报率为 28 倍,而基础资产的年度波动率大致相同。此外,根据 Sortino Sharpe Ratios 衡量,我们有更好的风险调整回报。

在 2020 年的新冠疫情中,我们确实看到了均值回归策略的潜在问题之一。该策略的总回报大幅下降,因为该策略的定位是向上回归,但市场继续低迷,该模型只是保持不变 . 它恢复了其中的一部分,但在这次测试中从未达到过疫情之前的高点。正确使用止损有助于限制这些巨大的损失,并有可能增加整体回报。

四、StochRSI 和动量策略

我们之前提到的另一个基本策略是使用 StochRSI 作为动量指标。当指标穿过中心线时,我们会根据其方向买入或做空股票。

def StochRSIMomentumStrategy(data, P=14, N=14,
  centerline=50, shorts=True):
  '''
  Buys when the StochRSI moves above the centerline,
  sells when it moves below
  '''
  df = calcStochRSI(data, P)
  df['position'] = np.nan
  df['position'] = np.where(df['StochRSI']>50, 1, df['position'])
  if shorts:
     df['position'] = np.where(df['StochRSI']<50, -1, df['position'])
  else:
    df['position'] = np.where(df['StochRSI']<50, 0, df['position'])
  df['position'] = df['position'].ffill()
  return calcReturns(df)

运行我们的回测:

# Run test
df_mom = StochRSIMomentumStrategy(data.copy())
# Plot results
colors = plt.rcParams['axes.prop_cycle'].by_key()['color']
fig, ax = plt.subplots(2, figsize=(12, 8))
ax[0].plot(df_mom['strat_cum_returns']*100, label='Momentum')
ax[0].plot(df_mom['cum_returns']*100, label='Buy and Hold')
ax[0].set_ylabel('Returns (%)')
ax[0].set_title('Cumulative Returns for Momentum and' +
                f' Buy and Hold Strategies for {ticker}')
ax[0].legend(bbox_to_anchor=[1, 0.6])
ax[1].plot(df_mom['StochRSI'], label='StochRSI', linewidth=0.5)
ax[1].plot(df_mom['RSI'], label='RSI', linewidth=1)
ax[1].axhline(50, label='Centerline', color='k', linestyle=':')
ax[1].set_ylabel('Stochastic RSI')
ax[1].set_xlabel('Date')
ax[1].set_title(f'Stochastic RSI for {ticker}')
ax[1].legend(bbox_to_anchor=[1, 0.75])
plt.tight_layout()
plt.show()

在这种情况下,我们的动量策略表现非常糟糕,在我们假设的时间段内几乎损失了我们所有的初始投资。

查看我们策略的统计数据,该模型的唯一优势是比买入并持有方法的回撤时间略短。

mom_stats = getStratStats(df_mom['strat_log_returns'])
bh_stats = getStratStats(df_mom['log_returns'])
pd.concat([pd.DataFrame(mom_stats, index=['Momentum']),
           pd.DataFrame(rev_stats, index=['Mean Reversion']),
           pd.DataFrame(bh_stats, index=['Buy and Hold'])])

这并不意味着StochRSI 不适合此类应用。一次糟糕的回测并不意味着该策略毫无价值。相反,一个很好的回测并不意味着你有一些你应该立即开始交易的东西。我们需要与其他指标结合使用以改善结果。

到此这篇关于利用 Python 实现随机相对强弱指数 StochRSI的文章就介绍到这了,更多相关Python 实现随机相对强弱指数 StochRSI内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • 中秋将至利用python画一些月饼从天而降不用买了

    目录 ​​导语 正文 ​​总结 ​ ​​导语 好消息!下一个假期已经在路上了,正在向我们招手呢! 大家只要再坚持5天 就能迎来中秋小长假啦~ ​"海上生明月,天涯共此时" 又是一年中秋至!快跟着小编来看看怎么寓教于乐吧-- 今天带大家编写一款应时应景的中秋小游戏! 天上掉月饼啦~天上掉月饼啦~天上掉月饼啦~ 正文 ​准备好相应的素材如下: ​ 环境安装: Python3.6.pycharm2021.游戏模块Pygame. 安装:pip install pygame ​初始化游戏加载素材

  • 一篇文章带你了解谷歌这些大厂是怎么写 python 代码的

    目录 谷歌内部的 python 代码规范 1.导入模块和包,不导入单独的类.函数或者变量. 2.从根目录导入,不假定任意的 sys.path,也不使用相对导入. 3.谨慎使用异常 4.不要使用可变类型作为函数默认值,如果修改了这个变量,默认值也会跟着发生变化. 5.注意条件表达式的隐式布尔值 6.谨慎使用装饰器 7.建议使用类型声明,类型声明的好处非常明显: 总结 谷歌内部的 python 代码规范 熟悉 python 一般都会努力遵循 pep8 规范,也会有一些公司制定内部的代码规范.大公司制

  • python游戏实战项目之童年经典超级玛丽

    导语 "超级玛丽"--有多少人还记得这款经典游戏?那个戴帽子的大胡子穿着背带裤的马里奥! 带您重温经典的回忆,超级马里奥拯救不开心!炫酷来袭. 如果您的童年,也曾被魔性的 灯~灯灯~灯~灯灯~灯洗脑~那就来怀旧一番吧! 我是华丽的分割线------------------------------ 往期写过游戏实战已经积累到30几篇了哦~嘿嘿,推一波之前的,狗头保命.jpg. 欢迎大家来领免费的游戏,开玩啦~源码可以直接找我拿滴! 在座的各位大佬,你们都玩过这里面的几个游戏吖? ​ 往期

  • Python中with...as...的使用方法

    目录 一.With...as语句的基本语法格式: 二.With...as语法的执行流程 三.实例验证 四.程序运行结果 五.代码解析 简介: with是从Python2.5引入的一个新的语法,它是一种上下文管理协议,目的在于从流程图中把 try,except 和finally 关键字和资源分配释放相关代码统统去掉,简化try-.except-.finlally的处理流程 with通过__enter__方法初始化,然后在__exit__中做善后以及处理异常.所以使用with处理的对象必须有__en

  • python游戏实战项目之智能五子棋

    目录 导语 正文 总结 导语 ​ 今日游戏更新,大家好,我是木木子,每天都给大家更新最好玩的游戏!关注我,从此你再也不用去费力找游戏了! 最热门最好玩的Python游戏点击即玩! 今天推荐的游戏是五子棋小游戏--人机对战.联机对战皆可! 你是否还记得?中学时代和同桌下过的五子棋? ​ 这样下棋只怕是会被打!​!!!我怀疑他开挂了,并且找到了证据. ​ 正文 首先准备好需要的图片等素材部分如下: ​​​ 好了!直接上代码吧--设置游戏开始界面: class gameStartUI(QWidget)

  • Python中is与==的使用区别详解

    目录 一.== 是比较两个对象的内容是否相等 二.is 比较的是两个实例对象是不是完全相同 三.使用is注意python对于小整数使用对象池存储问题 四.使用is注意python关于字符串的intern机制存储 5.python中对于None值的比较:使用is 一.== 是比较两个对象的内容是否相等 即两个对象的"值""是否相等,不管两者在内存中的引用地址是否一样. //地址一样,值也一样.所以==成立. st1 ='aaaaa' st2 = 'bbbbb' st3 = 'b

  • python游戏实战项目之智能五子棋简易版

    目录 导语 正文 总结 导语 前段时间不是制作了一款升级版本五子棋的嘛! 但是居然有粉丝私信我说: "准备拿到代码玩一下ok过去了!太难了准备放收藏夹落灰q@q~" 所噶,今天先放一个简易版本的五子棋给大家看看!学习嘛~从简单到难 还是慢慢来撒~ 学玩这篇可以学下一篇难一点的撒: Pygame实战:下五子棋吗?信不信我让你几步你也赢不了?​​​​​​​ 正文 嘿嘿!这五子棋只有人机对战了哈!不要看人机对战感觉很简单,其实代码量也超多滴. 主要代码:都有注释的撒!就不一步一步介绍了. i

  • 关于python变量的引用以及在底层存储原理

    目录 1.变量的引用的底层原理 2.变量的分类 Python的变量,简单来说有数值型,布尔型,字符串类型,列表,元组,字典等6大类.那么不同变量类型在底层是如何存储的,关系到变量的引用,能否正确的掌握变量的相关操作 下面v1,v2的值分别是多少?为什么? v1 =3 v2=v1 print("v2:",v2) v1 += 2 print("v1:",v1) print("v2:",v2) #下面l2的值又是多少?为什么? l1 = [1,2,3]

  • 利用 Python 实现随机相对强弱指数 StochRSI

    目录 一.StochRSI如何运作? 二.如何使用StochRSI? 三.基于均值回归的StochRSI 策略 四.StochRSI 和动量策略 随机相对强弱指数简称为StochRSI,是一种技术分析指标,用于确定资产是否处于超买或超卖状态,也用于确定当前市场的态势.顾名思义,StochRSI是标准相对强弱指数(RSI)的衍生,因此被视为是一种能够衡量指数的指数.它是一种振荡器,在中心线的上方和下方波动. StochRSI最初是在1994年由Stanley Kroll和Tushar Chande

  • 利用Python生成随机验证码详解

    目录 1.先搞环境 2.开始码代码 3. 加干扰 4. 加入更多的干扰 5. 验证码 + 随机字符 6. 验证码保存本地(选) 最近感觉被大数据定义成机器人了,随便看个网页都跳验证码. 怎么用python绕验证码是个令人头秃的事情, 我投降!那么今天手把手教大家如何写验证码,去为难别人,让他们头秃. 说错了,其实就是教大家如何通过python代码去生成验证码~~ 1.先搞环境 1.我们需要你电脑有python3.4以上的版本 2.pip安装PIL包 pip install pillow 3.默念

  • 如何利用Python随机从list中挑选一个元素

    目录 1. 引言 2. 举个栗子 3. 使用Random库 3.1 随机下标 3.2 随机选择单个元素 3.3 随机选择多个元素 4. 使用Secrets库 4.1 随机下标 4.2 随机选择单个元素 4.3 随机选择多个元素 5. 总结 1. 引言 在本文中,我们将研究从列表中选择随机元素的不同实现方法.在日常项目中,我们经常会遇到这种情形,比如随机从多种数据增强策略中选择一种或几种来提升训练数据的多样性.闲话少说,我们直接开始吧. :) 2. 举个栗子 为了方便示例,这里我们假设有一个包含多

  • 如何利用python进行时间序列分析

    题记:毕业一年多天天coding,好久没写paper了.在这动荡的日子里,也希望写点东西让自己静一静.恰好前段时间用python做了一点时间序列方面的东西,有一丁点心得体会想和大家分享下.在此也要特别感谢顾志耐和散沙,让我喜欢上了python. 什么是时间序列 时间序列简单的说就是各时间点上形成的数值序列,时间序列分析就是通过观察历史数据预测未来的值.在这里需要强调一点的是,时间序列分析并不是关于时间的回归,它主要是研究自身的变化规律的(这里不考虑含外生变量的时间序列). 为什么用python

  • 利用Python计算圆周率π的实例代码

    前言 A货:什么!你不会背圆周率(鄙夷的眼神) 3.1415926535 8979323846 26433... 桥哥:我会算呀 !!! 一.圆周率的历史 1.中国 ★ 魏晋时期,刘徽曾用使正多边形的边数逐渐增加去逼近圆周的方法 (即「割圆术」),求得π的近似值3.1416. ★ 汉朝时,张衡得出π的平方除以16等于5/8,即π等于10的开方(约为3.162).虽然这个值不太准确,但它简单易理解,所以也在亚洲风行了一阵. ★ 王蕃(229-267)发现了另一个圆周率值,这就是3.156, 但没有

  • 利用Python实现K-Means聚类的方法实例(案例:用户分类)

    目录 K-Means聚类算法介绍 K-Means聚类算法基础原理 K-Means聚类算法实现流程 开始做一个简单的聚类 数据导入 数据探索 开始聚类 查看输出结果 聚类质心 K-Means聚类算法的评估指标 真实标签已知 真实标签未知 实用案例:基于轮廓系数来选择最佳的n_clusters 结果对比 优化方案选择 K-Means聚类算法介绍 K-Means又称为K均值聚类算法,属于聚类算法中的一种,而聚类算法在机器学习算法中属于无监督学习,在业务中常常会结合实际需求与业务逻辑理解来完成建模: 无

  • Python生成随机MAC地址

    利用python代码生成一个随机的MAC地址,使用python网络编程时或可用上,如果使用scapy模块则可直接利用RandMAC()函数来生成MAC. python 复制代码 代码如下: import random Maclist = [] for i in range(1,7):     RANDSTR = "".join(random.sample("0123456789abcdef",2))     Maclist.append(RANDSTR) RANDM

  • Python生成随机验证码的两种方法

    使用python生成随机验证码的方法有很多种,今天小编给大家分享两种方法,大家可以灵活运用这两种方法,设计出适合自己的验证码方法. 方法一: 利用range方法,对于range方法不清楚的同学,请参考文章<python开发的range()函数> # -*- coding: utf-8 -*- import random def generate_verification_code(len=6): ''' 随机生成6位的验证码 ''' # 注意: 这里我们生成的是0-9A-Za-z的列表,当然你

  • 利用Python学习RabbitMQ消息队列

    RabbitMQ可以当做一个消息代理,它的核心原理非常简单:即接收和发送消息,可以把它想象成一个邮局:我们把信件放入邮箱,邮递员就会把信件投递到你的收件人处,RabbitMQ就是一个邮箱.邮局.投递员功能综合体,整个过程就是:邮箱接收信件,邮局转发信件,投递员投递信件到达收件人处. RabbitMQ和邮局的主要区别就是RabbitMQ接收.存储和发送的是二进制数据----消息. rabbitmq基本管理命令: 一步启动Erlang node和Rabbit应用:sudo rabbitmq-serv

  • 用Python实现随机森林算法的示例

    拥有高方差使得决策树(secision tress)在处理特定训练数据集时其结果显得相对脆弱.bagging(bootstrap aggregating 的缩写)算法从训练数据的样本中建立复合模型,可以有效降低决策树的方差,但树与树之间有高度关联(并不是理想的树的状态). 随机森林算法(Random forest algorithm)是对 bagging 算法的扩展.除了仍然根据从训练数据样本建立复合模型之外,随机森林对用做构建树(tree)的数据特征做了一定限制,使得生成的决策树之间没有关联,

随机推荐