6. Untersuchung ereignisgesteuerter Faktoren mit HistoryPanel
Ereignisgesteuerter Faktor: Candlestick-Mustersignal -> Ereignisfenstermaske -> CAGR und visuelle Erklärung
In der realen Forschung liegen „ereignisartige Faktoren“ oft näher an unserer Intuition als kontinuierliche Faktoren: zum Beispiel „ein Hammer erscheint“, „ein verschlingendes Muster erscheint“, „eine lange bullische Kerze mit hohem Volumen erscheint“ … Sobald diese Ereignisse eintreten, fragen wir uns oft instinktiv:
Wenn ich Aktien nur rund um Ereignisse auswähle, ist das auf lange Sicht besser?
Dieses Tutorial konzentriert sich auf dieses Problem: Verwenden Sie „HistoryPanel.candle_pattern()“, um Musterereignisse in recherchierbare Daten umzuwandeln, fenstern Sie sie dann in Querschnitts-Screening-Bedingungen und durchlaufen Sie schließlich die vollständige geschlossene Schleife: Ereignissignal -> Ereignisfenster -> where/mask -> portfolio + benchmark -> cum_return + CAGR -> plot(highlight) Interpretation.
Einheitliche Einschränkungen (im Einklang mit den beiden vorherigen Beiträgen):
Konzentrieren Sie sich auf einzelne Aktien und beziehen Sie auch „000300.SH“ als Benchmark ein
Ereignisfenster (K=5) (gilt als „gültig“, wenn es innerhalb der letzten 5 Tage passiert ist)
6.1. 0. 开场:先跑通“形态信号 -> 在 K 线上高亮事件”的最小版本
Zuerst der minimal ausführbare Beweis: Wir machen nur zwei Dinge:
Berechnen Sie das Mustersignal.
Markieren Sie die Ereignispunkte im Candlestick-Chart einer einzelnen Aktie.
import qteasy as qt
share = '000001.SZ'
benchmark = '000300.SH'
hp = qt.get_kline(
shares=[share, benchmark],
start='20220101',
end='20221231',
freq='D',
as_panel=True,
)
signals = hp.candle_pattern(name='cdlhammer', as_panel=False)
print(signals.tail())
fig = hp.plot(shares=[share], interactive=True, highlight='max')
fig
Es reicht jedoch bei weitem nicht aus, es nur „berechnen/plotieren“ zu können. Wenn wir es wirklich als wiederverwendbare Forschungsmethode nutzen wollen, werden wir auf mindestens die folgenden Probleme stoßen:
Ereignisse sind zu spärlich: Viele Mustersignale tauchen wie „Punkte“ auf – sie erscheinen heute und sind morgen wieder verschwunden. Wenn Sie den Korb nach dem Prinzip „Wählen Sie ihn aus, wenn er heute erscheint“ zusammenstellen, wird das Portfolio sehr instabil: Die Anzahl der ausgewählten Aktien schwankt stark und die Renditekurve wird leicht unruhig und diskontinuierlich. Am Ende sind Sie möglicherweise nicht einmal sicher, ob Sie das Muster oder die „Probensparsität“ studieren.
So fenstert man es wie im realen Handel: Eine natürlichere Konvention ist normalerweise nicht „es sofort auszuwählen, wenn es heute erscheint“, sondern „es als gültig zu zählen, wenn es innerhalb des letzten Zeitraums erschienen ist“. Denn in Wirklichkeit sind wir möglicherweise nicht in der Lage, den perfekten Musterpunkt am selben Tag zu erfassen. Häufiger behandeln wir es als „Aufmerksamkeitssignal innerhalb eines kurzen Zeitfensters“.
Wie man daraus eine Aktienauswahl im Querschnitt macht: Der Wert von Ereignisstudien liegt oft darin, „am selben Tag aus vielen Aktien die Teilmenge auszuwählen, bei der das Ereignis stattgefunden hat“. Dies erfordert die Umwandlung des Ereignissignals in eine „(M,L)“-Bedingungsmatrix und die anschließende Standardisierung in eine „Where“-Maske.
Rückgabe ohne Erklärung: Selbst wenn Sie die CAGR berechnet haben, benötigen Sie noch etwas, das Sie überprüfen können: Welchen Candlesticks entsprachen die Ereignispunkte? Traten sie in einem Aufwärtstrend, einem Abwärtstrend oder einer Spanne auf? Das Zurückmarkieren der Ereignisse im Diagramm ist der wichtigste Schritt in der ereignisbasierten Forschung.
Glücklicherweise können alle diese Fähigkeiten Schritt für Schritt ausgefüllt werden. Dieser Artikel beginnt mit der „Struktur von Candlestick-Mustersignalen“.
6.2. 0.5 Zeigen Sie zunächst das Endergebnis (was am Ende herauskommt)
Wenn Sie diesen Artikel bis zum Ende durchgehen, erhalten Sie drei Arten von Ausgaben:
Portfoliokurve aus Ereignisfenster-Screening vs. Benchmark: Behandeln Sie Aktien, bei denen „das Muster innerhalb der letzten 5 Tage aufgetreten ist“, als dynamischen Korb, berechnen Sie seine Portfoliokurve und vergleichen Sie sie mit „000300.SH“.
CAGR-Zusammenfassungstabelle: Wandeln Sie die Endrendite des Portfolios in eine jährliche Zahl um, sodass Sie verschiedene Forschungszeiträume problemlos nebeneinander vergleichen können.
Einzelaktien-Candlestick-Chart mit Ereignis-Highlights: Markieren Sie die Ereignisdaten wieder im Candlestick-Chart, damit die Ergebnisse überprüft und besprochen werden können.
6.3. 1. 目标(我们这篇文章要完成什么)
Rufen Sie ein OHLC-Panel für mehrere Freigaben ab und fügen Sie „000300.SH“ als Benchmark hinzu
Verwenden Sie „candle_pattern“, um eine Muster-Signal-Matrix (Zeit x Anteile) zu erhalten.
Fenstern Sie die Ereignissignale (K=5), um die Ereignisbedingungen „(M,L)“ zu erhalten
Verwenden Sie „where()“, um es in eine Research-Maske zu normalisieren und Long/Short-Portfoliokurven zu erstellen
Verwenden Sie
cum_return, um eine CAGR-Übersichtstabelle abzuleitenVerwenden Sie „plot(highlight=…)“, um Ereignispunkte im Candlestick-Diagramm hervorzuheben und so die Interpretierbarkeitsschleife zu schließen
Stellen Sie am Ende den vollständigen „ausführbaren Einzelfunktions“-Code bereit
6.4. 2. 准备数据:必须有 OHLC(事件型因子离不开它)
2.1 Was dieser Abschnitt lösen soll
Die Mustererkennung hängt von „offen/hoch/tief/geschlossen“ ab. In diesem Abschnitt tun wir also nur eines: Stellen Sie sicher, dass die OHLC-Säulen vollständig sind, und fügen Sie auch den Benchmark hinzu, damit wir später direkt vergleichen können.
2.2 Mindestgrundsätze
„candle_pattern(name=…)“ prüft, ob die „price_htypes“, die Sie übergeben, in „hp.htypes“ vorhanden sind. Deshalb validieren wir zunächst die Felder, um zu vermeiden, dass auf halbem Weg fehlende Spalten entdeckt werden.
2.3 Ausführbarer Code + erwartete Ergebnisse
import qteasy as qt
benchmark = '000300.SH'
shares = ['000001.SZ', '600519.SH', '300750.SZ', benchmark]
hp = qt.get_kline(
shares=shares,
start='20220101',
end='20221231',
freq='D',
as_panel=True,
)
required = {'open', 'high', 'low', 'close'}
missing = [c for c in required if c not in set(hp.htypes)]
if missing:
raise ValueError(f'Missing required OHLC columns in htypes: {missing}')
print('hp.shape:', hp.shape)
print('hp.htypes:', hp.htypes)
if hp.shape[1] < 50:
raise ValueError(
'Not enough data points loaded (too few hdates). '
'Please check your local datasource and date range.'
)
6.5. 3. 形态因子提取:candle_pattern 得到事件信号矩阵
3.1 Was dieser Abschnitt lösen soll
Wir wollen eine „Ereignissignaltabelle“: für jeden Tag und jede Aktie, ob das Muster auftritt. In diesem Beispiel wird „cdlhammer“ (Hammer) verwendet; Später können Sie es durch andere Musterfunktionsnamen ersetzen.
3.2 Mindestgrundsätze
Der Rückgabewert von „signals = hp.candle_pattern(name=‘cdlhammer‘, as_panel=False)“ ist:
DataFrame(index=时间,columns=shares)Werte sind Gleitkommawerte (normalerweise bedeutet 0 kein Ereignis; positiv/negativ gibt Richtung/Stärke an, wie von TA-Lib definiert)
Später werden wir es in eine boolesche Ereignismatrix umwandeln und dann Fensterung anwenden.
Hier verwenden wir eine sehr praktische Vereinfachung der „Forschungskonvention“: Unabhängig davon, ob es +100 oder -100 ist, behandeln wir es als „ein Ereignis ist eingetreten“, solange es ungleich Null ist. Wenn Ihnen die Richtung wichtiger ist, können Sie sie auch in zwei Fenster aufteilen, „>0“ und „<0“ (in diesem Artikel werden sowohl lange als auch kurze Fenster demonstriert, um mit den beiden vorherigen Artikeln konsistent zu bleiben).
3.3 Ausführbarer Code + erwartetes Ergebnis
signals = hp.candle_pattern(name='cdlhammer', as_panel=False)
print('signals shape:', signals.shape)
# 只看非 0 的事件(便于验证确实有触发)
nonzero = signals.where(signals != 0.0)
print(nonzero.dropna(how='all').tail())
6.6. 4. 事件窗口化(K=5):不是“今天发生就选”,而是“最近 5 天发生过就选”
4.1 Was dieser Abschnitt lösen soll
Dies ist der kritischste Abschnitt des Artikels: spärliche Ereignissignale in eine praktischere Bedingung „innerhalb des Fensters gültig“ umzuwandeln.
Wir wählen K=5: Wenn innerhalb der letzten 5 Tage ein Ereignis aufgetreten ist, behandeln wir die Aktie als zum Kandidatensatz an diesem Tag gehörend.
4.2 Mindestgrundsätze
Die Form von „Signalen“ ist „(L, M)“ (Zeit x Anteile). Wir konvertieren es in „(M, L)“ (Teile x Zeit) und führen dann ein rollendes Fenster „beliebig“ aus:
„events_ml[i, t] = True“ bedeutet, dass ich das Ereignis am Tag t hatte
window_ml[i, t] = any(events_ml[i, t-K+1 : t+1])
Das resultierende „window_ml“ ist immer noch ein boolesches „(M, L)“-Array, sodass Sie es direkt in „hp.where(window_ml)“ einspeisen können.
Man kann dieses „Windowing“ als eine sehr intuitive Recherchekonvention verstehen:
Ich bitte Sie nicht, heute den genauen Mustertag zu treffen; Solange das Muster in den letzten 5 Tagen einmal aufgetreten ist, behandle ich Sie als Kandidaten, bei dem das „Ereignis noch gültig ist“.
Dadurch wird der Korb stabiler (es bleiben nicht nur ein oder zwei Nadel-im-Heuhaufen-Signale übrig) und es kommt näher an das heran, was wir in Rezensionen tatsächlich tun: Muster sind oft ein „Phasensignal“ und kein „Trigger auf Millisekundenebene“.
4.3 Ausführbarer Code + erwartete Ausgabe (entsprechend Beispielblatt 3, K=5)
import numpy as np
K = 5
sig_ml = signals.to_numpy().T # (M, L)
long_events_ml = sig_ml > 0.0
short_events_ml = sig_ml < 0.0
def any_in_last_k(events_ml: np.ndarray, k: int) -> np.ndarray:
m, l = events_ml.shape
out = np.zeros((m, l), dtype=bool)
for t in range(l):
left = max(0, t - k + 1)
out[:, t] = np.any(events_ml[:, left:t+1], axis=1)
return out
long_window_ml = any_in_last_k(long_events_ml, K)
short_window_ml = any_in_last_k(short_events_ml, K)
mask_long = hp.where(long_window_ml)
mask_short = hp.where(short_window_ml)
print('mask_long shape:', mask_long.shape) # 期望 (M,L,N)
print('selected_count_last_day(long):', int(long_window_ml[:, -1].sum()))
Ich schlage vor, dass Sie eine weitere Plausibilitätsprüfung hinzufügen: Schauen Sie sich die Verteilung der „täglich ausgewählten Anzahl“ an, um zu vermeiden, dass aufgrund einer zu strengen Filterung ein leerer Warenkorb entsteht:
selected_count_by_day = long_window_ml.sum(axis=0)
print('selected_count stats (event_long):')
print(' min/max:', int(selected_count_by_day.min()), int(selected_count_by_day.max()))
print(' mean:', float(selected_count_by_day.mean()))
print(' p10/p50/p90:', np.quantile(selected_count_by_day.astype(float), [0.1, 0.5, 0.9]))
6.7. 5. portfolio + benchmark + cum_return + CAGR:把事件窗口筛选变成可比较的结果
5.1 Was dieser Abschnitt lösen soll
Wir haben die Ereignisfensterfilterung, aber funktioniert sie tatsächlich? In diesem Abschnitt geben wir anhand der Portfoliokurve + einer CAGR-Tabelle eine klare Schlussfolgerung: die Differenz zwischen den Event-Long/Short-Gruppen und der Benchmark über den Forschungszeitraum.
5.2 Die minimal notwendigen Grundsätze
Hier verwenden wir immer noch eine forschungsorientierte „Portfolio“-Aggregation ohne Handelsausführung. Verwenden Sie dann den Endwert von „cum_return“, um die CAGR (äquivalente jährliche Rendite) abzuleiten.
5.3 Ausführbarer Code (Abbildung)
import pandas as pd
benchmark = '000300.SH'
pf_long = hp.portfolio(
htypes='close',
mode='equal',
mask=mask_long,
benchmark=benchmark,
benchmark_output='tag_along',
new_share_name='EVENT_LONG',
)
pf_short = hp.portfolio(
htypes='close',
mode='equal',
mask=mask_short,
benchmark=benchmark,
benchmark_output='tag_along',
new_share_name='EVENT_SHORT',
)
def _years_between(hdates) -> float:
idx = pd.DatetimeIndex(hdates)
days = (idx[-1] - idx[0]).days
return max(1e-9, days / 365.25)
def _cagr_from_cumret(cumret_end: float, years: float) -> float:
return (1.0 + cumret_end) ** (1.0 / years) - 1.0
years = _years_between(pf_long.hdates)
cr = pf_long.cum_return(htypes='close', method='simple')
cumret_long_end = float(cr.values[cr.shares.index('EVENT_LONG'), -1, 0])
cumret_bm_end = float(cr.values[cr.shares.index('000300.SH'), -1, 0])
print('CAGR(event_long):', _cagr_from_cumret(cumret_long_end, years))
print('CAGR(benchmark):', _cagr_from_cumret(cumret_bm_end, years))
Ebenso schlage ich vor, dass Sie es in einer Übersichtstabelle organisieren (mindestens 3 Zeilen: EVENT_LONG / EVENT_SHORT / benchmark), damit die Leser es auf einen Blick vergleichen können:
cr2 = pf_short.cum_return(htypes='close', method='simple')
cumret_short_end = float(cr2.values[cr2.shares.index('EVENT_SHORT'), -1, 0])
summary = pd.DataFrame(
{
'cum_return_end': [cumret_long_end, cumret_short_end, cumret_bm_end],
'CAGR': [
_cagr_from_cumret(cumret_long_end, years),
_cagr_from_cumret(cumret_short_end, years),
_cagr_from_cumret(cumret_bm_end, years),
],
},
index=['EVENT_LONG', 'EVENT_SHORT', '000300.SH'],
)
print('\\n[CAGR summary]')
print(summary)
6.8. 6. 可视化解释:在 K 线上高亮事件发生日(让结论可复盘)
6.1 Was dieser Abschnitt lösen soll
Die größte Angst bei Eventstudien besteht darin, „nur eine einzige Renditetabelle zu haben“. Wir müssen die Ereignispunkte wieder in das Candlestick-Diagramm eintragen und visuell überprüfen, „welches Muster es tatsächlich ist und in welchem Trend es auftritt“, damit die Schlussfolgerung reproduziert und diskutiert werden kann.
6.2 Das Prinzip der Mindestnotwendigkeit
„plot(highlight=…)“ kann einen 1D-Bool (Zeitachse) verwenden, um Ereignispunkte hervorzuheben. Daher extrahieren wir für eine bestimmte „primäre_Aktie“ eine 1D-Bedingung aus „Signalen“, zeichnen dann das Candlestick-Diagramm und markieren es.
6.3 Ausführbarer Code + erwartete Ergebnisse
import numpy as np
primary_share = '000001.SZ'
event_1d = (signals[primary_share].to_numpy() != 0.0).astype(bool)
fig = hp.plot(
shares=[primary_share],
interactive=True,
highlight={'condition': event_1d, 'style': {'marker': 'x', 's': 60}},
)
fig
Erwartetes Ergebnis: Auf dem Candlestick-Chart sehen Sie eine Reihe hervorgehobener Punkte (Ereignistage). Dieser Schritt ist entscheidend: Ereignisstudien haben keine Angst vor „schlechten Ergebnissen“; Sie haben Angst vor „Ergebnissen, die nicht erklärt werden können“. Indem Sie die Ereignisse wieder im Diagramm markieren, können Sie direkt sehen, wo sie auftreten: am Ende eines Rückgangs, als Fortsetzung eines Aufwärtstrends oder nur seitwärts gerichtetes Rauschen – so können Sie entscheiden, ob der nächste Schritt darin besteht, Trendfilter oder Volatilitätsfilter hinzuzufügen.
6.9. 7. 完整代码(单函数可跑版本)
Nachfolgend finden Sie eine vollständige „ausführbare Einzelfunktionsversion“, die Sie in ein Notebook kopieren und mit einem Klick ausführen können. Es umfasst:
candle_patternextrahiert die Ereignissignale;K=5 Fensterung (alle in den letzten 5 Tagen);
Der geschlossene Forschungskreislauf von „wo -> Portfolio -> cum_return -> CAGR“;
Markieren Sie Ereignispunkte im Candlestick-Chart einer einzelnen Aktie (erklärbar durch Überprüfung/Wiedergabe).
import numpy as np
import pandas as pd
import qteasy as qt
def demo_event_pattern(
shares: list,
benchmark: str = '000300.SH',
pattern_name: str = 'cdlhammer',
k: int = 5,
start: str = '20220101',
end: str = '20221231',
primary_share: str = '000001.SZ',
):
\"\"\"演示事件型因子研究闭环:形态信号 -> 窗口化 -> 组合曲线 -> CAGR -> K线高亮解释。
Parameters
----------
shares : list
股票池(必须包含 benchmark;建议 3~30 只即可演示横向筛选)。
benchmark : str, default '000300.SH'
基准指数代码。
pattern_name : str, default 'cdlhammer'
形态名称(ta-lib 风格名称)。
k : int, default 5
事件窗口长度:最近 k 天出现过就算有效。
start : str, default '20220101'
起始日期(YYYYMMDD)。
end : str, default '20221231'
结束日期(YYYYMMDD)。
primary_share : str, default '000001.SZ'
用于高亮解释的单只股票代码。
Returns
-------
dict
包含 hp/signals/pf_long/pf_short/summary/fig_pf/fig_one 等结果对象。
\"\"\"
if benchmark not in shares:
raise ValueError('benchmark must be included in shares')
hp = qt.get_kline(
shares=shares,
start=start,
end=end,
freq='D',
as_panel=True,
)
required = {'open', 'high', 'low', 'close'}
missing = [c for c in required if c not in set(hp.htypes)]
if missing:
raise ValueError(f'Missing required OHLC columns in htypes: {missing}')
if hp.shape[1] < 50:
raise ValueError(
'Not enough data points loaded (too few hdates). '
'Please check your local datasource and date range.'
)
if primary_share not in hp.shares:
raise ValueError(f'primary_share "{primary_share}" not found in shares')
# 1) 形态信号:DataFrame (L, M)
signals = hp.candle_pattern(name=pattern_name, as_panel=False)
print('\\n[signals]')
print(' shape:', signals.shape)
print(' nonzero tail:')
print(signals.where(signals != 0.0).dropna(how='all').tail())
# 2) 事件 -> bool -> 窗口化 any-in-last-k(得到 (M, L))
sig_ml = signals.to_numpy().T # (M, L)
long_events_ml = sig_ml > 0.0
short_events_ml = sig_ml < 0.0
def any_in_last_k(events_ml: np.ndarray, kk: int) -> np.ndarray:
m, l = events_ml.shape
out = np.zeros((m, l), dtype=bool)
for t in range(l):
left = max(0, t - kk + 1)
out[:, t] = np.any(events_ml[:, left:t + 1], axis=1)
return out
long_window_ml = any_in_last_k(long_events_ml, k)
short_window_ml = any_in_last_k(short_events_ml, k)
selected_count_by_day = long_window_ml.sum(axis=0)
print('\\n[Selection count stats]')
print(' min/max:', int(selected_count_by_day.min()), int(selected_count_by_day.max()))
print(' mean:', float(selected_count_by_day.mean()))
print(' p10/p50/p90:', np.quantile(selected_count_by_day.astype(float), [0.1, 0.5, 0.9]))
mask_long = hp.where(long_window_ml)
mask_short = hp.where(short_window_ml)
# 3) 组合聚合 + benchmark
pf_long = hp.portfolio(
htypes='close',
mode='equal',
mask=mask_long,
benchmark=benchmark,
benchmark_output='tag_along',
new_share_name='EVENT_LONG',
)
pf_short = hp.portfolio(
htypes='close',
mode='equal',
mask=mask_short,
benchmark=benchmark,
benchmark_output='tag_along',
new_share_name='EVENT_SHORT',
)
# 4) cum_return -> CAGR 摘要
def _years_between(hdates) -> float:
idx = pd.DatetimeIndex(hdates)
days = (idx[-1] - idx[0]).days
return max(1e-9, days / 365.25)
def _cagr_from_cumret(cumret_end: float, years: float) -> float:
return (1.0 + cumret_end) ** (1.0 / years) - 1.0
years = _years_between(pf_long.hdates)
cr_long = pf_long.cum_return(htypes='close', method='simple')
cr_short = pf_short.cum_return(htypes='close', method='simple')
cumret_long_end = float(cr_long.values[cr_long.shares.index('EVENT_LONG'), -1, 0])
cumret_short_end = float(cr_short.values[cr_short.shares.index('EVENT_SHORT'), -1, 0])
cumret_bm_end = float(cr_long.values[cr_long.shares.index(benchmark), -1, 0])
summary = pd.DataFrame(
{
'cum_return_end': [cumret_long_end, cumret_short_end, cumret_bm_end],
'CAGR': [
_cagr_from_cumret(cumret_long_end, years),
_cagr_from_cumret(cumret_short_end, years),
_cagr_from_cumret(cumret_bm_end, years),
],
},
index=['EVENT_LONG', 'EVENT_SHORT', benchmark],
)
print('\\n[CAGR summary]')
print(summary)
# 5) 图:组合对比(归一化更直观)
fig_pf = pf_long.normalize(htypes='close', base_index=0).plot(interactive=True)
# 6) 图:单股事件高亮(使用 1D 时间轴 bool)
event_1d = (signals[primary_share].to_numpy() != 0.0).astype(bool)
lookback = min(200, len(event_1d))
fig_one = hp.loc[-lookback:].plot(
shares=[primary_share],
interactive=True,
highlight={'condition': event_1d[-lookback:], 'style': {'marker': 'x', 's': 60}},
)
return {
'hp': hp,
'signals': signals,
'pf_long': pf_long,
'pf_short': pf_short,
'summary': summary,
'fig_pf': fig_pf,
'fig_one': fig_one,
}
res = demo_event_pattern(
shares=['000001.SZ', '600519.SH', '300750.SZ', '000300.SH'],
benchmark='000300.SH',
pattern_name='cdlhammer',
k=5,
start='20220101',
end='20221231',
primary_share='000001.SZ',
)
res['fig_one']
6.10. 8. 小结与边界
Zu diesem Zeitpunkt haben wir bereits die gesamte Ereignisfaktor-Forschungspipeline durchlaufen: Mustersignal -> Fensterung -> Querschnittsfilterung -> zusammengesetzte Kurve -> CAGR -> Candlestick-Hervorhebung und Erklärung.
Ich muss es noch einmal betonen: Diese Pipeline ist eine forschungsorientierte Grobaggregation und enthält keine Handelsausführungssemantik. Wenn Sie das Ereignissignal in eine echte Backtest-Strategie umwandeln möchten, sollten Sie die „Ereignisfenster-Filterregeln“ in Strategiesignale umwandeln und sie an „Operator/Backtester“ übergeben, um Details der Handelsebene (Kosten, Abrechnung, Auftragsbeschränkungen usw.) zu verwalten.
6.11. Anhang: Abbildungsindex (empfohlen zur Erstellung/Screenshot im Notebook)
Abbildung |
Empfohlene Platzierung |
Was Sie sehen werden |
|---|---|---|
|
§0 |
Minimal ausführbar: Signale berechnen + Basisdiagramm zeichnen |
|
§0.5 oder §5 |
Zusammengesetzte Kurve des Ereignisfensterkorbs im Vergleich zur Benchmark |
|
§6 |
Heben Sie den Veranstaltungstag auf einem Candlestick-Chart für einzelne Aktien hervor (reproduzierbar und erklärbar) |