趋势预测:基于期货未平仓合约、展期和FII/DII指标

发布于: 雪球转发:0回复:0喜欢:0

01 引言

2020 年一季度是二战后最具挑战性的时期之一, 由于地缘政治原因导致的油价暴跌和 COVID-19 全球大流行是主要主题。金融市场充当风向标,可以反映世界经济的整体情绪。这些情绪不仅反映在价格上,还反映在其他指标上,例如未平仓合约、展期百分比、FII/DII 活动。本文将使用Python分析印度领先的大盘指数 Nifty 50 的上述三个重要指标。

02 趋势分析

1.1 导入Python库

在开始使用 Python 进行任何分析之前,我们需要导入所需的库。我们将使用流行的库,如 pandas、NumPy 和Matplotlib(用于可视化),下面让我们导入它们。

import pandas as pd
import numpy as np
from datetime import datetime
import matplotlib.pyplot as plt
%matplotlib inline
plt.style.use('seaborn-darkgrid')

import warnings
warnings.simplefilter('ignore')

1.2 Nifty 50 期货

Nifty 50是一个涵盖范围广泛、多样化的指数,包含了代表印度经济13个板块的50只股票。它是在美国国家证券交易所(NSE)交易的Nifty 50期货合约的基础。

在任何时候,只有三个漂亮的可交易的期货合约——近月(I),下个月(2)和(3)远月。每个合同都有一个生活的三个月,期满到期月份的最后一个星期四,在这一份新合同为三个月的时间了。如果一个月的第三个星期四是假日,则合约在前一个交易日到期。

1.3 数据获取

下面是获取 Nifty 期货数据。Nifty 期货的当前和历史数据都可以从所谓的股票衍生品“Bhavcopy”免费获得。股票衍生品 Bhavcopy 是由交易所(NSE官网)提供的文件,其中包含有关在交易所交易的各种股票和股票指数衍生品的所有信息。此类数据可从 NSE 网站获得。或者,经纪人或数据供应商可以向他们的客户提供此类数据。

交易所每天发布一个 Bhavcopy 文件,它可以作为 csv 文件下载。在这里,我们下载了 2020 年第一季度的所有此类文件,即从 2020 年 1 月 1 日至 2020 年 3 月 31 日进行此分析。然后,我们使用以下代码将其转换为pandas DataFrame 格式:

# Fetching NIFTY futures data from bhavcopy files and storing it into a DataFrame

dates = [str(x) if x>=10 else '0'+str(x) for x in range(1, 32)]
months = [str(x) if x>=10 else '0'+str(x) for x in range(1, 13)]
years = [2020]

data = pd.DataFrame(columns=['<ticker>', '<date>',   '<open>', '<high>', '<low>', '<close>', '<volume>', '<o/i>'])
df = pd.DataFrame()

for year in years:
    for month in months:
        for date in dates:
            filename = f'{year}-{month}-{date}-NSE-FO.txt'
            try:
                df = pd.read_csv(filename)
                data = data.append(df.iloc[3:6], ignore_index=True)
            except:
                pass

# Keeping only the required columns and renaming them
data=data[['<ticker>', '<date>', '<close>', '<volume>', '<o/i>']]
data.columns=['ticker', 'date', 'close', 'volume', 'oi']

#converting date column elements into datetime object from integers and making the Date as the index
Date=[]
a= data['date']

for i in range(len(a)):
    c=str(a[i])
    b= datetime(year=int(c[0:4]), month=int(c[4:6]), day=int(c[6:8]))
    Date.append(b)

data['Date']=Date     
data.set_index('Date',drop=True,inplace=True)
data.drop(['date'],axis=1,inplace=True)

data.head()


上面的 DataFrame 'data' 有四列,包含代码名称(Nifty I、II 或 III)、收盘价、交易量和每日持仓量。因此,我们拥有在 2020 年第一季度进行此分析所需的所有信息。

在下一节中,我们可以继续可视化和分析这些信息。

1.4 价格走势分析

在为分析准备好数据之后,让我们在图中绘制期货的价格序列。由于到期日影响期货的行为,我们用垂直的红线标出了到期日。

#plotting close prices for NIFTY futures
data['close'].groupby(data['ticker']).plot(figsize=(15,7))
plt.title(' Close prices for NSE NIFTY50 futures in the first quarter of 2020 \n (Note: red lines mark the expiry dates)'\
         ,fontsize ='xx-large')
plt.axvline(datetime(2020, 1, 30), color='r') # Jan expiry
plt.axvline(datetime(2020, 2, 27),color='r') # Feb expiry
plt.axvline(datetime(2020, 3, 26),color='r') # March expiry
plt.legend()
plt.show()


我们可以观察到,在 COVID-19 大流行加剧之后,Nifty 50 期货在 1 月和 2 月保持在接近 12000 的水平,并在 3 月(尤其是 3 月到期之后)暴跌近 40%。在 3 月 23 日(仅在 3 月到期前三天)触及近期低点 7581 之后,价格在 3 月底和 4 月开始盘整。

1.5 价格与成交量分析

下面用交易量来分析价格。成交量的增加意味着市场参与者的兴趣增加,但它本身并不能说明未来趋势的方向。因此我们结合当前价格趋势对其进行分析,作为未来价格趋势的指标。

一般来说,如果价格上涨伴随着高于平均成交量,则表明动能仍然较高,价格可以继续上涨。同样,如果价格下跌伴随着高于平均成交量,则表明下跌势头。

但是,如果价格上涨或下跌伴随着低于平均成交量,则表明上涨/下跌势头正在失去动力,逆转即将到来。让我们查看一下 2020 年第一季度 Nifty 50 期货的价格动态。

# price vs volume analysis

ax =data['volume'].groupby(data.index).sum().plot(figsize=(15,7), color='black')

plt.ylabel('Volume traded in number of contracts',fontsize='x-large')
plt.title(' Price vs volume \n (Note: red lines mark the expiry dates)',fontsize ='xx-large')

plt.axvline(datetime(2020, 1, 30), color='r') #expiry1
plt.axvline(datetime(2020, 2, 27),color='r')
plt.axvline(datetime(2020, 3, 26),color='r')

plt.axvline(datetime(2020, 3, 13),color='black', ls=':', ymax=0.95)


data[data['ticker']=='NIFTY-I']['close'].plot(ax=ax, secondary_y=True,color='b')
plt.ylabel('Close prices Nifty',fontsize='x-large')
plt.legend()
plt.show()


在3月份,我们可以观察到平均交易量的大幅增加以及价格的暴跌,这表明下行势头正在增强。交易量在3月13日飙升至超过70万份合约的高点(虚线所示),给了交易者做空的确认。3月到期后,成交量似乎回到了平均水平,表明在大幅波动之后,短期盘整阶段的开始。

然而,我们可以看到,直到3月初,无论是价格还是成交量都没有显示出任何即将到来的迹象。它没有告诉我们,在新冠肺炎和其他因素发生后,大公司是如何在市场中定位自己的。这就是要用到未平仓头寸分析的地方,我们将在下一节中讨论。

1.6 持仓量分析(Open interest analysis)


期货等衍生品的未平仓合约是未结算合约的总数,即那些尚未结算的期货合约。与成交量不同,未平仓不考虑每一次买卖。高未平仓量反映了投资者的高兴趣,因此被用作预测价格趋势的指标。对未平仓头寸进行分析是衍生品交易员在进行任何新头寸之前的一种过滤方法。

在下面的图中,我们绘制了2020年第一季度所有三个系列Nifty期货的联合未平仓头寸。

#plotting open interest across all three series
data['oi'].groupby(data.index).sum().plot(figsize=(15,7),color='g')
plt.title(' Open interest in NSE NIFTY50 futures in the first quarter of 2020 \n (Note: red lines mark the expiry dates)'\
         ,fontsize ='xx-large')
plt.ylabel('Open interest in crores of contracts',fontsize='x-large')
plt.axvline(datetime(2020, 1, 30), color='r') #expiry1
plt.axvline(datetime(2020, 2, 27),color='r')
plt.axvline(datetime(2020, 3, 26),color='r')
plt.legend()
plt.show()


在上图中,我们可以清楚地看到,联合未平仓量在接近2月底时开始增加,并在3月份的前三周保持在非常高的水平。然后在3月到期后大幅下跌,在3月底达到低点,然后进入4月。和成交量一样,未平仓头寸是与价格一起研究的,以更清楚地了解未来的趋势。在分析价格和未平仓权益时,有以下四种情况:

看涨:如果价格在上升,而持仓量在增加,则表示看涨趋势;

看跌:如果价格在下降而未平仓量在增加,那么它表明一个看跌趋势;

空头平仓或空头回补:如果价格上升而未平仓量减少,则表明投资者正在平仓;

多头平仓:如果价格下降且未平仓量减少,则表示多头退出其头寸。

在下面的图中,我们绘制了覆盖着下一部分分析的价格的未平仓头寸。

#plotting close prices and open interest together
ax= data['oi'].groupby(data.index).sum().plot(figsize=(15,7), color='g')
plt.ylabel('Open interest to volume ratio',fontsize='x-large')
plt.title(' Close price vs Open interest \n (Note: red lines mark the expiry dates)',fontsize ='xx-large')
plt.legend()
plt.axvline(datetime(2020, 1, 30), color='r')
plt.axvline(datetime(2020, 2, 27),color='r')
plt.axvline(datetime(2020, 3, 26),color='r')

data[data['ticker']=='NIFTY-I']['close'].plot(ax=ax, secondary_y=True,color='b')
plt.ylabel('Close prices Nifty',fontsize='x-large')

plt.show()


同时研究价格和未平仓利率可以让我们更清楚地了解情况。从上面图可以看到,随着2月到期的临近,价格并没有给我们太多关于未来情况的线索,但与此同时,未平仓头寸开始飙升,表明新的空头头寸在积累。在此期间,新冠肺炎疫情开始对世界经济构成严重威胁。在3月的第二周,当价格崩溃时,未平仓头寸飙升并保持在高位,表明熊市已经接管了市场。在4月的第一周,价格从低点反弹,未平仓的低水平表明投资者正在平仓他们的空头头寸,也称为空头回补。

我们发现,在接近2月底(接近到期)的时候,持仓头寸分析涵盖的信息要比价格和成交量要多得多。但在这一点上,它并不能告诉我们,那些做空头寸的交易者是否仍然有信心将他们的头寸延续到3月份。这就是展期分析变得重要的地方,下一节将做进一步分析。

1.7 展期(Rollover)分析

展期(Rollover),顾名思义就是将当月到期的期货头寸展期或结转至下个月系列。例如,随着 1 月到期日临近,持有 1 月期货多头头寸的交易者有两种选择。她可以让头寸到期并进行交割,或者在同时交易中卖出 1 月期货并买入 2 月期货。后者称为翻仓。

对于任何交易月份,总展期通常以百分比表示,该百分比是使用所有未来系列的未平仓合约数据计算得出的。Nifty 50 期货的展期百分比计算如下:

任何交易月份的展期百分比 = (下个月OI+远期月份OI)/(近期月份OI+下个月OI+远期月份OI),(其中 OI 是未平仓合约)

与前三个月或六个月的平均值相比,展期百分比显示交易者对他们持有的头寸的信心增加或减少。当与价格变动一起研究时,展期百分比反映了当前趋势的强度。一般而言,以下规则成立:

上升趋势的延续:如果价格以较高的滚动百分比上涨,则表明看涨趋势强劲,并且可能会持续;

下降趋势的延续:如果价格以较高的滚动百分比下降,则表明看跌趋势很强并且可能会持续;

上升趋势减弱:如果价格以较低的滚动百分比上升,则表明上升趋势正在减弱,我们可能会看到向下反转;

下跌趋势减弱:如果价格以较低的滚动百分比下降,则表明下跌趋势正在减弱,触底过程结束,可能导致盘整阶段并最终向上反转。

下面,我们编写了一个函数来获取数据并计算2020年第一季度所有三个到期月的展期百分比,将此信息存储在名为'expiry_df'的新DataFrame中,如下所示:

# Creating a function to generate rollover percent
def rollover(DF, expiry_date):
    ''' This function takes the futures data, expiry date
        and returns an estimate of rollover percent '''
    df = data.loc[expiry_date]

    Near_month_oi = df[df['ticker']=='NIFTY-I']['oi'].mean()
    Next_month_oi = df[df['ticker']=='NIFTY-II']['oi'].mean()
    Far_month_oi = df[df['ticker']=='NIFTY-III']['oi'].mean()
    return round(100* (Next_month_oi + Far_month_oi) /   (Near_month_oi + Next_month_oi + Far_month_oi),2)


# Creating a new DataFrame with rollover % for expiry dates
expiry_dates =[datetime(2020, 1, 30).date(),datetime(2020, 2, 27).date(),datetime(2020, 3, 26).date()]

expiry_df = pd.DataFrame(index=expiry_dates , columns = ['rollover %','oi','Nifty'])

for i in range(len(expiry_dates)):
    expiry_df['rollover %'].iloc[i] = rollover(data, expiry_dates[i])
    expiry_df['oi'].iloc[i] = data[data['ticker']=='NIFTY-II']['oi'].loc[expiry_dates[i]]
    expiry_df['Nifty'].iloc[i] = data[data['ticker']=='NIFTY-I']['close'].loc[expiry_dates[i]]
expiry_df.index.name='Expiry_date'
expiry_df

下面绘制出2020年1月、2月和3月的展期百分比:

#plotting price with rollover% on the same plot
data[data['ticker']=='NIFTY-I'].close.plot(figsize=(15,7),color='b')
plt.title(' Close price vs rollover % in Q1 of 2020 \n (Note: Horizontal green line marks the three month average rollover%\n \
Vertical red lines mark the expiry dates)', fontsize='xx-large' )
plt.axvline(datetime(2020, 1, 30), color='r')
plt.axvline(datetime(2020, 2, 27),color='r')
plt.axvline(datetime(2020, 3, 26),color='r')
plt.ylabel('Close price of Nifty-I',fontsize='x-large')
plt.legend(loc='lower left')

axes2 = plt.twinx()
axes2.bar(expiry_df.index, expiry_df['rollover %'], color='indigo', label='rollover %', width= 2)
plt.ylabel('Rollover in %',fontsize='x-large')
plt.axhline(70, color='green')
plt.legend(loc='best')
plt.show()

上图中的竖线代表到期日的展期百分比。当我们接近 2 月的到期日时,价格开始下跌,并且滚动百分比很高,约为 77%(与三个月的平均滚动百分比相比,即水平绿线)。它表明,2月份建立的空头以坚定的信念滚动到3月份。然而,从 3 月到 4 月,展期百分比降至约 62%,远低于三个月平均水平,表明这些空头在 3 月底关闭。这说明3月底触底反弹,市场自此企稳,等待进一步的新进展。

1.8 FII/DII 交易指标

FII 和 DII(国内外机构投资者)是共同基金、保险公司和对冲基金等大型参与者。这些投资者在市场中扮演着重要的角色,他们的活动可以预示未来的趋势。这些投资者在建仓前采用先进的研究方法来预测趋势,因此被称为“聪明的钱”。

在 FII 和 DII 之间,FII 更像是所谓的“热钱”,即投资以获得短期利润并在经济形势发生变化时迅速撤回的资金。在印度,DII 是更稳定的投资者,如只做多头的共同基金,当 FII 大量抛售时,往往会以折扣价购买证券。

对于印度市场,可以从 NSE 和 NSDL 网站免费获取 FII/DII 活动数据。或者数据供应商也可以提供这些数据。下面我们获取并查看 2019 年最后一个月和 2020 年第一季度的数据:

# Fetching FII/DII data
fii_dii = pd.read_excel('FII DII.xlsx')
fii_dii

前两列分别表示Nifty 50中FII和DII的月度净(买进卖出)投资。最后一列显示了当月最后一天Nifty所处的关卡。下面对Nifty中FII/DII的交易进行可视化,代码如下:

# plotting and visualising FII/DII data
ax = fii_dii[['net FII buy/sell', 'net DII buy/sell']].plot(figsize=(15,7),color=['red','blue'],marker='d', markersize=12)
plt.ylabel('FII/DII net Investment in crores',fontsize='x-large')
plt.xlabel('Month',fontsize='x-large')
fii_dii['NIFTY'].plot(ax=ax, secondary_y='NIFTY',color='black',linestyle='dashed', marker='o',\
                      markerfacecolor='black', markersize=12)
plt.ylabel('NIFTY',fontsize='x-large')
plt.xlabel('Month',fontsize='x-large')
plt.title('FII/DII net investment vs Nifty', fontsize='xx-large')
plt.legend()
plt.show()


从上面的图中可以看出,FII在1月初开始抛售,净卖出535.9亿卢比。显然,国际机构对2019冠状病毒病在全球的传播了如指掌,并及早采取了行动。外国投资者的这种出售一直持续到2月和3月(3月达到约6500亿卢比的创纪录水平)。与此同时,投资性投资机构介入市场支撑,但市场完全被抛售所主导。分析发现1月和2月形成的FII抛售势头,会给很多投资者一个退出多头的信号,并让他们避免在3月发生灾难性的波动。

03 结语

本文着重介绍了如何利用Python分析未平仓头寸、展期数据和FII/DII活动等指标,以预测未来趋势并做出更好的交易决策。本文的策略分析主要是基于印度期货和股票指数数据,但其该策略思维和分析方法同样可以应用于大宗商品和其他市场等。这些指标可以作为过滤器来提高现有股票选择标准或开发新的交易策略。但这些只是指标,在做出投资决定之前,还需要综合考虑其他因素。

原文作者:Ashutosh Dave | 翻译和编辑:CuteHand

原文链接:网页链接