背景: 一些同学看我之前写的开源项目介绍,卡在了TA-Lib安装这一步,问我这个怎么安装。也有同学问我怎么分析某只股票是否值得买,参考哪些技术指标。这里提供下思路,方便需要的同学。虽然之前技术指标分别都写过对应的文章,但比较零散,感兴趣的同学可以翻一翻之前的文章。 这里计划把常用的指标用TA-Lib直接一个界面全部搞定,仅供参考TA-Lib是一个开源的金融技术分析库,涵盖超过150种技术指标的计算,包括趋势指标(如移动平均线)、动量指标(如RSI)、波动率指标(如布林带)等。其底层采用C语言优化,并通过Python、Java等接口暴露功能,计算速度极快,特别适合处理高频金融数据。
核心优势
- 高效计算
- 全面覆盖
- 多语言支持:Python、C/C++、Java、Ruby等均可调用。
- 开源免费
brew install ta-lib
ls /opt/homebrew/opt/ta-lib/lib/
pip install
ta-lib
3、如果brew info ta-lib 出不来效果尝试 做下软连接sudo ln -s /opt/homebrew/Cellar/ta-lib/0.4.0/lib/libta_lib.0.dylib /usr/local/lib/
1. 移动平均线(MA):捕捉趋势方向
移动平均线是识别趋势的基础工具。TA-Lib提供SMA
(简单移动平均)、EMA
(指数移动平均)等函数。
import talib
import numpy as np
# 示例数据:收盘价(假设为连续10天的数据)
close_prices = np.array([45.3,46.1,47.8,48.5,
49.2,50.1,49.8,51.0,50.5,52.3])
# 计算5日简单移动平均线
sma5 = talib.SMA(close_prices, timeperiod=5)
print("5日SMA:", sma5)
# 输出:[ nan nan nan nan 47.38, 48.34, 49.12, 49.88, 50.32, 50.94]
2. 相对强弱指数(RSI):识别超买超卖
RSI用于衡量价格变动速度,通常在70以上视为超买,30以下为超卖。
rsi14 = talib.RSI(close_prices, timeperiod=14)
print("14日RSI:", rsi14[-1]) # 输出最新RSI值
# 策略示例:RSI低于30时触发买入信号
if rsi14[-1] < 30:
print("买入信号:RSI超卖区域!")
3. MACD:捕捉趋势转折
MACD由快线(DIF)、慢线(DEA)和柱状图(MACD Histogram)组成,常用于判断多空转换。
macd, signal, hist = talib.MACD(close_prices,
fastperiod=12,
slowperiod=26,
signalperiod=9)
# 金叉:MACD线上穿信号线(买入信号)
if macd[-2] < signal[-2] and macd[-1] > signal[-1]:
print(
"MACD金叉出现,建议买入!")
4. 布林带(Bollinger Bands):衡量波动率
布林带由中轨(均线)、上轨和下轨组成,价格突破轨道常被视为趋势信号。
upper, middle, lower = talib.BBANDS(close_prices,
timeperiod=20,
nbdevup=2,
nbdevdn=2)
# 价格突破上轨可能预示回调
if close_prices[-
1] > upper[-1]:
print("价格突破布林带上轨,警惕超买风险!")
# 数据获取
def get_stock_data(_symbol, start, end, period_type):
try:
df = ak.stock_zh_a_hist(
symbol=_symbol,
period=period_type,
start_date=start.strftime("%Y%m%d"),
end_date=end.strftime("%Y%m%d"),
adjust="qfq"
)
if df.empty:
return pd.DataFrame()
df['日期'] = pd.to_datetime(df['日期'])
return df.sort_values('日期').set_index('日期')
except Exception as e:
st.error(f"数据获取失败: {str(e)}")
return pd.DataFrame()
# 技术指标计算
def calculate_indicators(df):
# 均线系统
df['MA5'] = talib.SMA(df['收盘'], timeperiod=5)
df['MA10'] = talib.SMA(df['收盘'], timeperiod=10)
df['MA20'] = talib.SMA(df['收盘'], timeperiod=20)
# MACD
df['MACD'], df['MACDsignal'], df['MACDhist'] = talib.MACD(
df['收盘'], fastperiod=12, slowperiod=26, signalperiod=9)
# RSI
df['RSI14'] = talib.RSI(df['收盘'], timeperiod=14)
# KDJ
df['slowk'], df['slowd'] = talib.STOCH(
df['最高'], df['最低'], df['收盘'],
fastk_period=9, slowk_period=3, slowk_matype=0,
slowd_period=3, slowd_matype=0
)
df['slowj'
] = 3 * df['slowk'] - 2 * df['slowd']
# 布林带
df['upper'], df['middle'], df['lower'] = talib.BBANDS(df['收盘'], timeperiod=20)
# 成交量
df['VOL_MA5'] = talib.SMA(df['成交量'], timeperiod=5)
return df.dropna()
# 创建交互图表
def create_plotly_chart(df, period):
fig = make_subplots(
rows=5, cols=1,
shared_xaxes=True,
vertical_spacing=0.03,
row_heights=[0.5, 0.15, 0.15, 0.15, 0.2],
specs=[[{"secondary_y": True}], [{}], [{}], [{}], [{}]]
)
# K线图(红涨绿跌)
fig.add_trace(go.Candlestick(
x=df.index,
open=df['开盘'],
high=df['最高'],
low=df['最低'],
close=df['收盘'],
name='K线',
increasing={'line': {'color': 'red'}, 'fillcolor': 'rgba(255,0,0,0.3)'},
decreasing={'line': {'color': 'green'}, 'fillcolor': 'rgba(0,128,0,0.3)'}
), row=1, col=1)
# 均线系统
for ma, color in zip(['MA5', 'MA10', 'MA20'], ['orange', 'blue', 'purple']):
fig.add_trace(go.Scatter(
x=df.index, y=df[ma],
name=ma,
line=dict(color=color, width=1.5),
opacity=0.8
), row=1, col=1)
# MACD
colors = np.where(df['MACDhist'] > 0, 'red', 'green')
fig.add_trace(go.Bar(
x=df.index, y=df['MACDhist'],
name='MACD Hist',
marker_color=colors
), row=2, col=1)
fig.add_trace(go.Scatter(
x=df.index, y=df['MACD'],
line=dict(color='blue'),
name='MACD'
), row=2, col=1)
fig.add_trace(go.Scatter(
x=df.index, y=df['MACDsignal'],
line=dict(color='orange'),
name='Signal'
), row=2, col=1)
# RSI
fig.add_trace(go.Scatter(
x=df.index, y=df['RSI14'],
line=dict(color='purple'),
name='RSI 14'
), row=3, col=1)
fig.add_hline(y=30, line=dict(color='gray', dash='dash'), row=3, col=1)
fig.add_hline(y=70, line=dict(color='gray', dash='dash'), row=3, col=1)
# KDJ
fig.add_trace(go.Scatter(
x=df.index, y=df['slowk'],
line=dict(color='blue'),
name='K值'
), row=4, col=1)
fig.add_trace(go.Scatter(
x=df.index, y=df['slowd'],
line=dict(color='orange'),
name='D值'
), row=4, col=1)
fig.add_trace(go.Scatter(
x=df.index, y=df['slowj'],
line=dict(color='green', dash='dot'),
name='J值'
), row=4, col=1)
fig.add_hline(y=20, line=dict(color='gray', dash='dash'), row=4, col=1)
fig.add_hline(y=80, line=dict(color='gray', dash='dash'), row=4, col=1)
# 成交量
colors = np.where(df['收盘'] > df['开盘'], 'red', 'green')
fig.add_trace(go.Bar(
x=df.index, y=df['成交量'],
name='成交量',
marker_color=colors,
opacity=0.7
), row=5, col=1)
fig.add_trace(go.Scatter(
x=df.index, y=df['VOL_MA5'],
line=dict(color='orange'),
name='成交量MA5'
), row=5, col=1)
# 布局设置
fig.update_layout(
height=1200,
title=f'{symbol} {period}级别技术分析',
font=CHINESE_FONT,
showlegend=True,
xaxis_rangeslider_visible=False,
hovermode="x unified"
)
# Y轴标签
yaxis_labels = ["价格", "MACD", "RSI", "KDJ", "成交量"]
for i, label in enumerate(yaxis_labels, 1):
fig.update_yaxes(title_text=label, row=i, col=1)
return fig
完整代码这里我不就贴了。 说下原因, 这次代码用到了ta-lib,如果ta-lib自己解决不了安装问题,就不要折腾了。 就像我之前文章提供的代码用到node、pywencai, 我真的没有时间精力 一步步手把手教怎么安装,况且我还提供了文章答疑。 说实话, 我分享的知识是无偿的, 没必要最后像 东郭先生和狼那样, 我不帮人一步步免费安装并且运行起来,最后惹一身骚。今天遇到很坑的事情, 微信账号不知道什么情况还被人投诉了,申诉后才解锁。 难道免费分享是原罪?最后,想要完整代码比较简单, 对这篇文章进行点赞分享且在看就可以(最近文章阅读量不佳, 掺杂点私心,增加点阅读量) , 如果不想让人看到 随意打赏也行(美股今天晚上大跌, A股明天貌似有抄底机会,正好加仓为国护盘)。 到时候 微信截图联系我就行。免费、付费的形式二选一就可以, 突然觉得自己就是个天才