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)
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)
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)
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)
其他补充: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%,则资产不足