[Quantitativ] Verarbeitung von Ideen für Rohstoff-Futures-Monats-Swap (alt)

Bei Warenterminkontrakten gibt es die Situation, dass sich die Monate ändern, d. h. der Terminkontrakt hat ein Ablaufdatum. Wenn Sie keine physische Lieferung wünschen, müssen Sie Ihre Position in einen Folgekontrakt umwandeln, und die Preise in verschiedenen Monaten sind unterschiedlich, das heißt Sie sind diskontinuierlich. Beim Backtesting ist es notwendig, die durch den Monatswechsel verursachte Lücke zu schließen:

Beispielsweise ändert sich der PG im Bild oben von Monat zu Monat, und an der Mausmarke besteht ein Preisunterschied von 500 Punkten. Wenn er nicht verarbeitet wird, beträgt der Gewinn 500 Punkte mehr, wenn Sie long gehen, und der Verlust beträgt 500 Punkte mehr, wenn Sie im Backtest eine Short-Position eingehen. Dies geschieht jedoch nicht bei tatsächlichen Monatswechseln.

Daher ist dies ein grundlegendes Thema wie die Wiederherstellung von Rechten an Aktien. Da es jedoch im chinesischen Internet nur wenige relevante Artikel gibt, die dieses Thema diskutieren und behandeln, habe ich Xing Da um Rat gefragt:

Sie können Ihre eigenen Regeln festlegen. Beispielsweise ist das Kontrakthandelsvolumen des nächsten Monats höher als das des aktuellen Monats. Wenn es an drei aufeinanderfolgenden Tagen hoch ist, wechseln Sie zum nächsten Monat.

Dann fragte chatGPT nach einer Reihe freundschaftlicher Gespräche:

Nutzen Sie die Idee von Xing Da, um zunächst selbst ein Hauptunternehmen zusammenzuführen.

Vorbereitung

Warentermindaten nach Vertrag. Es kann hier im Quantitativen Hörsaal heruntergeladen werden :

Die Hauptkraft beim Halten von Positionen ändert sich je nach Monat

Die Erklärung des Hauptdesigns des Unternehmens im Bereich Wind lautet:

Ein angepasster Kontrakt, der aus den Marktdaten des Kontrakts mit dem größten offenen Interesse in verschiedenen Zeiträumen gespleißt wird. Da die maximale Position zwischen verschiedenen Verträgen vor und nach der monatlichen Swap-Periode hin und her schwankt, sind die Regeln des Wind-Hauptvertrags so festgelegt, dass nur vorwärts und nicht rückwärts gewechselt wird, und ob ein Wechsel erfolgt, wird täglich entschieden Abschluss und Abwicklung.

Es ist ersichtlich, dass sie nach der Position unterteilt sind, daher verwenden wir hier auch die Position als Klassifizierungsstandard.

Zuerst fügen wir die Rohdaten zusammen, um eine Tabelle mit mehreren Handelsdaten, aber nur einem Handelsdatum für jeden Kontrakt zu bilden (am Beispiel von Methanol):

from glob import glob
kline_path = r'path'
for i in ['symbol']:
    symbol_file_path = glob(kline_path + '/%s/*[0-9].csv' % i)  # 此处是寻找所有数字结尾的csv文件

df_list = []
for i in symbol_file_path:
    df_list.append(pd.read_csv(i, encoding='GBK', skiprows=1, parse_dates=['交易日期']))

all_coin_data = pd.concat(df_list, ignore_index=True)
data_need_to_prepare = all_coin_data.sort_values('交易日期')

Als nächstes begannen wir, die Arbeit zu organisieren und die Positionen entsprechend den Vertragsnamen zu verteilen:

# 计算每个合约在每个交易日的持仓量
holdings = data_need_to_prepare.groupby(['交易日期', '合约代码'])['持仓量'].sum().unstack()

Zweitens verwenden Sie das Rollen, um den maximalen Wert der Position in den letzten fünf rollierenden Tagen zu ermitteln, und erhalten Sie den Vertrag mit dem größten täglichen Querschnitt, der als Serie bezeichnet wird. Verwenden Sie schließlich die innere Methode, um df und Serie zusammenzuführen, und erhalten Sie die Ergebnis, das wir wollen.

# 求出过去五日的最大值
rolling_max = holdings.rolling(window=5).max()
# 找到最大值所在的列名
max_columns = rolling_max.idxmax(axis=1)

series_df = max_columns.reset_index()
series_df.columns = ['交易日期', '合约代码']

result = pd.merge(data_need_to_prepare, series_df, on=['交易日期', '合约代码'], how='inner')

Abschließend können die Rechte mithilfe der Stock Rights Restore- Methode wiederhergestellt werden. Der vorherige Schlusskurs ist hier einfach der Schlusskurs des Vortages für den Kontrakt. Bei der Berechnung des Anstiegs oder Rückgangs sollte dieser Wert dem Anstieg oder Rückgang der aktuellen K-Linie gegenüber der vorherigen K-Linie dieses Kontrakts entsprechen, wodurch vermieden wird die Notwendigkeit monatlicher Änderungen. Kommen Sie auf die Strecke.

Eine andere Denkweise ist das Wiedereröffnen und Schließen von Positionen an einem neuen Monatstag

Das Obige wird mit der Idee der Bestandswiederherstellung behandelt. Bitte beachten Sie jedoch, dass bei der Eröffnung einer Position, wenn es um die spezifische Menge der Position geht, der ursprüngliche Preis verwendet wird, der nicht wiederhergestellt wurde, sodass die Verarbeitung relativ kompliziert ist .

Es gibt einen Trick. Haben wir das Hauptunternehmen nicht selbst erstellt, können wir also die Monatswechselzeit ermitteln? Ändern Sie dann die Position am Tag des Monatswechsels direkt auf 0, um die Position am Tag vor dem Monat zu schließen Ändern und eröffnen Sie die Position am zweiten Tag. Das Ergebnis der Position, Short-Position am Tag der Monatsänderung:

# 在换月的时候仓位为0,然后第二天正常交易
df.loc[df['合约代码'] != df['合约代码'].shift(), 'pos'] = 0

おすすめ

転載: blog.csdn.net/food_for_thought/article/details/135251838