1

我的目标是编写一个函数,该函数从熊猫证券价格数据框中返回每个时期(即一天)的投资组合收益向量。为简单起见,我们假设初始权重在证券AB之间平均分配。价格由以下数据框给出:

import pandas as pd
import numpy as np
dates = pd.date_range('20130101', periods=20)
prices = pd.DataFrame({'A': np.linspace(20, 50, num=20),
                       'B': np.linspace(100, 200, num=20)},
                      index=dates)

此外,我们假设资产A是我们发起空头头寸的资产,我们做资产B

第一步从“零投资头寸”(如空头头寸(即资产A ))计算离散回报,在第二步从构成投资组合的单个资产的加权回报中计算整体投资组合回报并非易事,之前我进行了迄今为止的尝试,但没有正常工作(关键问题是资产A的空头头寸在2013 年 1 月 14 日超过 -100% 的损失),我非常感谢任何形式的帮助 - 可能是理论上的或代码。

4

2 回答 2

2

你忘记了资产“C”,就像抵押品一样。无论您的经纪人多么慷慨(不是!),大多数交易所和国家监管机构都需要抵押品。你可能会读到一些富有的对冲基金人只用多头和空头头寸进行这些交易,但当它向南时,你也会读到 HF 人失去了他的艺术收藏品——这是抵押品。

美国的股票保证金要求需要 50% 的抵押品才能开始,并且在空头交易开放时至少需要 25% 的维持保证金。这是由交易所和监管机构强制执行的。国债可能有更优惠的要求,但即便如此,保证金(抵押品)也不是零。

由于多头/空头会使您的风险加倍(如果多头头寸下跌,而空头头寸上涨会怎样?),您的经纪商可能需要比最低保证金更多的保证金。

将资产“C”(抵押品)添加到您的计算中,投资组合的回报就变得直截了当

于 2020-10-17T14:39:21.313 回答
0

感谢您的回答@Stripedbass。根据您的评论,由两只股票组成的投资组合的回报过程可以用以下等式描述吗?

在此处输入图像描述

+ 和 - 项分别是多头和空头头寸的市场价值,它们的差值代表两个头寸的净值。如果我们假设我们想在交易开始时“市场中立” t=0,净值为零。

对于t > 0,这些净头寸代表已开仓和尚未平仓的多头和空头头寸的未实现收益或损失。C一词表示我们实际持有的货币。它由初始抵押品和股票头寸的累积收益和损失组成。

然后将交易这两种证券的每个时期的总回报计算为账户V的简单回报。

基于此,您可以定义以下函数,对于短仓选择 option type='shares'

def weighted_return(type, df, weights):
    
    capital = 100
    #given the input dataframe contains return series
    if type == "returns":
        # create price indices
        df.fillna(0, inplace=True)
        df_price_index = pd.DataFrame(index=df.index, columns=df.columns)
        df_price_index.iloc[0] = 100 + df.iloc[0]
        for i in np.arange(1, len(df_price_index)):
            for col in df_price_index.columns:
                df_price_index[col].iloc[i] = df_price_index[col].iloc[i - 1] * (1 + df[col].iloc[i])
        n = 0
        ind_acc = []
        for stock in df.columns:
            ind_capital = capital * weights[n]
            moves = (df_price_index[stock].diff()) * ind_capital / df_price_index[stock][0]
            ind_acc.append(moves)
            n += 1

        pair_ind_accounts = pd.concat(ind_acc, axis=1)
        portfolio_acc = pair_ind_accounts.sum(1).cumsum() + capital
        df_temp_returns_combined = portfolio_acc.pct_change()

        df_temp_returns_combined[0] = np.sum(weights * df.iloc[0].values)

        df_temp_returns_combined = pd.DataFrame(df_temp_returns_combined)
        df_temp_returns_combined.columns = ["combinedReturns"]

    #given the input dataframe contains price series
    if type == "prices":
        n = 0
        ind_acc = []
        for stock in df.columns:
            ind_capital = capital * weights[n]
            moves = (df[stock].diff()) * ind_capital / df[stock][0]
            ind_acc.append(moves)
            n += 1

        pair_ind_accounts = pd.concat(ind_acc, axis=1)
        portfolio_acc = pair_ind_accounts.sum(1).cumsum() + capital
        df_temp_returns_combined = portfolio_acc.pct_change()

        df_temp_returns_combined[0] = np.NaN

        df_temp_returns_combined = pd.DataFrame(df_temp_returns_combined)
        df_temp_returns_combined.columns = ["combinedReturns"]
    
    #given the input dataframe contains return series and the strategy is long/short
    if type == "shares":
        exposures = []
        for stock in df.columns:
            shares = 1/df[stock][0]
            exposure = df[stock] * shares
            exposures.append(exposure)

        df_temp = pd.concat(exposures, axis=1)

        index_long = np.where(np.array(weights) == 1)
        index_short = np.where(np.array(weights) == -1)

        df_temp_account = pd.DataFrame(df_temp.iloc[:,index_long[0]].values - df_temp.iloc[:,index_short[0]].values) + 1
        df_temp_returns_combined = df_temp_account.pct_change()
        df_temp_returns_combined.columns = ["combinedReturns"]

        df_temp_returns_combined.index = df.index

    return pd.DataFrame(df_temp_returns_combined)
于 2020-10-19T21:11:42.330 回答