我有一个非常简单的VIX (S&P 500 1个月隐含波动率指数)“制度”代码,其代码如下:
换句话说,颜色不仅取决于当前状态,而且是在价格超过或低于上述边界时设置和持有的。
我的代码附在下面。非常感谢。
import datetime as datetime
import pandas as pd
import numpy as np
import pandas_datareader.data as web
import matplotlib.pyplot as plt
import warnings
warnings.filterwarnings("ignore")
#%matplotlib inline
df = web.DataReader('^VIX', 'yahoo',datetime.datetime(2016 ,1, 1), datetime.datetime.today())
df = df.drop(df.columns[[0, 1, 2,3,5]], axis=1)
df1 = web.DataReader('spy', 'yahoo',datetime.datetime(2016 ,1, 1), datetime.datetime.today())
df1.rename(columns={'Adj Close': 'SPY'}, inplace=True)
df1 = df1.drop(df1.columns[[0, 1, 2,3,5]], axis=1)
df = pd.merge(df, df1, left_index=True, right_index=True)
df.reset_index(inplace=True)
plt.style.use('seaborn-white')
plt.rcParams["font.family"] = "Times"
plt.figure(figsize=(23,12))
ax1 = plt.subplot2grid((14,1), (0,0), rowspan=10, colspan=7)
plt.title('VIX Risk Off Indicator')
ax3 = ax1.twinx()
ax2 = plt.subplot2grid((14,1), (10,0), rowspan=4, colspan=7,sharex=ax1)
ax2.grid(False)
ax1.grid(False)
ax1.xaxis.set_visible(False)
ax1.legend()
df['16.5'] = np.where(np.logical_and(df['Adj Close'] >= 16.5,df['Adj Close'] <= 19.5),'yes','no')
df['19.5'] = np.where(np.logical_and(df['Adj Close'] >= 19.5,df['Adj Close'] >= 19.5),'yes','no')
df['l19.5'] = np.where(np.logical_and(df['Adj Close'] <= 19.5,df['Adj Close'] >= 16.5),'yes','no')
markers1 = [idx for idx,close in enumerate(df['16.5']) if close == 'yes']
for marker in markers1:
ax1.axvline(marker, color='red',linewidth=1,alpha=.15)
markers1 = [idx for idx,close in enumerate(df['19.5']) if close == 'yes']
for marker in markers1:
ax1.axvline(marker, color='green',linewidth=1,alpha=.5)
markers1 = [idx for idx,close in enumerate(df['l19.5']) if close == 'yes']
for marker in markers1:
ax1.axvline(marker, color='cyan',linewidth=1,alpha=.05)
ax1.plot(df['SPY'],label='SPY', lw=1,color='black')
ax2.plot(df['Adj Close'],'black', label='VIX', lw=1)
ax2.grid(False)
ax2.legend()
pdffile = ('C://VIX.pdf')
plt.savefig(pdffile, format='pdf',transparent=False,bbox_inches='tight')
plt.show()
plt.close()
plt.close("all") 发布于 2018-02-13 03:55:53
这里有一些代码可以让你开始。在未来,它会帮助你把你的例子缩减到一些更小的东西上,并把你想要做的事情完全分离出来。
下面我创建政权国家的方式是使用“触发器”而不是“国家”。触发器的存在取决于第一天VIX的级别,但也取决于第一天的VIX级别。这些触发器可以向前填充,直到下一个触发器出现。
import pandas as pd
import pandas_datareader as pdr
import numpy as np
import matplotlib.pyplot as plt
vix = pdr.DataReader('VIXCLS', 'fred').dropna().squeeze()
lower, upper = 16.5, 19.5
# Each term inside parentheses is [False, True, ...]
# Both terms must be True element-wise for a trigger to occur
blue = (vix < upper) & (vix.shift() >= upper)
yellow = (vix < lower) & (vix.shift() >= lower)
green = (vix > upper) & (vix.shift() <= upper)
red = (vix > lower) & (vix.shift() <= lower)
mapping = {1: 'blue', 2: 'yellow', 3: 'green', 4: 'red'}
indicator = pd.Series(np.where(blue, 1., np.where(yellow, 2.,
np.where(green, 3., np.where(red, 4., np.nan)))),
index=vix.index).ffill().map(mapping).dropna()
vix = vix.reindex(indicator.index)
plt.scatter(vix.index, vix, c=indicator, marker='*')
plt.title('VIX regime')
plt.ylabel('VIX')

一旦获得状态,就可以查看从matplotlib文档绘制多色行的这示例。祝好运。
https://stackoverflow.com/questions/48758427
复制相似问题