Как я могу создать функцию Python для расчета спредов по данным панели? - PullRequest
2 голосов
/ 27 октября 2019

У меня есть набор данных панели, который содержит различные облигации, и доходность облигаций за несколько дней.

Я хотел бы создать функцию, которая для данного дня берет две облигации и рассчитывает спред, а затем делает это для каждой пары облигаций, для каждого дня.

Результирующий кадр данныхбудет иметь дату, столбец, показывающий, какие две облигации, а затем спред доходности.

Исходный кадр данных:

data1 = {'Date':['26/10/2019', '26/10/2019', '26/10/2019', '26/10/2019', '25/10/2019', '25/10/2019', '25/10/2019', 
                '25/10/2019'],
        'Bond':['A', 'B', 'C', 'D', 'A', 'B', 'C', 'D'],
        'Yield':[1.1, 1.11, 1.2, 1.3, 1, 1.1, 1.25, 1.29]}

df1 = pd.DataFrame(data=data1)

Результирующий кадр данных:

data2 = {'Date':['26/10/2019', '26/10/2019', '26/10/2019', '26/10/2019','26/10/2019','26/10/2019', '25/10/2019', 
                '25/10/2019', '25/10/2019', '25/10/2019','25/10/2019','25/10/2019'],
        'Bond':['BA', 'CB', 'CA', 'DC', 'DB', 'DA', 'BA', 'CB', 'CA', 'DC', 'DB', 'DA'],
        'Yield':[0.01, 0.09, 0.1, 0.1, 0.19, 0.2, 0.1, 0.15, 0.25, 0.04, 0.19, 0.29]}

df2 = pd.DataFrame(data=data2)

Спасибо зазаранее!

1 Ответ

2 голосов
/ 27 октября 2019

Сначала мы merge на дату, чтобы получить все комбинации bonds рядом друг с другом.

Затем мы drop duplicates при сортировке(np.sort) по облигациям, потому что AB совпадает с BA, а CD совпадает с DC.

Тогда, наконец, мы substract yields друг от друга и взять абсолют:

mrg = df1.merge(df1, on='Date').query('Bond_x != Bond_y')
mrg.loc[:, ['Bond_x', 'Bond_y']] = np.sort(mrg.loc[:, ['Bond_x', 'Bond_y']])
mrg = mrg.drop_duplicates(subset=['Date','Bond_x', 'Bond_y'])

df = pd.DataFrame({'Date': mrg['Date'],
                   'Bond': mrg['Bond_x'].str.cat(mrg['Bond_y']),
                   'Yield': mrg['Yield_x'].sub(mrg['Yield_y']).abs()}).reset_index(drop=True)

          Date Bond  Yield
0   26/10/2019   AB   0.01
1   26/10/2019   AC   0.10
2   26/10/2019   AD   0.20
3   26/10/2019   BC   0.09
4   26/10/2019   BD   0.19
5   26/10/2019   CD   0.10
6   25/10/2019   AB   0.10
7   25/10/2019   AC   0.25
8   25/10/2019   AD   0.29
9   25/10/2019   BC   0.15
10  25/10/2019   BD   0.19
11  25/10/2019   CD   0.04
...