假设你想实现一个简单的红绿带多空指标,基于 SMA (简单移动平均线) 或 EMA (指数移动平均线) 来定义红绿带的范围。我们可以使用绿色表示上升趋势,红色表示下降趋势。以下是一个基于 SMA 计算的红绿带多空指标的源码示例。
import pandas as pd
import numpy as np
import talib as ta
import matplotlib.pyplot as plt
def generate_red_green_bands(data, window=20):
"""
生成红绿带多空分析信号
:param data: 包含OHLCV数据的DataFrame,必须有 'Close' 列
:param window: 均线窗口大小,默认为20
:return: 生成信号的 DataFrame
"""
# 计算简单移动平均
data['SMA'] = ta.SMA(data['Close'], timeperiod=window)
# 生成红绿带信号
data['Color'] = np.where(data['Close'] > data['SMA'], 'Green', 'Red')
# 根据信号生成多空信号
data['Signal'] = 0 # 默认无信号
data.loc[data['Color'] == 'Green', 'Signal'] = 1 # 价格高于均线 -> 多头信号
data.loc[data['Color'] == 'Red', 'Signal'] = -1 # 价格低于均线 -> 空头信号
return data
# 示例数据
data = pd.DataFrame({
'Close': [100, 102, 104, 103, 107, 108, 110, 112, 113, 115, 116, 117, 119, 120]
})
# 生成红绿带信号
signal_data = generate_red_green_bands(data)
# 打印输出
print(signal_data[['Close', 'SMA', 'Color', 'Signal']])
# 可视化红绿带
plt.figure(figsize=(10, 6))
plt.plot(signal_data['Close'], label='Close Price', color='black')
plt.plot(signal_data['SMA'], label=f'{window}-period SMA', color='blue')
# 绘制红绿带
for i in range(1, len(signal_data)):
if signal_data['Color'].iloc[i] == 'Green':
plt.axvspan(i-1, i, color='green', alpha=0.3) # 多头区域
else:
plt.axvspan(i-1, i, color='red', alpha=0.3) # 空头区域
plt.title("Red-Green Bands (SMA-based)")
plt.legend()
plt.show()
发布于2025-1-3 21:04 杭州



分享
注册
1分钟入驻>
关注/提问
一对一
秒答
18342365994
搜索更多类似问题 >
电话咨询
+微信


