布林带 Python

def Boll_Band(DF, n=14):
    "function to calculate Bollinger Band"
    df = DF.copy()
    df["MB"] = df["Adj Close"].rolling(n).mean()
    df["UB"] = df["MB"] + 2*df["Adj Close"].rolling(n).std(ddof=0)
    df["LB"] = df["MB"] - 2*df["Adj Close"].rolling(n).std(ddof=0)
    df["BB_Width"] = df["UB"] - df["LB"]
    return df[["MB","UB","LB","BB_Width"]]

这个Python函数`Boll_Band`用于计算布林带(Bollinger Bands)。这是一种在金融交易和技术分析中常用的指标,主要用于量化资产价格的波动性。函数接受一个数据帧(DataFrame)`DF`和一个整数`n`作为输入,其中`DF`应该包含调整后的收盘价("Adj Close")列。

函数执行以下步骤:

1. **复制数据帧**:函数首先通过`df = DF.copy()`创建原数据帧的副本。

2. **计算中线(Middle Band,MB)**:这通常是n天的移动平均。函数通过`df["Adj Close"].rolling(n).mean()`计算这一均值,并将结果存储在新列`df["MB"]`中。

3. **计算上带(Upper Band,UB)和下带(Lower Band,LB)**:
   - 上带是中线加上两倍的标准差:`df["MB"] + 2*df["Adj Close"].rolling(n).std(ddof=0)`
   - 下带是中线减去两倍的标准差:`df["MB"] - 2*df["Adj Close"].rolling(n).std(ddof=0)`
  
   在这里,我们用`rolling(n).std(ddof=0)`来计算n天的移动标准差。`ddof=0`意味着在计算样本标准差时,我们用N而不是N-1作为分母。

4. **计算布林带宽度(Bollinger Band Width)**:这是上带和下带之间的差异,计算公式为:`df["UB"] - df["LB"]`。

最后,函数返回包含中线(MB)、上带(UB)、下带(LB)和布林带宽度(BB_Width)的新数据帧。

这个函数是一个简单而有效的实现,使用了Pandas库来进行数据操作和计算,非常适用于金融数据分析和交易策略的开发。

在统计学中,样本标准差通常使用`n-1`作为分母,这是因为`n-1`提供了一个无偏估计(unbiased estimator)。无偏估计更准确地反映了整个数据集的标准差,而不仅仅是样本数据。

然而,在金融分析和信号处理等应用中,人们有时候会使用`n`而不是`n-1`作为分母来计算标准差。这样做的原因可能有多个:

1. **数据量大**:在金融时间序列数据中,数据点通常非常多,因此使用`n`或`n-1`的差异可能不大。

2. **实时性和反应度**:在金融交易中,更关注的是近期数据对标准差的贡献,而不一定是无偏估计。

3. **计算简便**:使用`n`作为分母可以简化计算。尽管这在现代计算机上可能不是问题,但在一些场景下,简化计算仍然是有益的。

4. **应用侧重点**:在某些情况下,分析师可能更关心样本本身的特性,而不是整个数据集或总体的特性。在这些情况下,使用`n`可能更为合适。

总体来说,选择`n`或`n-1`取决于特定应用和分析的目的。在金融时间序列分析中,通常会看到两者都有应用,关键是理解你的选择背后的假设和限制。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
林带策略是一种基于统计学原理的技术分析方法,常用于股票交易和其他金融市场。下面是一个简单的林带策略的Python代码示例: ```python import pandas as pd import numpy as np import matplotlib.pyplot as plt # 获取数据 df = pd.read_csv('data.csv') # 计算林带指标 n = 20 # 计算周期 std = 2 # 林带宽度 ma = df['close'].rolling(n).mean() std_dev = df['close'].rolling(n).std() upper_band = ma + std * std_dev lower_band = ma - std * std_dev # 绘制林带 plt.plot(df['close']) plt.plot(upper_band) plt.plot(lower_band) # 判断买入和卖出信号 signals = pd.Series(np.zeros(len(df))) for i in range(n, len(df)): if df['close'][i] > upper_band[i-1]: signals[i] = 1 elif df['close'][i] < lower_band[i-1]: signals[i] = -1 # 绘制买卖信号 buy_signals = signals[signals == 1] sell_signals = signals[signals == -1] plt.scatter(buy_signals.index, df['close'][buy_signals.index], color='green', marker='^', s=100) plt.scatter(sell_signals.index, df['close'][sell_signals.index], color='red', marker='v', s=100) # 计算收益率 returns = pd.Series(np.zeros(len(df))) for i in range(1, len(df)): if signals[i-1] == 1: returns[i] = (df['close'][i] - df['close'][i-1]) / df['close'][i-1] elif signals[i-1] == -1: returns[i] = (df['close'][i-1] - df['close'][i]) / df['close'][i-1] # 绘制收益率曲线 cum_returns = (1 + returns).cumprod() plt.figure() plt.plot(cum_returns) # 输出统计指标 win_rate = len(returns[returns > 0]) / len(returns[returns != 0]) print('总收益率:', cum_returns[-1]) print('年化收益率:', (cum_returns[-1] ** (250/len(df)) - 1)) print('胜率:', win_rate) print('盈亏比:', abs(returns[returns > 0].mean() / returns[returns < 0].mean())) ``` 在这个例子中,我们首先计算了林带的上限和下限,然后根据收盘价与林带的位置判断买卖信号。最后,我们计算了收益率并输出了一些统计指标。当然,这只是一个简单的示例,实际操作中还需要考虑一些细节问题,例如手续费、滑点等。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值