Skip to main content

Các Chỉ Báo Kỹ Thuật Phổ Biến

· 3 min read

Trong bài viết này, chúng ta sẽ tìm hiểu về các chỉ báo kỹ thuật phổ biến được sử dụng trong phân tích kỹ thuật.

Các chỉ báo kỹ thuật phổ biến

Chỉ Báo Xu Hướng

1. Moving Average

import pandas as pd
import numpy as np

class MovingAverage:
def __init__(self, period=20, ma_type='SMA'):
self.period = period
self.ma_type = ma_type

def calculate(self, df):
if self.ma_type == 'SMA':
return df['close'].rolling(window=self.period).mean()
elif self.ma_type == 'EMA':
return df['close'].ewm(span=self.period, adjust=False).mean()
elif self.ma_type == 'WMA':
weights = np.arange(1, self.period + 1)
return df['close'].rolling(window=self.period).apply(
lambda x: np.sum(weights * x) / weights.sum(), raw=True
)

2. MACD

class MACD:
def __init__(self, fast_period=12, slow_period=26, signal_period=9):
self.fast_period = fast_period
self.slow_period = slow_period
self.signal_period = signal_period

def calculate(self, df):
# Tính toán MACD
exp1 = df['close'].ewm(span=self.fast_period, adjust=False).mean()
exp2 = df['close'].ewm(span=self.slow_period, adjust=False).mean()
macd = exp1 - exp2
signal = macd.ewm(span=self.signal_period, adjust=False).mean()
histogram = macd - signal

return pd.DataFrame({
'MACD': macd,
'Signal': signal,
'Histogram': histogram
})

Chỉ Báo Động Lực

1. RSI

class RSI:
def __init__(self, period=14):
self.period = period

def calculate(self, df):
# Tính toán RSI
delta = df['close'].diff()
gain = (delta.where(delta > 0, 0)).rolling(window=self.period).mean()
loss = (-delta.where(delta < 0, 0)).rolling(window=self.period).mean()
rs = gain / loss
rsi = 100 - (100 / (1 + rs))

return rsi

2. Stochastic Oscillator

class StochasticOscillator:
def __init__(self, k_period=14, d_period=3):
self.k_period = k_period
self.d_period = d_period

def calculate(self, df):
# Tính toán Stochastic
low_min = df['low'].rolling(window=self.k_period).min()
high_max = df['high'].rolling(window=self.k_period).max()

k = 100 * ((df['close'] - low_min) / (high_max - low_min))
d = k.rolling(window=self.d_period).mean()

return pd.DataFrame({
'K': k,
'D': d
})

Chỉ Báo Biến Động

1. Bollinger Bands

class BollingerBands:
def __init__(self, period=20, std_dev=2):
self.period = period
self.std_dev = std_dev

def calculate(self, df):
# Tính toán Bollinger Bands
middle_band = df['close'].rolling(window=self.period).mean()
std = df['close'].rolling(window=self.period).std()

upper_band = middle_band + (std * self.std_dev)
lower_band = middle_band - (std * self.std_dev)

return pd.DataFrame({
'Middle': middle_band,
'Upper': upper_band,
'Lower': lower_band
})

2. ATR

class ATR:
def __init__(self, period=14):
self.period = period

def calculate(self, df):
# Tính toán ATR
high_low = df['high'] - df['low']
high_close = np.abs(df['high'] - df['close'].shift())
low_close = np.abs(df['low'] - df['close'].shift())

ranges = pd.concat([high_low, high_close, low_close], axis=1)
true_range = np.max(ranges, axis=1)

atr = true_range.rolling(window=self.period).mean()

return atr

Chỉ Báo Khối Lượng

1. OBV

class OBV:
def calculate(self, df):
# Tính toán OBV
obv = pd.Series(0.0, index=df.index)

for i in range(1, len(df)):
if df['close'].iloc[i] > df['close'].iloc[i-1]:
obv.iloc[i] = obv.iloc[i-1] + df['volume'].iloc[i]
elif df['close'].iloc[i] < df['close'].iloc[i-1]:
obv.iloc[i] = obv.iloc[i-1] - df['volume'].iloc[i]
else:
obv.iloc[i] = obv.iloc[i-1]

return obv

2. Money Flow Index

class MoneyFlowIndex:
def __init__(self, period=14):
self.period = period

def calculate(self, df):
# Tính toán Money Flow Index
typical_price = (df['high'] + df['low'] + df['close']) / 3
money_flow = typical_price * df['volume']

positive_flow = pd.Series(0.0, index=df.index)
negative_flow = pd.Series(0.0, index=df.index)

for i in range(1, len(df)):
if typical_price.iloc[i] > typical_price.iloc[i-1]:
positive_flow.iloc[i] = money_flow.iloc[i]
else:
negative_flow.iloc[i] = money_flow.iloc[i]

positive_mf = positive_flow.rolling(window=self.period).sum()
negative_mf = negative_flow.rolling(window=self.period).sum()

mfi = 100 - (100 / (1 + positive_mf / negative_mf))

return mfi

Best Practices

  1. Kết hợp nhiều chỉ báo
  2. Xác định thời gian phù hợp
  3. Tránh tín hiệu nhiễu
  4. Theo dõi xu hướng chính
  5. Quản lý rủi ro

Kết luận

Các chỉ báo kỹ thuật là công cụ quan trọng trong phân tích thị trường. Tuy nhiên, cần sử dụng chúng một cách hợp lý và kết hợp với các phương pháp phân tích khác để đạt hiệu quả tốt nhất.