有时候,市场的情绪会演绎到比较夸张的位置,其实很简单的指标就可以量化,比如过去20个交易日的累计涨跌幅,同时计算过去滚动涨跌幅的分位数就大致可以判断市场情绪。
import datetime
from WindPy import w
import pandas as pd
import matplotlib.pyplot as plt
%matplotlib inline
# 启动Wind开放接口
w.start()
def s_plot(code, start_date):
# 获取沪深300指数上市以来的行情数据
wind_df = w.wsd(code, "close", start_date, datetime.date.today().strftime("%Y-%m-%d"))
tpd_df = pd.DataFrame(wind_df.Data[0], columns=['close'])
tpd_df.index = wind_df.Times
tpd_df['shift_close'] = tpd_df['close'].shift(1)
tpd_df['daily_return'] = tpd_df['close'] / tpd_df['shift_close'] - 1
rolling_20day_return = tpd_df['daily_return'].rolling(20).apply(lambda x:(x+1).prod())
analysis_df = pd.DataFrame(rolling_20day_return)
analysis_df['0.025_bot'] = analysis_df['daily_return'].quantile(0.0255)
analysis_df['0.05_bot'] = analysis_df['daily_return'].quantile(0.05)
analysis_df['0.95_bot'] = analysis_df['daily_return'].quantile(0.95)
analysis_df['0.975_bot'] = analysis_df['daily_return'].quantile(0.975)
analysis_df['close'] = tpd_df['close']
# plt.figure()
# analysis_df['daily_return'].hist(bins=200, figsize=(19, 9))
# plt.show()
print('current code is : %s' % code)
plt.figure()
analysis_df[['daily_return', '0.025_bot', '0.05_bot', '0.95_bot', '0.975_bot']].plot(figsize=(19, 9))
plt.show()
plt.figure()
analysis_df['close'].plot(figsize=(19, 9))
plt.show()
base_code = ['UR', 'AU', 'IM', 'IC', 'IH', 'AG', 'AP', 'SM', 'JD', 'IF', 'PB', 'SA', 'TS', 'SI', 'CJ', 'TF', 'CY', 'RS', 'T', 'PK', 'CF', 'SF', 'C',
'CS', 'CU', 'LH', 'SS', 'L', 'SN', 'PP', 'AL', 'MA', 'PG', 'NI', 'V', 'RU', 'SP', 'SR', 'A','M','B','ZN', 'Y', 'RB','EB','HC','PF',
'FG', 'TA','BU','EG', 'OI','P','RM','JM', 'I', 'J', 'LU', 'SC','FU']
start_date = '2015-01-01'
for code in base_code:
s_plot('%sFI.WI'% code, start_date)
例如下面的黄金为例,在4月中旬,由于市场对联储加息的预期几乎就一致认为5月是最后一次加息,随后就会开始降息;同时美国的银行风险事件也让市场买入黄金进行避险。我们可以看到,黄金的近20个交易日涨幅来到了0.95以上的分位数,很显然,这个时候如果追高就要考虑是不是短期会有回调的压力 了。