量化投资指标

TA-LIB-内置 150 量化指标计算器

1 常见缩写

  • Time lags:过去时间点的特征,有不同的时间窗口
  • MA(Moving Average):移动平均
  • EMA(Exponential moving average):指数移动平均
  • SMA(Simple Moving Average):简单移动平滑
# Moving Averages Code

# Load the necessary packages and modules
import pandas as pd
import pandas.io.data as web
import matplotlib.pyplot as plt

# Simple Moving Average 
def SMA(data, ndays): 
 SMA = pd.Series(pd.rolling_mean(data['Close'], ndays), name = 'SMA') 
 data = data.join(SMA) 
 return data

# Exponentially-weighted Moving Average 
def EWMA(data, ndays): 
 EMA = pd.Series(pd.ewma(data['Close'], span = ndays, min_periods = ndays - 1), 
 name = 'EWMA_' + str(ndays)) 
 data = data.join(EMA) 
 return data

# Retrieve the Nifty data from Yahoo finance:
data = web.DataReader('^NSEI',data_source='yahoo',start='1/1/2013', end='1/1/2016')
data = pd.DataFrame(data) 
close = data['Close']

# Compute the 50-day SMA for NIFTY
n = 50
SMA_NIFTY = SMA(data,n)
SMA_NIFTY = SMA_NIFTY.dropna()
SMA = SMA_NIFTY['SMA']

# Compute the 200-day EWMA for NIFTY
ew = 200
EWMA_NIFTY = EWMA(data,ew)
EWMA_NIFTY = EWMA_NIFTY.dropna()
EWMA = EWMA_NIFTY['EWMA_200']

# Plotting the NIFTY Price Series chart and Moving Averages below
plt.figure(figsize=(9,5))
plt.plot(data['Close'],lw=1, label='NSE Prices')
plt.plot(SMA,'g',lw=1, label='50-day SMA (green)')
plt.plot(EWMA,'r', lw=1, label='200-day EWMA (red)')
plt.legend(loc=2,prop={'size':11})
plt.grid(True)
plt.setp(plt.gca().get_xticklabels(), rotation=30)

2 基础指标

  • $(P_{open}^{t}-P_{open}^{t-1})/P_{open}^{t}$:开盘价波动率

  • $(P_{high}^{t-1}-P_{high}^{t-2})/P_{high}^{t-1}$:最高价波动率

  • $(P_{low}^{t-1}-P_{low}^{t-2})/P_{low}^{t-1}$:最低价波动率

  • $(V_{open}^{t}-V_{open}^{t-1})/V_{open}^{t}$:开盘量波动率

  • $(V_{high}^{t-1}-V_{high}^{t-2})/V_{high}^{t-1}$:最高量波动率

  • $(V_{low}^{t-1}-V_{low}^{t-2})/V_{low}^{t-1}$:最低量波动率

  • $PH_{\lambda}^{t}=\mathop{max}\limits_{t-\lambda\leq i\leq t-1}P_{high}^{i}$:近期最高价

  • $PL_{\lambda}^{t}=\mathop{min}\limits_{t-\lambda\leq i\leq t-1}P_{low}^{i}$:近期最低价

  • $VH_{\lambda}^{t}=\mathop{max}\limits_{t-\lambda\leq i\leq t-1}V_{high}^{i}$:近期最高交易量

  • $VL_{\lambda}^{t}=\mathop{min}\limits_{t-\lambda\leq i\leq t-1}V_{low}^{i}$:近期最低交易量

  • $\frac{(P_{open}^{(t)})-(P_{open}^{(t-1)})}{PH_{\lambda}^{t}-PL_{\lambda}^{t}}$:开盘价波动与近期价格最值波动占比

  • $\frac{(V_{open}^{(t)})-(V_{open}^{(t-1)})}{VH_{\lambda}^{t}-VL_{\lambda}^{t}}$:开盘量波动与近期交易量最值波动占比

3 常见经济指标

常见经济指数

  • Crude Oil(原油)
  • Gold Price (黄金价格)

4 常见股指

常见股指:

  • S&P500(标普500)
  • DJLA(道琼斯工业平均指数)
  • Nikki(日经平均指数)
  • FTSE(富时100指数)
  • SSE(上海证券交易所综合股价指数)
  • STI(新加坡海峽時報指數)
  • NASDAQ(纳斯达克综合指数)

5 常见汇率

货币流动比率 CNY USD 人民币/美元 JPY USD 日元/美元 Euro USD 欧元/美元 AUD USD 澳元/美元

6 MTM 动量指标

动量指标(Momentum,简称MTM),也叫ROC(Rate of Change),是一种测量涨跌速率的技术指标

MTM的计算是利用“恒速原则”来判断涨跌速率的高低;“恒速原则”是指涨势中的每一段时涨幅相等,跌势中的每一段时间跌幅也应一致。

MTM简易计算方法 $$MTM_t=Price_t/Price_{t-n} -1$$

MTM简易判读方式

  • 0(零)值为中轴线(X轴)。
  • MTM值上升,且MTM的10日移动平均值由负转正时,为买进讯号。
  • MTM值下降,且MTM的10日移动平均值由正转负时,为卖出讯号。
# Rate of Change code

# Load the necessary packages and modules
import pandas as pd
import pandas.io.data as web
import matplotlib.pyplot as plt

# Rate of Change (ROC)
def ROC(data,n):
    N = data['Close'].diff(n)
    D = data['Close'].shift(n)
    ROC = pd.Series(N/D,name='Rate of Change')
    data = data.join(ROC)
    return data 

# Retrieve the NIFTY data from Yahoo finance:
data = web.DataReader('^NSEI',data_source='yahoo',start='6/1/2015',end='1/1/2016')
data = pd.DataFrame(data)

# Compute the 5-period Rate of Change for NIFTY
n = 5
NIFTY_ROC = ROC(data,n)
ROC = NIFTY_ROC['Rate of Change']

# Plotting the Price Series chart and the Ease Of Movement below
fig = plt.figure(figsize=(7,5))
ax = fig.add_subplot(2, 1, 1)
ax.set_xticklabels([])
plt.plot(data['Close'],lw=1)
plt.title('NSE Price Chart')
plt.ylabel('Close Price')
plt.grid(True)
bx = fig.add_subplot(2, 1, 2)
plt.plot(ROC,'k',lw=0.75,linestyle='-',label='ROC')
plt.legend(loc=2,prop={'size':9})
plt.ylabel('ROC values')
plt.grid(True)
plt.setp(plt.gca().get_xticklabels(), rotation=30)

#MTM #ROC #动量指标 #Momentum

7 BOLL指标

布林带(英语:Bollinger Bands,略称:BBands)是由美国作家、金融分析师约翰·包宁杰(John Bollinger)在1980年代发明的技术分析工具,通过该工具,投资者可以看到金融工具或商品的价格如何随著时间而波动。该工具结合了移动平均和标准差的概念,其基本的型态是由三条轨道线组成的带状通道(中轨和上、下轨各一条)。“中轨”为股价的平均成本,“上轨”和“下轨”可分别视为股价的压力线和支撑线。

“布林带”的简单计算:

  • 中轨 = N时间段的简单移动平均线
  • 上轨 = 中轨 + K × N时间段的标准差
  • 下轨 = 中轨 − K × N时间段的标准差

一般情况下,设定N=20和K=2

################ Bollinger Bands #############################

# Load the necessary packages and modules
import pandas as pd
import pandas.io.data as web

# Compute the Bollinger Bands 
def BBANDS(data, ndays):

    MA = pd.Series(pd.rolling_mean(data['Close'], ndays)) 
    SD = pd.Series(pd.rolling_std(data['Close'], ndays))

    b1 = MA + (2 * SD)
    B1 = pd.Series(b1, name = 'Upper BollingerBand') 
    data = data.join(B1) 

    b2 = MA - (2 * SD)
    B2 = pd.Series(b2, name = 'Lower BollingerBand') 
    data = data.join(B2) 

    return data

# Retrieve the Nifty data from Yahoo finance:
data = web.DataReader('^NSEI',data_source='yahoo',start='1/1/2010', end='1/1/2016')
data = pd.DataFrame(data)

# Compute the Bollinger Bands for NIFTY using the 50-day Moving average
n = 50
NIFTY_BBANDS = BBANDS(data, n)
print(NIFTY_BBANDS)

#布林通道 #保力加通道 #包宁杰带状 #布历加通道 #布林带 #BOLL #BBands #压力线 #支撑线

8 CCI指标

CCI (Commodity Channel Index) 计算方法

  • CCI可以用来确定超买和超卖水平。
  • 高于100可能意味着超买,而低于−100可能意味着超卖。当证券处于超买/超卖水平时,证券价格很有可能出现回调,当然也有可能继续之前走势~
  • CCI和价格还可以构成背离信号,当价格处于较低位置而CCI相对偏高时,则出现看涨背离,意味着下跌势头减弱;当价格处于较高位置而CCI相对偏低时,则出现看跌背离,意味着上涨势头减弱。
# Load the necessary packages and modules
import pandas as pd
import pandas.io.data as web
import matplotlib.pyplot as plt
# Commodity Channel Index 
def CCI(data, ndays): 
    TP = (data['High'] + data['Low'] + data['Close']) / 3 
    CCI = pd.Series((TP - pd.rolling_mean(TP, ndays)) / (0.015 * pd.rolling_std(TP, ndays)),
    name = 'CCI') 
    data = data.join(CCI) 
    return data

# Retrieve the Nifty data from Yahoo finance:
data = web.DataReader('^NSEI',data_source='yahoo',start='1/1/2014', end='1/1/2016')
data = pd.DataFrame(data)

# Compute the Commodity Channel Index(CCI) for NIFTY based on the 20-day Moving average
n = 20
NIFTY_CCI = CCI(data, n)
CCI = NIFTY_CCI['CCI']

# Plotting the Price Series chart and the Commodity Channel index below
fig = plt.figure(figsize=(7,5))
ax = fig.add_subplot(2, 1, 1)
ax.set_xticklabels([])
plt.plot(data['Close'],lw=1)
plt.title('NSE Price Chart')
plt.ylabel('Close Price')
plt.grid(True)
bx = fig.add_subplot(2, 1, 2)
plt.plot(CCI,'k',lw=0.75,linestyle='-',label='CCI')
plt.legend(loc=2,prop={'size':9.5})
plt.ylabel('CCI values')
plt.grid(True)
plt.setp(plt.gca().get_xticklabels(), rotation=30)

#CCI

9 EMV指标

EMV (Ease of Movement)计算方法

  • EVM考虑到价格上涨或下跌的容易程度与证券交易量的关系。
  • 例如,低成交量下的价格上涨意味着价格上涨相对轻松,几乎没有卖出压力。
  • EVM值为正值意味着市场走高没什么压力,而负值则表明市场可能很容易下跌。
# Load the necessary packages and modules
import pandas as pd
import pandas.io.data as web
import matplotlib.pyplot as plt

# Ease of Movement 
def EVM(data, ndays): 
    dm = ((data['High'] + data['Low'])/2) - ((data['High'].shift(1) + data['Low'].shift(1))/2)
    br = (data['Volume'] / 100000000) / ((data['High'] - data['Low']))
    EVM = dm / br 
    EVM_MA = pd.Series(pd.rolling_mean(EVM, ndays), name = 'EVM') 
    data = data.join(EVM_MA) 
    return data 

# Retrieve the AAPL data from Yahoo finance:
data = web.DataReader('AAPL',data_source='yahoo',start='1/1/2015', end='1/1/2016')
data = pd.DataFrame(data)

# Compute the 14-day Ease of Movement for AAPL
n = 14
AAPL_EVM = EVM(data, n)
EVM = AAPL_EVM['EVM']

# Plotting the Price Series chart and the Ease Of Movement below
fig = plt.figure(figsize=(7,5))
ax = fig.add_subplot(2, 1, 1)
ax.set_xticklabels([])
plt.plot(data['Close'],lw=1)
plt.title('AAPL Price Chart')
plt.ylabel('Close Price')
plt.grid(True)
bx = fig.add_subplot(2, 1, 2)
plt.plot(EVM,'k',lw=0.75,linestyle='-',label='EVM(14)')
plt.legend(loc=2,prop={'size':9})
plt.ylabel('EVM values')
plt.grid(True)
plt.setp(plt.gca().get_xticklabels(), rotation=30)

#EMV

10 FI指数

FI(ForceIndex)计算方法

  • FI指数考虑了股票价格的走向、股价运动的程度和成交量,形成一个衡量买卖压力的振荡器。
  • 例如,价格的大幅上涨(由价格运动的程度给出)表明存在强大的买入压力。成交量大的情况下出现大幅下跌,表明抛售压力很大
################# Force Index ########################################################

# Load the necessary packages and modules
import pandas as pd
import pandas.io.data as web

# Force Index 
def ForceIndex(data, ndays): 
    FI = pd.Series(data['Close'].diff(ndays) * data['Volume'], name = 'ForceIndex') 
    data = data.join(FI) 
    return data


# Retrieve the Apple data from Yahoo finance:
data = web.DataReader('AAPL',data_source='yahoo',start='1/1/2010', end='1/1/2016')
data = pd.DataFrame(data)

# Compute the Force Index for Apple 
n = 1
AAPL_ForceIndex = ForceIndex(data,n)
print(AAPL_ForceIndex)

#FI #ForceIndex #强力指数

其他补充:https://school.stockcharts.com/doku.php?id=technical_indicators

11 夏普指数

$$Sharp = \frac{E[R_a-R_0]}{\sigma_a}$$

  • $R_a$表示资产A的收益率;而$R_0$表示无风险收益率
  • 夏普值代表投资者额外承受的每一单位风险所获得的额外收益

#夏普指数 #夏普比率 #夏普值 #SharpIndex #SharpRate

12 价格动量 PMI

PMI 是根据 5、10、20、30、40、50、60和75 天移动均线构建的衡量价格势头强弱的指标

  • 若 ETF 收盘价格大于所有价格均线,上涨势头明显,那么 PMI 取值为 100
  • 若 ETF 收盘价格小于所有价格均线,下跌趋势已经形成,那么 PMI 取值为-10
  • 若收盘价格处于价格均线之间,当收盘价格仅大于 75 日均线时,PMI 值为-100 加上25;
  • 当收盘价大于 75 日均线且大于60 日均线时,PMI 值为-100 加上50:
  • 当收盘价格大于 75 日、60 日、50 日均线时PMI值为-100 加上75
  • 以此。PMI 越大,未来股票价格持续上涨的势头越强

$$ \left.s_{i,t}= \left\{\begin{array}{ll}20&if::tclose>MA_{t,k} \\0,&other\end{array}\right.\right. \ \ \ \ where \ \mathrm{ k~= 5, 10, 20, 30, 40, 50, 60, 75} $$

$$PMI_{t}=\sum_{i=1}^{n}s_{i,t}-100\ \ \ where \ \ \ 0<\mathrm{i}<10,\mathrm{i}\in\mathbb{N}^{*} $$

其中$tclose$是指收盘价,$MA$是指移动平均线

13 拥挤度

拥挤度是指投资者对某个资产或投资策略的集中程度

  • 当有大量投资者涌向同一类资产时,就会导致该资产或投资策略的拥挤度增加
  • 拥挤度增加可能导致市场出现错误定价的情况,因为投资者会受到追涨杀跌的非理性分析驱动
  • 高拥挤度也可能导致流动性风险和操作风险增加,因为当投资者纷纷想要退出时,市场可能没有足够的买家来接手这些投资者的头寸,从而导致价格下跌
  • 对于投资者来说,了解拥挤度可以帮助他们更好地管理风险,避免盲目跟风

拥挤度为当前 ETF 份额在过去 60 个交易日的历史分位数,历史分位数越高,拥挤程度越价格下跌的可能性及程度越大。计算公式如下: $$\begin{aligned}z_i&=1-1_{yr} \\ \\w_i&=\frac{z_i}{\sum_{i=1}^nz_i}\end{aligned}$$

14 MACD

MACD (Moving Average Convergence Divergence)指标由一组曲线与图形组成,通过收盘时股价或指数的快变及慢变的指数移动平均值(EMA)之间的差计算出来。“快”指更短时段的 EMA,而“慢”则指较长时段的 EMA,最常用的是 12 日及 26 日的 EMA

15 RSI

相对强度指数(Relative Strength Index),通过指定阈值生成市场看涨和看跌势头的信号。如果 RSI 大于 70%,则资产超买;如果低于 30%,则资产不足

往年同期文章