前一個主題我們示範了如何製作自己的市場觀察報告,而當我們根據某個概念篩選出投資標的後,接下來就是規劃買賣的進場點與出場點。德國知名投資大師 安德烈.科斯托蘭尼 (André Kostolany)認為,買股票時重要的是時機:「如果在錯誤的時機買賣,即使買賣對的股票你也會輸錢;如果在適當的時機買賣,那麼就算買賣錯的股票你也會賺錢。」
根據 《金融市場技術分析》作者 約翰· 墨菲(John J. Murphy)在書中提及,技術方法建立在三個基本前提之上:
股價主要是反映的是未來,市場價格會預先反映一切,因此規劃進場點時,我們可以透過技術面、基本面的多重確認,增加買進標的的勝率;但規劃出場點時,則必須專注於價格行為,事先決定適當的賣出程序。基於這個原因,我們賣出股票主要依據技術面,而不是基本面,正如 馬克.米奈爾維尼 在《超級績效:金融怪傑交易之道》中說明:「一支股票的基本面如果發生了狀況,在問題明朗化之前,價格行為經常會先出現重大變化,提前透漏出訊息。即使我們完全看不出市場人氣發生變化的理由,但對於這類變化要予以尊重。」
「迅速認賠而讓獲利部位持續發展」是順勢交易的基本法則,在進場之前就應該決定好出場位置,即便股價走勢不如預期,也應該保障資本,避免損失持續擴大。此外,停損停利亦是一種機會成本考量,讓我們可以將資金重新配置到更具有潛力的機會上。
有些人認為技術分析之所以有效,是由於有很多人充分相信這種分析,因而導致其他人根據分析的預測買賣,令技術分析變成「自我實現的預言」 (self-fulfilling prophecy)。這個假設是市場上投資者大都非常熟悉技術分析的型態,並且根據這些形態採取實際的行動,就會造成自我實現的預言在某種型態發生時,大家都買進或賣出,自然造成某種多頭或空頭型態。
事實上,隨著科技及網路的進步,市場上的程式交易者也愈來愈多,許多人都會使用技術指標發出的訊號作為進出場的依據。基於這個理由,我們在運用技術指標的時候,並不是複雜的愈好,而是愈多人參考的技術指標它的代表意義就愈強,並且愈可能會成為「市場的集體共識」。
技術指標主要可以分為 趨勢指標 和 擺盪指標。在所有趨勢指標中,移動平均(moving average)是最簡單、也是市場上最多人參考的技術指標。移動平均特別適用於趨勢明確的行情,許多機械式的順勢交易系統,都是以移動平均為基礎。移動平均的價格序列,可以在K線圖上繪製成 移動平均線,簡稱 均線,它的計算方式是:
均線價格 = 採樣天數的收盤價合計 / 採樣天數
在臺股最常被參考的移動平均線有 6 條,依時間長短可劃分為短期、中期、長期均線:
移動平均線代表某段時間投資人買進的平均成本,因此可視為股價的 支撐線 或是 壓力線。投資人可以依照自己的操作週期,參考不同天期的移動平均線。
支撐(Support)和壓力(Resistance)是在技術分析中兩個相對的概念。支撐表示買方力量強,會使股價上升;壓力表示賣方力量強,會使股價下跌。故支撐線就是股價停止下跌並反彈的位置;而壓力線則是股價停止上漲並下跌的位置。
葛蘭碧八大法則(J.Granville Rules)是由美國投資專家 葛蘭碧(Joseph Granville)所歸納與整理。葛蘭碧認為股價的變動具有某種規律性,而移動平均線代表趨勢,因此利用股價與移動平均線的相關性與乖離狀況,可以作為進出場的參考依據。
Source:OANDA
葛蘭碧歸納出,在上揚的移動平均線中,有 3 個買進點與 1 個賣出點;在下降的移動平均線中,有 1 個買進點與 3 個賣出點,總共有 8 個進出場的時機點:
葛蘭碧八大法則可以作為規劃進出場點的參考,但需要注意的是,這 8 個時機點沒有先後順序,也不一定都會出現,仍必須依股價與移動平均線的狀況判定,並可搭配其他技術指標、型態等分析方法作為輔助參考。
除了葛蘭碧八大法則外,另一種常見的做法是利用兩條長短不同天期的移動平均線的交叉作為買賣訊號。當短天期移動平均線由下往上突破長天期移動平均線時,一般稱之為 黃金交叉,是買進的訊號;若短天期移動平均線由上往下跌破長天期移動平均線時,一般稱之為 死亡交叉,是賣出的訊號。
暸解移動平均線的基本應用之後,我們要進入實作的部分。在前面的篇章已經示範如何將歷史股價存進至資料庫,因此假設我們已經從證交所及櫃買中心取得了一段時間的所有股票的歷史股價。
在 NPM 上已有許多套件可以幫助我們計算各種技術指標,比較多人使用的有 technicalindicators、tulind、talib 等。
其中 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
則表示選定日期往前回推的天數。完成後,我們只要呼叫 TickerRepository
的 getTickerSMAs()
方法,就可以從資料庫取得歷史股價,並且取得 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 提供的範例。
註:技術分析除了運用多種技術指標外,還包含形態學與圖形分析,主要是根據股價走勢所形成的圖形,辨識出目前股價的行為,推測股價未來可能的發展趨勢。不過這已超出本系列文的範圍,因此我們以市場上最常用的移動平均線做為範例說明。
本系列文已正式出版為《Node.js 量化投資全攻略:從資料收集到自動化交易系統建構實戰》。本書新增了全新內容和實用範例,為你提供更深入的學習體驗!歡迎參考選購,開始你的量化投資之旅!
天瓏網路書店連結:https://www.tenlong.com.tw/products/9786263336070