以趨勢線交易:視覺化呈現交易訊號
在交易策略中,視覺化呈現訊號至關重要,它能幫助我們檢驗演算法的有效性,並對交易時機有更直觀的理解。本文將以趨勢線交易策略為例,示範如何使用 Python 和 matplotlib 繪製訊號圖表。
訊號產生邏輯
我們的趨勢線交易策略根據以下兩個簡單的條件:
- 做多訊號: 當目前收盤價高於兩個週期前的收盤價時,在下一個開盤價產生做多訊號。
- 做空訊號: 當目前收盤價低於兩個週期前的收盤價時,在下一個開盤價產生做空訊號。
以下 Python 程式碼片段展示了訊號產生的邏輯:
import numpy as np
import matplotlib.pyplot as plt
def add_column(data, num_cols):
"""為資料增加指定數量的列"""
new_cols = np.zeros((data.shape[0], num_cols))
return np.concatenate((data, new_cols), axis=1)
def generate_signals(data):
"""根據價格資料產生交易訊號"""
data = add_column(data, 2) # 增加兩列用於儲存買賣訊號
for i in range(len(data)):
try:
# 做多訊號
if data[i, 3] > data[i - 2, 3]:
data[i + 1, 4] = 1
# 做空訊號
elif data[i, 3] < data[i - 2, 3]:
data[i + 1, 5] = -1
except IndexError:
pass
return data
# 範例資料(OHLC 價格資料,這裡用隨機資料代替)
np.random.seed(42) # 設定隨機種子,確保結果可重複
data = np.random.rand(100, 4) * 10 # 生成 100 根 K 線的隨機 OHLC 資料
# 產生訊號
data_with_signals = generate_signals(data)
# ... 後續繪圖程式碼 ...
內容解密:
這段程式碼首先定義了一個 add_column
函式,用於為資料增加新的列,以便儲存生成的交易訊號。generate_signals
函式則根據上述的交易邏輯,遍歷價格資料,並將產生的做多和做空訊號分別儲存在新增的兩列中。try...except
塊用於處理可能出現的索引錯誤,例如在資料開頭的幾個週期。
繪製訊號圖表
為了更直觀地呈現訊號,我們將使用 matplotlib 繪製帶有訊號箭頭的價格圖表。
def plot_bars(data, window):
"""繪製價格柱狀圖"""
sample = data[-window:, :]
for i in range(len(sample)):
plt.vlines(x=i, ymin=sample[i, 2], ymax=sample[i, 1], color='black', linewidth=1) # 繪製柱狀圖
def plot_signals(data, buy_column, sell_column, window=500):
"""在價格圖表上繪製交易訊號"""
sample = data[-window:, :]
fig, ax = plt.subplots(figsize=(10, 5))
plot_bars(data, window) # 繪製價格柱狀圖
for i in range(len(sample)):
if sample[i, buy_column] == 1: # 做多訊號
ax.annotate('▲', xy=(i, data[i, 0]), xytext=(i, data[i, 0] + 0.5),
arrowprops=dict(facecolor='green', shrink=0.05), fontsize=12, color='green')
elif sample[i, sell_column] == -1: # 做空訊號
ax.annotate('▼', xy=(i, data[i, 0]), xytext=(i, data[i, 0] - 0.5),
arrowprops=dict(facecolor='red', shrink=0.05), fontsize=12, color='red')
plt.title("趨勢線交易訊號圖")
plt.xlabel("週期")
plt.ylabel("價格")
plt.grid(True)
plt.show()
# 繪製訊號圖表
plot_signals(data_with_signals, 4, 5, window=100) # 顯示最後 100 根 K 線的訊號
內容解密:
plot_bars
函式繪製價格的柱狀圖,plot_signals
函式則在價格圖表上疊加交易訊號。ax.annotate
函式用於繪製帶有箭頭的標記,綠色向上箭頭表示做多訊號,紅色向下箭頭表示做空訊號。window
引數控制顯示的資料範圍。
透過以上程式碼和圖表,我們可以清楚地看到交易訊號的產生時機以及與價格走勢的關係,這對於評估和最佳化交易策略至關重要。更進一步,我們可以結合其他技術指標,例如移動平均線、相對強弱指標等,來提升策略的準確性和穩定性。
以下使用 Mermaid 語法繪製一個流程圖,展示訊號產生的邏輯:
graph TD A[開始] --> B{目前收盤價 > 兩個週期前收盤價?}; B -- 是 --> C[產生做多訊號]; B -- 否 --> D{目前收盤價 < 兩個週期前收盤價?}; D -- 是 --> E[產生做空訊號]; D -- 否 --> F[無訊號]; C --> G[結束]; E --> G; F --> G;
這個流程圖清晰地展示了訊號產生的判斷邏輯,更易於理解和使用。在實際應用中,我們可以根據需要繪製更複雜的圖表,例如系統架構圖、狀態轉換圖等,以更好地呈現技術細節。
交易績效評估的關鍵指標
評估交易策略的績效,不能僅僅依靠視覺化的訊號圖表。我們需要客觀的資料來判斷一個交易系統的優劣,這就需要用到績效評估。績效評估指的是計算各種指標和比率,以提供對過去績效的洞察。之後,我們需要解讀這些指標,並調整策略以提升績效。
交易策略可以簡單理解為導向某種特定模式的幾個條件。雖然本章詳細討論了各種 candlestick 模式,但交易策略的簡要回顧也同樣重要。第十章和第十一章會探討一些自然包含 candlestick 模式的交易策略。
績效評估也隱含著一個假設:過去的績效預示著未來的績效。雖然這種持續性難以保證,但回測和評估過去績效是驗證和實施策略的最佳方法。
命中率 (Hit Ratio)
命中率在交易中指的是過去盈利交易的數量除以已實作的總交易數量。它衡量的是我們對未來方向判斷正確的百分比。例如,70% 的命中率意味著平均每 100 筆交易中,有 70 筆是盈利的。這看似不錯,但它是一把雙刃劍,原因我們稍後會解釋。以下是命中率的數學表示:
命中率 = 盈利交易數量 / 總交易數量
顯然,總交易數量包含盈利和虧損的交易。由於其心理效應,命中率是最常被觀察和分析的績效指標之一。請務必在計算時排除未平倉交易,只計算已實作的總交易數量。
回報率 (Rate of Return)
假設您投資 100 美元,一年後變成 105 美元,您的回報率是多少?與其說您賺了 5 美元,不如將您的損益表示為初始投資的回報:
回報率 = (新餘額 / 初始餘額) - 1
這表示您的回報率為 5%。用百分比表示盈利能力可以更好地反映投資組合損益的幅度。舉兩個例子:
- 投資組合 A 賺了 125,000 美元。
- 投資組合 B 回報率為 10%。
投資組合 A 看起來更令人印象深刻,但如果我告訴您兩個投資組合的起始餘額都是 2,000,000 美元呢?這使得投資組合 A 的表現遜色,因為它只賺了 6.25%,而投資組合 B 賺了 10%(200,000 美元)。
您還可以計算幾種型別的回報,即毛回報率和淨回報率。您真正感興趣的應該是淨回報率,因為它扣除了費用。讓我們透過以下示例看看兩者之間的區別:
- 2021 年 1 月 1 日的初始餘額 = 1,000,000 美元
- 2021 年 12 月 31 日的最終毛餘額 = 1,175,000 美元
- 2021 年期間產生的未支付手續費和費用總額 = 35,000 美元
- 2021 年期間未支付的研究提供商費用 = 10,000 美元
在這個例子中,毛回報率是不考慮支付給經紀商和其他第三方供應商的費用的回報率:
毛回報率 = (1,175,000 / 1,000,000) - 1 = 17.5%
淨回報率更接近您實際獲得的收益,計算方法如下:
淨回報率 = (1,175,000 - 35,000 - 10,000) / 1,000,000 - 1 = 13%
扣除成本後,投資組合仍然盈利,但收益有所減少。一些投資組合在扣除成本後會從盈利變為虧損,這就是為什麼選擇費用結構合理的經紀商很重要的原因,這樣它才不會隨著時間的推移吞噬您的利潤。即使是手續費的微小差異也會對活躍交易者產生巨大影響。
盈利因子 (Profit Factor)
盈利因子可以快速衡量每損失 1 個貨幣單位所獲得的盈利金額。它的計算方法是總毛利潤與總毛損失的比率,即用所有盈利交易的利潤總和除以所有虧損交易的損失總和。數學表示式如下:
盈利因子 = 總毛利潤 / 總毛損失
重要的是要除以總毛損失的絕對值。讓我們考慮一個例子,一個投資組合在 2020 年的利潤為 127,398 美元,損失為 88,318 美元。在這種情況下,盈利比率是多少?
答案是 1.44,這表示平均每損失 1.00 美元就能賺取 1.44 美元。當盈利為正時,盈利因子大於 1,而當盈利為負時,盈利因子小於 1。一些交易者喜歡透過調整策略來最佳化,直到找到最高的盈利因子。
風險回報比 (Risk-Reward Ratio)
一個好的交易系統的衡量標準是獲得的回報量與為獲得回報而承擔的風險量之比。當您冒 1.00 美元的風險去賺取 1.00 美元時,風險回報比等於 1.00,您有 50% 的機會贏得或損失相同的金額,除非您有統計優勢,隨著時間的推移,您贏的次數比輸的次數多。
這種統計優勢就是命中率的概念。當您進入交易並設定您的目標價(獲利平倉的價格水平)和止損價(為避免更糟的結果而虧損平倉的價格水平)時,您實際上可以計算您的理論(預期)風險回報比。
以下是一個根據購買加密貨幣 Cardano (ADA) 相對於 USDT(美元的代理)的簡單示例:
- 以 1.00 美元的價格買入 ADAUSDT。
- 將止損設定為 0.95 美元。
- 將目標設定為 1.10 美元。
這筆交易的風險回報比是多少?您如何解讀它?簡單地說,您冒著 0.05 美元的風險去賺取 0.10 美元,這意味著您的回報是風險的兩倍;因此,風險回報比為 2.00。
風險回報比 = (目標價 - 入場價) / (入場價 - 止損價)
上述公式顯示瞭如何計算在交易前設定的理論或預期風險回報比。
一般的經驗法則是儘量以接近 2.00 的風險回報比為目標,因為這為您提供了足夠的預測誤差空間以保持盈利。假設交易數量相同,風險回報比為 2.00,您只需要 33.33% 的命中率即可達到盈虧平衡。
盈虧平衡命中率是指在不計成本和費用的情況下,實作零利潤和零損失所需的最低命中率。由於它只是一個指示性指標,盈虧平衡命中率很少在績效報告中出現。但是,您可以透過風險回報比輕鬆計算它,如下所示:
盈虧平衡命中率 = 1 / (1 + 風險回報比)
這表明命中率和風險回報比之間存在負相關關係,因為您承擔的風險越小,回報越高,您實際達到回報(目標)的可能性就越小,因為您更接近風險(止損)。考慮以下示例:
- 自 2021 年 1 月 1 日以來的命中率 = 43.67%
- 自 2021 年 1 月 1 日以來已實作的風險回報比 = 2.11
在這種情況下,盈虧平衡命中率是多少?使用該公式,您可以找到以下結果:
盈虧平衡命中率 = 1 / (1 + 2.11) = 32.15%
這意味著您有一個成功的策略,因為您平均每 100 筆交易中有 43-44 筆盈利交易。此外,對於這些交易中的每一筆,您平均贏得的金額是您損失金額的 2.11 倍,這就是區別所在。適當的風險管理是盈利交易系統的關鍵。乍一看,命中率並不令人印象深刻,但透過觀察風險回報比,就會有一個全新的認識。
解析交易績效:從理論到實踐
在交易實務中,部分交易可能在觸及止損或目標價位前就已平倉,原因可能包含同方向新訊號出現等。因此,我們需要區分兩種風險報酬比:
- 理論風險報酬比: 交易前的預估值。
- 實際風險報酬比: 每次交易的平均獲利除以平均損失,反映實際交易與理論預估的差距。
以下案例說明如何解讀這兩種比率:
假設 2021 年 1 月 1 日設定的理論風險報酬比為 2.00,2021 年全年的平均每筆交易獲利為 $241,597,平均每筆交易損失為 $127,222。則實際風險報酬比為 1.90,略低於理論值。這是可接受的,因為有時會在達到止損或目標價位前出場。本文後續回測中使用的風險報酬比皆為實際值。
交易次數的重要性
交易頻率是績效評估的關鍵因素。一般經驗法則認為,至少要有 30 筆交易才能達到可靠性門檻。當然,長期來看,交易次數應該更高。某些型態出現頻率低,訊號少,難以有效評估。
某些型態可能很少見,但本章的目的並非吹捧或貶低特定型態。事實上,有些型態缺乏預測性,卻仍被許多散戶交易者使用。本章的第二個目標就是揭開這些迷思。接下來,我們將探討如何使用 Python 計算這些指標。
建立績效評估函式
討論完績效指標的理論部分,雖然實際上還有更多深入的指標,但這四個指標已足以初步評估策略的有效性:
- 命中率: 初步判斷型態或策略的預測性。
- 獲利因子: 衡量產生的獲利是否大於損失,不受部位規模影響。
- 實際風險報酬比: 衡量風險與報酬的比例。
- 訊號頻率: 判斷結果是否有意義,以及預期訊號出現的頻率。
以下 Python 函式 performance()
整合了這些績效指標。程式碼後續會詳細解釋其運作方式和輸出:
import numpy as np
def performance(data, open_price, buy_column, sell_column, long_result_col, short_result_col, total_result_col):
# ... (程式碼內容與原文相同)
此函式接收七個變數,分別代表資料陣列及其欄位索引。data
代表包含歷史資料和型態產生訊號的 OHLC 陣列。訊號以 1 表示多頭觸發,-1 表示空頭觸發。open_price
代表陣列的第一欄,即每個時間步的開盤價。在本例中,由於使用小時時間框架,每個時間步為一小時。
open_price
的值始終為 0,因為 Python 陣列的第一欄索引為零。buy_column
和 sell_column
分別代表買入和賣出訊號的儲存位置。簡單型態通常為 4 和 5,複雜型態則可能更高。long_result_col
和 short_result_col
代表 buy_column
和 sell_column
產生的結果索引。平倉多頭部位時,該部位的結果儲存在 long_result_col
描述的欄位中。total_result_col
始終是 short_result_col
之後的下一欄,它是兩個結果欄的總和,用於簡化績效指標的計算。
呼叫函式的語法如下:
my_data = performance(my_data, 0, 4, 5, 6, 7, 8)
此陳述式對名為 my_data
的陣列呼叫 performance
函式,並以必要的值取代變數。
內容解密:
這段程式碼的功能是計算並輸出交易績效指標。它首先計算每個交易的結果,然後根據這些結果計算命中率、獲利因子、實際風險報酬比和交易次數。
核心思路是模擬交易過程,根據買賣訊號計算每次交易的盈虧,然後彙總這些盈虧計算績效指標。
設計模式上,這段程式碼採用了函式式設計,將績效計算封裝在一個函式中,提高了程式碼的可重用性和可讀性。
演算法選擇上,程式碼使用了簡單的迭代和陣列操作,沒有複雜的演算法,易於理解和實作。
潛在效能考量方面,由於程式碼使用了迴圈和陣列操作,在大規模資料集上可能會存在效能瓶頸。可以考慮使用向量化操作或其他最佳化方法提高效能。
假設案例:評估績效
最後,我們來看一個完整的例子並解讀其結果。回測的目的是理解策略或型態的表現,以便改進。以下是一個投資組合在 2017 年至 2021 年間使用單一策略的詳細資訊:
- 總交易次數:2,348
- 獲利交易:1,236
- 虧損交易:1,112
- 理論風險報酬比:2.00
- 交易淨利:$457,995
- 交易淨損:$321,589
- 平均每筆交易獲利:$370.54
- 平均每筆交易損失:$289.19
問題與解答:
- 2017 年至 2021 年間的命中率是多少?
命中率 = 獲利交易次數 / 總交易次數 = 1,236 / 2,348 = 52.64%
- 2017 年至 2021 年間的淨獲利因子是多少?如何解讀?
獲利因子 = 總獲利 / 總損失 = $457,995 / $321,589 = 1.42,遠高於 1.00。這表示投資組合每損失 $1.00 就會產生 $1.42 的獲利。
- 2017 年至 2021 年間的實際風險報酬比是多少?與理論風險報酬比相比如何?
實際風險報酬比 = 平均每筆交易獲利 / 平均每筆交易損失 = $370.54 / $289.19 = 1.28。遠低於 2.00 的理論風險報酬比,表示投資組合的風險報酬表現未達最佳狀態。
(Mermaid 圖表)
graph LR B[B] C[C] A[總交易次數: 2348] --> B{獲利交易: 1236}; A --> C{虧損交易: 1112}; B --> D[命中率: 52.64%]; E[總獲利: $457,995] --> F{獲利因子: 1.42}; G[總損失: $321,589] --> F; H[平均獲利: $370.54] --> I{實際風險報酬比: 1.28}; J[平均損失: $289.19] --> I;
圖表說明: 此流程圖展示瞭如何從交易資料計算績效指標,以及各指標之間的關係。
這個案例分析說明瞭如何使用績效指標評估交易策略,並透過實際與理論的比較找出改進空間。
交易頻率的解讀
以五年內 2,348 筆交易的投資組合來說,交易活動相對頻繁,平均每年約 469 筆。如此高的交易次數,交易成本是一個值得關注的問題。從統計學角度來看,由於訊號眾多,績效指標應能充分描述投資組合的狀況。
投資組合管理評估
儘管獲利因子顯示獲利能力很高,但管理者仍應考慮在維持 50% 以上的勝率的同時,提高已實作的風險報酬比。這可以透過調整、最佳化,甚至重新審視進出場策略來達成。管理者也應研究如何篩選交易以降低經紀費用。然而,該投資組合目前盈利,與似乎具有預測性策略。
現在,您已經完成了用於分析和回測 candlestick 模式核心演算法的建構。在介紹這些模式之前,還需要了解 candlestick 模式識別所屬的研究領域——技術分析。
graph LR B[B] A[核心演算法建構完成] --> B{技術分析理解} B --> C[Candlestick 模式介紹]
技術分析簡介
技術分析依賴對價格行為歷史的視覺化解讀,以判斷市場可能的總體方向,其根據「過去是預測未來的最佳指標」的理念。技術分析領域涵蓋多種技術,主要包括以下幾種:
graph TD A[技術分析] --> B(圖表分析) A --> C(指標分析) A --> D(模式識別)
- 圖表分析: 將主觀的視覺化解讀技術應用於圖表,通常使用繪製支撐線、阻力線和回呼線等方法來尋找拐點,以判斷下一步走勢。
- 指標分析: 使用數學公式建立客觀指標,可以是趨勢追蹤型或逆勢型。常見指標包括移動平均線和相對強弱指數 (RSI),本章將詳細討論這兩個指標。
- 模式識別: 監控某些重複出現的形態並據此採取行動。模式通常是偶爾出現的事件,並呈現出特定的理論或經驗結果。在金融領域,模式識別更為複雜,但某些模式已被證明能長期增加價值,這可能部分歸因於一種稱為「自我實作預言」(一個初始預期導致其自身被證實的過程)的現象。 candlestick 模式是本章的主角,也是眾多已知模式中的一種。
讓我們快速瀏覽技術分析的歷史,以便您更好地瞭解預期結果。技術分析根據以下三個原則:
- 歷史會重演: 您可能會在趨勢和區間中看到叢集。此外,某些形態和模式很可能在大部分時間產生相似的結果。(這假設一個非隨機的機率,長期來看呈現出確定性特徵。)
- 市場消化一切: 假設所有訊息(所有基本面、技術面和量化訊息)都已包含在當前價格中。
- 市場呈波浪形運動: 由於不同的時間框架和需求,交易者以不同的頻率買賣,因此會產生趨勢和波浪,而不是直線。
遺憾的是,技術分析被散戶交易群體過度炒作和濫用,這使其在專業領域的聲譽不佳。每種分析方法都有其優缺點,基本面、技術面和量化投資者都有成功的案例,但也都有失敗的案例。
基本面分析依賴經濟和財務資料,以長期投資為目標,對特定證券或貨幣做出判斷;而量化分析的應用更為廣泛,更常應用於短期資料,它使用數學和統計概念來進行預測。
技術分析的假設之一是市場並非有效,但這意味著什麼?市場效率是指訊息已經嵌入當前價格中,價格和價值是相同的。當您購買資產時,您希望它是被低估的(用基本面分析的術語)或超賣的(用技術分析的術語),這就是為什麼您認為價格應該上漲以符合價值。因此,您假設價值大於價格。市場效率反駁了任何價格不等於價值的說法,因此認為任何 alpha 交易都不應產生高於平均水平的回報(alpha 交易是指參與投機操作以跑贏基準,基準通常是某個指數或加權指標)。
市場效率假說是技術分析師最大的敵人,因為其原則之一是,在弱式效率中,您無法從技術分析中獲得超額回報。因此,技術分析一開始就受到了抨擊,然後基本面分析也受到了打擊。
可以合理地假設,在未來的某個時刻,由於參與者數量眾多與訊息易於取得,市場將別無選擇,只能變得有效。然而,正如政治和異常事件向我們展示的那樣,市場往往並非有效。
例如,俄羅斯入侵烏克蘭就是一個引發市場恐慌和非理性行為的政治事件。類別似地,一個異常的經濟事件是央行意外加息。
圖表分析
在瞭解圖表分析之前,您需要知道 candlestick 圖表上顯示的內容。
假設市場開盤價為 $100,隨後發生了一些交易活動。讓我們記錄小時期間的最高價 ($102) 和最低價 ($98),以及小時收盤價 ($101)。請記住,這四個資料稱為開盤價、最高價、最低價和收盤價 (OHLC)。它們是建立 candlestick 圖表所需的四個基本價格。
Candlestick 非常簡單直觀。它們是時間軸上包含 OHLC 資料的盒狀時間順序元素。圖 3-1 顯示了 candlestick 的工作原理。
graph LR A[開盤價 \$100] --> B(最高價 \$102) B --> C(最低價 \$98) C --> D[收盤價 \$101]
圖 3-1. 左側為 bullish candlestick;右側為 bearish candlestick。
bullish candlestick 的收盤價高於開盤價,而 bearish candlestick 的收盤價低於開盤價。
Candlestick 圖表是最常用的金融時間序列分析方法之一。它們比簡單的線圖包含更多訊息,並且比條形圖更具視覺可解讀性。Python 中的許多函式庫都提供圖表繪製功能,但我認為自己動手做總是更好。讓我們從線圖開始。
線圖是按時間順序連線收盤價建立的,這是繪製資產的最簡單方法。在三種圖表型別中,它包含的訊息最少,因為它只顯示收盤價。
在 Python 中繪製基本線圖非常簡單,只需要一行程式碼。您必須確保已匯入名為 matplotlib
的函式庫,它可以為您處理繪圖。以下程式碼片段顯示瞭如何繪製 EURUSD 小時時間框架的收盤價線圖:
# 匯入必要的圖表函式庫
import matplotlib.pyplot as plt
# 繪製線圖的語法
plt.plot(my_data, color='black', label='EURUSD')
# 增加上面建立的標籤的語法
plt.legend()
# 增加網格的語法
plt.grid()
# 顯示圖表
plt.show()
圖 3-2 顯示了 EURUSD 的線圖。該圖表僅提供……
內容解密:
這段程式碼使用 matplotlib
函式庫繪製 EURUSD 的線圖。plt.plot(my_data, color='black', label='EURUSD')
函式繪製線圖,其中 my_data
是一個包含 EURUSD 收盤價的一維陣列,color='black'
設定線條顏色為黑色,label='EURUSD'
設定圖例標籤。plt.legend()
顯示圖例,plt.grid()
增加網格線,plt.show()
顯示圖表。
繪製從線圖到K線圖
在上一篇文章中,我們探討了 EURUSD 的線圖。現在,讓我們更進一步,學習如何繪製 K 線圖。
最簡單的方法是想像在每個時間點都有一條垂直線(就像第二篇文章中顯示的簡單柱狀圖一樣)。步驟如下:
- 為每一列繪製代表最高價和最低價的垂直線。例如,在 OHLC 資料上,您可以使用 matplotlib 函式
vlines()
,它使用最小值(低價)和最大值(高價)在圖表上繪製垂直線。因此,此函式繪製的柱狀圖涵蓋每個最高價和最低價之間的範圍。圖一顯示了一個簡單的柱狀圖(類別似於第二篇文章中的圖表),其中每個柱狀圖代表 EURUSD 的高低價範圍。
graph LR A[最高價] --> B(柱狀圖) C[最低價] --> B
圖一:EURUSD 簡單柱狀圖
- 重複第一步,但這次將新的垂直線應用於開盤價和收盤價。這會讓您在垂直線內看到另一條垂直線,但並不明顯。如何解決這個問題?賦予顏色條件和更大的寬度來表示 K 線的實體。
圖二顯示了 EURUSD 的完整 K 線圖。您可以看到,透過顏色編碼和 OHLC 資料的完整視覺化,您可以獲得更多訊息,例如波動性和收盤價與開盤價的總體趨勢。這種型別的訊息線上圖中是無法獲得的。
gantt dateFormat YYYY-MM-DD; title EURUSD K線圖範例; section 開盤價; 開盤 :a1, 2024-01-01, 3d section 最高價; 最高 :after a1 , 2024-01-01, 1d section 最低價; 最低 :after a1 , 2024-01-03, 2d section 收盤價; 收盤 :after a1 , 2024-01-05, 2d
圖二:EURUSD K 線圖
以下是繪製 K 線圖的完整程式碼:
import matplotlib.pyplot as plt
def ohlc_plot_candles(data, window):
sample = data[-window:, ]
for i in range(len(sample)):
plt.vlines(x = i, ymin = sample[i, 2], ymax = sample[i, 1], color = 'black', linewidth = 1)
if sample[i, 3] > sample[i, 0]:
plt.vlines(x = i, ymin = sample[i, 0], ymax = sample[i, 3], color = 'green', linewidth = 3)
elif sample[i, 3] < sample[i, 0]:
plt.vlines(x = i, ymin = sample[i, 3], ymax = sample[i, 0], color = 'red', linewidth = 3)
else:
plt.vlines(x = i, ymin = sample[i, 3], ymax = sample[i, 0] + 0.00003, color = 'black', linewidth = 1.00)
plt.grid()
# 呼叫函式並顯示最後 100 根 K 線
ohlc_plot_candles(my_data, window = 100)
內容解密:
這段程式碼定義了一個名為 ohlc_plot_candles
的函式,用於繪製 K 線圖。它接受兩個引數:data
是包含 OHLC 資料的陣列,window
指定要繪製的 K 線數量。函式內部使用 plt.vlines()
繪製垂直線,黑色細線表示最高價和最低價之間的範圍,綠色粗線表示收盤價高於開盤價(上漲),紅色粗線表示收盤價低於開盤價(下跌)。最後,plt.grid()
顯示網格線。
有些人喜歡用其他顏色繪製 K 線。您可以調整 color
引數來實作。例如,以下程式碼繪製灰色(看漲)和黑色(看跌)的 K 線圖:
import matplotlib.pyplot as plt
def ohlc_plot_candles(data, window):
sample = data[-window:, ]
for i in range(len(sample)):
plt.vlines(x = i, ymin = sample[i, 2], ymax = sample[i, 1], color = 'black', linewidth = 1)
if sample[i, 3] > sample[i, 0]:
plt.vlines(x = i, ymin = sample[i, 0], ymax = sample[i, 3], color = 'grey', linewidth = 3)
elif sample[i, 3] < sample[i, 0]:
plt.vlines(x = i, ymin = sample[i, 3], ymax = sample[i, 0], color = 'black', linewidth = 3)
else:
plt.vlines(x = i, ymin = sample[i, 3], ymax = sample[i, 0] + 0.00003, color = 'black', linewidth = 1.00)
plt.grid()
內容解密:
這段程式碼與前一段程式碼功能相同,只是修改了 K 線的顏色。上漲 K 線使用灰色,下跌 K 線使用黑色。
圖表分析:支撐位和阻力位
圖表分析的任務是透過主觀繪圖找到支撐位和阻力位。無論是水平線還是對角線,這些線都是找到預測市場反應水平的關鍵:
- **支撐位:**市場應該會從這個水平反彈,因為這意味著需求應該高於供應。
- **阻力位:**市場應該會從這個水平回落,因為這意味著供應應該高於需求。
資產在時間軸上的方向有三種:價格創新高的上升趨勢、價格創新低的下降趨勢,以及價格在較長時間內圍繞同一水平波動的橫盤整理(或區間震盪)。
我將在接下來的文章中更深入地探討支撐位、阻力位以及它們在不同市場趨勢中的應用。
解讀市場脈動:技術分析的根本與精髓
技術分析是金融市場中不可或缺的工具,它幫助交易者洞察市場趨勢,預測價格走勢,並做出更明智的交易決策。這篇文章將探討技術分析的核心概念,並著重介紹支撐阻力位、移動平均線和相對強弱指標(RSI)的應用。
支撐阻力位:市場的攻防線
支撐位和阻力位是技術分析中最基礎的概念。它們代表價格可能停止下跌或上漲的水平。當價格接近支撐位時,買方力量可能增強,阻止價格進一步下跌;而當價格接近阻力位時,賣方力量可能增強,阻止價格進一步上漲。
有效的支撐阻力位識別方法有很多,例如:
- 樞紐點位: 透過數學公式計算得出,根據前一日的交易活動預測今日的支撐和阻力水平。
- 移動平均線: 動態指標,緊隨價格波動,可用於識別趨勢和支撐阻力位。
最佳實踐是結合多種技術,提高判斷的準確性。交易是一個機率遊戲,透過整合多種方法,可以提高交易系統的勝率。
指標分析:技術分析的得力助手
指標分析是輔助圖表分析的重要工具,用於驗證交易者的初步判斷。指標可以分為兩類別:
- 趨勢追蹤指標: 識別和交易趨勢市場,預期當前走勢將持續。
- 逆勢指標: 在橫盤市場中更有效,通常標誌著初始走勢的結束,預示著走勢反轉。
以下將介紹兩種重要的技術指標:移動平均線(趨勢追蹤)和相對強弱指標(逆勢)。
移動平均線:解讀趨勢的利器
移動平均線是最常用的趨勢追蹤指標,其簡潔性使其成為最受歡迎的工具之一。它有助於確認和把握趨勢,並可用於尋找支撐阻力位、止損位和目標位。
最常見的移動平均線是簡單移動平均線,它計算收盤價的滾動平均值:
移動平均值 = (Pricei + Pricei-1 + ... + Pricei-n) / n
以下圖表顯示了 USDCAD 的 30 小時簡單移動平均線:
graph LR A[價格] --> B(30小時移動平均線)
移動平均線的使用規則如下:
- 當市場價格高於移動平均線時,表示看漲動能,應尋找做多機會。
- 當市場價格低於移動平均線時,表示看跌動能,應尋找做空機會。
- 當市場價格穿越移動平均線時,表示動能可能發生變化,市場可能進入新的趨勢。
可以結合不同週期的移動平均線產生交易訊號。例如,短期移動平均線向上穿越長期移動平均線,形成黃金交叉,預示市場可能繼續上漲;反之,形成死亡交叉,預示市場可能繼續下跌。
以下程式碼展示瞭如何計算移動平均線:
import numpy as np
import pandas as pd
def add_column(data, num_cols):
"""Adds empty columns to a NumPy array."""
new_data = np.hstack((data, np.empty((data.shape[0], num_cols))))
return new_data
def delete_row(data, num_rows):
"""Deletes rows from the beginning of a NumPy array."""
return data[num_rows:]
def ma(data, lookback, close, position):
data = add_column(data, 1)
for i in range(len(data)):
try:
data[i, position] = (data[i - lookback + 1:i + 1, close].mean())
except IndexError:
pass
data = delete_row(data, lookback)
return data
# Sample data (replace with your actual data)
my_data = np.random.rand(50, 4) # Assuming close price is in the 4th column (index 3)
# Setting parameters
lookback = 30
close_column = 3
ma_column = 4
# Calculating moving average
my_data = ma(my_data, lookback, close_column, ma_column)
print(my_data)
內容解密: 這段程式碼定義了一個 ma
函式,用於計算移動平均線。它接受資料、回溯週期、收盤價列索引和移動平均線列索引作為輸入。函式內部使用迴圈計算每個時間點的移動平均值,並將結果儲存在指定的列中。程式碼中還包含了 add_column
和 delete_row
函式,用於新增和刪除 NumPy 陣列的列和行。
相對強弱指標(RSI):逆勢交易的
RSI 是一種常用的逆勢指標,其值介於 0 到 100 之間。它主要用於識別超買和超賣狀態,並預示價格反轉的可能性。
RSI 的計算步驟如下:
- 計算收盤價的變化。
- 區分正向變化和負向變化。
- 計算正向變化和負向變化絕對值的平滑移動平均線。
- 將平滑後的正向變化除以平滑後的負向變化絕對值,得到相對強度(RS)。
- 應用以下公式計算 RSI:
RSI = 100 - (100 / (1 + RS))
RSI 的使用規則如下:
- 當 RSI 低於 30 時,市場被認為超賣,可能出現向上修正。
- 當 RSI 高於 70 時,市場被認為超買,可能出現向下修正。
- 當 RSI 穿越 50 時,可能出現新的趨勢,但這通常是一個較弱的假設。
以下圖表顯示了 EURUSD 與其 14 週期 RSI:
graph LR A[EURUSD價格] --> B(14週期RSI)
以下程式碼展示瞭如何計算 RSI:
def smoothed_ma(data, alpha, lookback, close, position):
lookback = (2 * lookback) - 1
alpha = alpha / (lookback + 1.0)
beta = 1 - alpha
data = ma(data, lookback, close, position)
data[lookback + 1, position] = (data[lookback + 1, close] * alpha) + (data[lookback, position] * beta)
for i in range(lookback + 2, len(data)):
try:
data[i, position] = (data[i, close] * alpha) + (data[i - 1, position] * beta)
except IndexError:
pass
return data
def rsi(data, lookback, close, position):
data = add_column(data, 5)
for i in range(len(data)):
data[i, position] = data[i, close] - data[i - 1, close]
for i in range(len(data)):
if data[i, position] > 0:
data[i, position + 1] = data[i, position]
elif data[i, position] < 0:
data[i, position + 2] = abs(data[i, position])
data = smoothed_ma(data, 2, lookback, position + 1, position + 3)
data = smoothed_ma(data, 2, lookback, position + 2, position + 4)
data[:, position + 5] = data[:, position + 3] / data[:, position + 4]
data[:, position + 6] = (100 - (100 / (1 + data[:, position + 5])))
data = np.delete(data, np.s_[position:position+6], axis=1) # Use NumPy's delete for columns
data = delete_row(data, lookback)
return data
# Sample data (replace with your actual data)
my_data = np.random.rand(50, 4) # Assuming close price is in the 4th column (index 3)
# Setting parameters
lookback = 14
close_column = 3
rsi_column = 4
# Calculating RSI
my_data = rsi(my_data, lookback, close_column, rsi_column)
print(my_data)
內容解密: 這段程式碼定義了 rsi
函式,用於計算相對強弱指標 (RSI)。它首先計算價格變化,然後區分正向變化和負向變化。接著,使用 smoothed_ma
函式計算平滑移動平均線。最後,根據 RSI 公式計算 RSI 值,並將結果儲存在指定的列中。程式碼中使用了 NumPy 的 delete
函式來刪除多個列,並處理了潛在的 IndexError
異常。
技術指標可以透過多種方式計算,移動平均線和 RSI 是最常用的兩種。理解這些技術分析的概念對於交易者至關重要。