iT邦幫忙

2022 iThome 鐵人賽

DAY 23
0
Software Development

從 Node.js 開發者到量化交易者:打造屬於自己的投資系統系列 第 23

Day 23 - 進場點與出場點:技術指標的應用

  • 分享至 

  • xImage
  •  

前一個主題我們示範了如何製作自己的市場觀察報告,而當我們根據某個概念篩選出投資標的後,接下來就是規劃買賣的進場點與出場點。德國知名投資大師 安德烈.科斯托蘭尼 (André Kostolany)認為,買股票時重要的是時機:「如果在錯誤的時機買賣,即使買賣對的股票你也會輸錢;如果在適當的時機買賣,那麼就算買賣錯的股票你也會賺錢。

市場價格預先反映一切

根據 《金融市場技術分析》作者 約翰· 墨菲(John J. Murphy)在書中提及,技術方法建立在三個基本前提之上:

  • 市場行為預先反映一切:任何足以影響價格的因素,無論是經濟基本面、政治面、心理面等等,都已經預先反映在市場價格中。
  • 價格發展呈現趨勢:既有趨勢繼續發展的可能性大於反轉。順勢交易法的根本精神就是:「停留在既有的趨勢中,直到反轉徵兆出現為止。」
  • 歷史重複發生:在相當程度內,技術分析就是研究人類心理。正如 傑西・李佛摩 所說:「華爾街沒有新鮮事,因為人性從未改變。」

股價主要是反映的是未來,市場價格會預先反映一切,因此規劃進場點時,我們可以透過技術面、基本面的多重確認,增加買進標的的勝率;但規劃出場點時,則必須專注於價格行為,事先決定適當的賣出程序。基於這個原因,我們賣出股票主要依據技術面,而不是基本面,正如 馬克.米奈爾維尼 在《超級績效:金融怪傑交易之道》中說明:「一支股票的基本面如果發生了狀況,在問題明朗化之前,價格行為經常會先出現重大變化,提前透漏出訊息。即使我們完全看不出市場人氣發生變化的理由,但對於這類變化要予以尊重。

迅速認賠而讓獲利部位持續發展」是順勢交易的基本法則,在進場之前就應該決定好出場位置,即便股價走勢不如預期,也應該保障資本,避免損失持續擴大。此外,停損停利亦是一種機會成本考量,讓我們可以將資金重新配置到更具有潛力的機會上。

自我實現的預言 vs. 市場的集體共識

有些人認為技術分析之所以有效,是由於有很多人充分相信這種分析,因而導致其他人根據分析的預測買賣,令技術分析變成「自我實現的預言」 (self-fulfilling prophecy)。這個假設是市場上投資者大都非常熟悉技術分析的型態,並且根據這些形態採取實際的行動,就會造成自我實現的預言在某種型態發生時,大家都買進或賣出,自然造成某種多頭或空頭型態。

事實上,隨著科技及網路的進步,市場上的程式交易者也愈來愈多,許多人都會使用技術指標發出的訊號作為進出場的依據。基於這個理由,我們在運用技術指標的時候,並不是複雜的愈好,而是愈多人參考的技術指標它的代表意義就愈強,並且愈可能會成為「市場的集體共識」。

移動平均線

技術指標主要可以分為 趨勢指標擺盪指標。在所有趨勢指標中,移動平均(moving average)是最簡單、也是市場上最多人參考的技術指標。移動平均特別適用於趨勢明確的行情,許多機械式的順勢交易系統,都是以移動平均為基礎。移動平均的價格序列,可以在K線圖上繪製成 移動平均線,簡稱 均線,它的計算方式是:

均線價格 = 採樣天數的收盤價合計 / 採樣天數

在臺股最常被參考的移動平均線有 6 條,依時間長短可劃分為短期、中期、長期均線:

  • 短期均線5 日均線10 日均線。通常一週的交易日為 5 日,所以 5 日均線又稱為「週線」,10 日均線稱為「雙週線」。
  • 中期均線20 日均線60 日均線。一個月有 4 週,一週有 5 個交易日,所以 20 日線又稱為「月線」,60 日均線稱為「季線」。
  • 長期均線120 日均線240 日均線。120 日線稱為「半年線」,240 日均線稱為「年線」。

移動平均線代表某段時間投資人買進的平均成本,因此可視為股價的 支撐線 或是 壓力線。投資人可以依照自己的操作週期,參考不同天期的移動平均線。

支撐(Support)和壓力(Resistance)是在技術分析中兩個相對的概念。支撐表示買方力量強,會使股價上升;壓力表示賣方力量強,會使股價下跌。故支撐線就是股價停止下跌並反彈的位置;而壓力線則是股價停止上漲並下跌的位置。

葛蘭碧八大法則

葛蘭碧八大法則(J.Granville Rules)是由美國投資專家 葛蘭碧(Joseph Granville)所歸納與整理。葛蘭碧認為股價的變動具有某種規律性,而移動平均線代表趨勢,因此利用股價與移動平均線的相關性與乖離狀況,可以作為進出場的參考依據。

Source:OANDA

葛蘭碧歸納出,在上揚的移動平均線中,有 3 個買進點與 1 個賣出點;在下降的移動平均線中,有 1 個買進點與 3 個賣出點,總共有 8 個進出場的時機點:

  • 突破-股價突破移動平均線後上揚:當股價由下向上穿越移動平均線,並且移動平均線開始上揚時,表示原本的趨勢即將反轉,視為買進訊號。
  • 假跌破-股價下跌但移動平均線上揚:股價短暫跌破移動平均線,但隨即又漲回移動平均線之上,並且移動平均線仍然呈現上揚走勢,代表多方趨勢未變,此時為假跌破,視為買進訊號。
  • 支撐-移動平均線為支撐線:股價走在移動平均線之上,期間雖然下跌但是未跌破移動平均線,而且回測至移動平均線後隨即上漲,表示移動平均線為支撐線,視為買進訊號。
  • 反彈-負乖離過大容易有反彈:股價急速下跌,並且遠遠偏離移動平均線時,表示負乖離過大,容易出現短線搶短買盤,視為買進訊號。
  • 跌破-股價跌破移動平均線後下降:當股價由上向下穿越移動平均線,並且移動平均線開始下降時,表示原本的趨勢即將反轉,視為賣出訊號。
  • 假突破-股價上漲但移動平均線下降:股價短暫突破移動平均線,但隨即又跌回移動平均線之下,並且移動平均線仍然呈現下降走勢,表示空方趨勢未變,此時為假突破,視為賣出訊號。
  • 壓力-移動平均線為壓力線:股價走在移動平均線之下,期間雖然上漲但是未突破移動平均線,而且反彈至移動平均線後隨即下跌,表示移動平均線為壓力線,視為賣出訊號。
  • 反轉-正乖離過大容易有賣壓:股價急速上漲,並且遠遠偏離移動平均線時,表示正乖離過大,容易出現獲利了結賣壓,視為賣出訊號。

葛蘭碧八大法則可以作為規劃進出場點的參考,但需要注意的是,這 8 個時機點沒有先後順序,也不一定都會出現,仍必須依股價與移動平均線的狀況判定,並可搭配其他技術指標、型態等分析方法作為輔助參考。

除了葛蘭碧八大法則外,另一種常見的做法是利用兩條長短不同天期的移動平均線的交叉作為買賣訊號。當短天期移動平均線由下往上突破長天期移動平均線時,一般稱之為 黃金交叉,是買進的訊號;若短天期移動平均線由上往下跌破長天期移動平均線時,一般稱之為 死亡交叉,是賣出的訊號。

實作:計算移動平均線

暸解移動平均線的基本應用之後,我們要進入實作的部分。在前面的篇章已經示範如何將歷史股價存進至資料庫,因此假設我們已經從證交所及櫃買中心取得了一段時間的所有股票的歷史股價。

在 NPM 上已有許多套件可以幫助我們計算各種技術指標,比較多人使用的有 technicalindicatorstulindtalib 等。

其中 technicalindicators 是以 TypeScript 撰寫,包含了 26 種常見的技術指標,這裡我們使用它做範例。請打開終端機,安裝該套件:

$ npm install --save technicalindicators

安裝完畢後,開啟 src/ticker/ticker.repository.ts 檔案,在 TickerRepository 實作 getTickerSMAs() 方法,我們以短、中期均線為例,分別計算 5 日、10 日、20 日以及 60 日移動平均線:

import { DateTime } from 'luxon';
import { find } from 'lodash';
import { SMA } from 'technicalindicators';
import { Model } from 'mongoose';
import { Injectable } from '@nestjs/common';
import { InjectModel } from '@nestjs/mongoose';
import { TickerType, Market, Index } from '@speculator/common';
import { Ticker, TickerDocument } from './ticker.schema';

@Injectable()
export class TickerRepository {
  constructor(
    @InjectModel(Ticker.name) private readonly model: Model<TickerDocument>,
  ) {}

  ...

  async getTickerSMAs(symbol: string, options?: { date?: string, days?: number }) {
    const date = options?.date || DateTime.local().toISODate();
    const days = options?.days || 60;

    const results = await this.model.aggregate([
      { $match: { symbol, date: { $lte: date } }},
      { $sort: { date: -1 } },
      { $project: {
        _id: 0,
        date: 1,
        open: '$openPrice',
        high: '$highPrice',
        low: '$lowPrice',
        close: '$closePrice',
        volume: '$tradeVolume' },
      },
      { $limit: days },
    ]);

    const values = results.map(data => data.close);

    const sma5 = SMA.calculate({ period: 5 , values });
    const sma10 = SMA.calculate({ period: 10 , values });
    const sma20 = SMA.calculate({ period: 20 , values });
    const sma60 = SMA.calculate({ period: 60 , values });

    const data = results.map((ticker, i) => ({
      ...ticker,
      sma5: sma5[i],
      sma10: sma10[i],
      sma20: sma20[i],
      sma60: sma60[i],
    }));

    return data;
  }
}

getTickerSMAs() 方法的 options 選項參數中,date 可選擇最後一筆股價的日期,days 則表示選定日期往前回推的天數。完成後,我們只要呼叫 TickerRepositorygetTickerSMAs() 方法,就可以從資料庫取得歷史股價,並且取得 5 日、10 日、20 日以及 60 日移動平均線。以下台積電(2330)在日期 2022-07-01 的資料為例:

[
  {
    date: '2022-07-01',
    open: 471.5,
    high: 474,
    low: 452.5,
    close: 453.5,
    volume: 72597018,
    sma5: 483.3,
    sma10: 488.6,
    sma20: 506.15,
    sma60: 529.1333333333333
  },
  ... 59 more items
]

移動平均 是最常見的技術指標,其他臺股投資人常用的趨勢指標還有 MACD(Moving Average Convergence Divergence)以及擺盪指標如 KD(Stochastic Oscillator)、RSI(Relative Strength Index)等。這些常見的技術指標 technicalindicators 套件都有提供它們的計算方法,如需取得這些指標可參考官方 Repo 提供的範例。

註:技術分析除了運用多種技術指標外,還包含形態學與圖形分析,主要是根據股價走勢所形成的圖形,辨識出目前股價的行為,推測股價未來可能的發展趨勢。不過這已超出本系列文的範圍,因此我們以市場上最常用的移動平均線做為範例說明。

本日小結

  • 如果在錯誤的時機買賣,即使對的股票也會輸錢;如果在適當的時機買賣,那麼就算錯的股票也會賺錢。
  • 規劃進場點時,可以透過技術面、基本面與籌碼面的多重確認,增加買進標的的勝率;但規劃出場點時,則必須專注於價格行為,事先決定適當的賣出程序。
  • 技術指標主要可以分為趨勢指標和擺盪指標。在所有趨勢指標中,移動平均是最簡單、也是市場上最多人參考的技術指標。
  • 移動平均線代表某段時間投資人買進的平均成本,可視為股價的壓力線或是支撐線。投資人可以依照操作週期的不同,參考不同天期的移動平均線。
  • 在葛蘭碧八大法則中,歸納出在上揚的移動平均線中,有 3 個買進點與 1 個賣出點;在下降的移動平均線中,有 1 個買進點與 3 個賣出點。
  • 暸解如何運用已取得的歷史股價,實作計算移動平均線的方法。

Node.js 量化投資全攻略:從資料收集到自動化交易系統建構實戰
本系列文已正式出版為《Node.js 量化投資全攻略:從資料收集到自動化交易系統建構實戰》。本書新增了全新內容和實用範例,為你提供更深入的學習體驗!歡迎參考選購,開始你的量化投資之旅!
天瓏網路書店連結:https://www.tenlong.com.tw/products/9786263336070


上一篇
Day 22 - 我的市場觀察:建立自己的盤後報告(下)
下一篇
Day 24 - 即時行情監控:富果行情 API 與 LINE Notify 的應用(上)
系列文
從 Node.js 開發者到量化交易者:打造屬於自己的投資系統31
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言