# DBL Fin (06/12)
###### tags: `DBL`
---
[TOC]
---
<style>
.markdown-body
{
max-width: 960px !important;
}
</style>
:::info
- **`w06`**、**`w07`**
**K 線型態、KD 指標**:單日、兩日K線型態、成交量、股價高低檔程式判斷、KD 值運算與交叉
- [**`w08`**](https://docs.google.com/presentation/d/1ymDWEvedHu-7L-PyxoRsB6CzpGnU2hAU/edit)
**葛蘭碧八大法則_1**:均線趨勢判斷、rule 1 突破
- [**`w09`**](https://docs.google.com/presentation/d/1BzcnpUFnTyQqnDk2jC2kX0HRkTCnaZRE/edit)
**葛蘭碧八大法則_2**:葛蘭碧八大法則實作
- [**`w10`**](https://docs.google.com/presentation/d/11Ey9TpFnvbBhohYaOOcHLpBwPOxaGOUb/edit)
**葛蘭碧八大法則_驗證**:葛蘭碧八大法則驗證及繪圖
- [**`w11`**](https://docs.google.com/presentation/d/1d88UEJp6HnvbrZz6aDJRSqQQPuKOcA9_/edit)
**趨勢判斷**:尋找最大 / 最小值與趨勢判斷
- [**`w12`**](https://docs.google.com/presentation/d/1zQqInKM58YcTbaB1qMzSbHKmwuuPH18w/edit)
**切線關係、轉折波**:切線關係比較、了解 W 底 M 頭判讀及應用、畫出轉折波輔助識別 M W
- [**`w13`**](https://docs.google.com/presentation/d/19kIR331hr6wg1DYaVMM65nR7zS1EF9jw/edit)
**W 底 M 頭、三重底 / 頂**:了解三重頂 / 底之判讀及應用、繪製 W 底 M 頭、三重頂 / 底
:::
## 飆股九陰真經
### 成交量、價量關係
- **成交量**(Volume):就是某個時段中買賣雙方成交的數量
- <font color="red">**紅色**</font>代表今日股價比昨日股價**高**
<font color="green">**綠色**</font>代表今日股價比昨日股價**低**
<font color="orange">**黃色**</font>(<font color="grey">**灰色**</font>)代表價格**持平**
- **極大量、大量、小量、極小量**

> *成交量是股市的**元氣**,股價只不過是**量的表現**而已,股市成交量通常比股市**先行**!*
### 高檔 / 低檔
- **高檔**:股價相對高
**低檔**:股價相對低
- 可以用來判斷例如**高檔爆大量/低檔大量**等情況發生,再去做決策
### KD 指標
- **KD 指標(隨機指標,Stochastic Oscillator)**:K 值、D 值
- 範圍:**0 ~ 100**
- ---> **股價強弱勢**、**股價轉折點**
- 使用 **RSV(Raw Stochastic Value;未成熟隨機值)** 來計算:

- 最近 N 天中,股價表現強弱 **(通常 $N = 9$)**

- **K 值(快線)**:今日 RSV 與昨日 K 值的加權平均 ---> 反應較為**靈敏**
**D 值(慢線)**:加權平均過的 K 值與昨日 D 值再一次平滑 ---> 反應較**不靈敏**
- 
**K 值 > D 值**:漲 ---> 偏多操作
**K 值 < D 值**:跌 ---> 偏空操作
**KD 值 > 80**:**高檔超買區** ---> 強 ---> 漲
**KD 值 < 20**:**低檔超賣區** ---> 弱 ---> 跌
### KD 黃金 / 死亡交叉
- **KD 黃金交叉**:**「低檔超賣區」** & **「K 值往上突破 D 值」** ---> **買進**
**KD 死亡交叉**:**「高檔超買區」** & **「K 值往下跌破 D 值」** ---> **賣出**
- **KD 指標**:
- **黃金交叉 + 成交量加大** ---> 更適合**買入**
- **相對高位、相對低位**~~(絕對高位、絕對低位)~~
- 適合**股價震盪**階段,否則會**鈍化**(長時間維持在高檔、低檔)
- **背離**:股價趨勢與 KD 指標趨勢不一致
### 葛蘭碧八大法則
- **葛蘭碧法則(Granville Theopry)**:
- 美國知名量價分析專家 **葛蘭碧(Joseph Granville)** 所創
- **價格**、**移動平均線**的關係 ---> **買進 / 賣出訊號**
- **均線趨勢判斷**:上升、下降、平緩(盤整)
- **?**:回看天數與趨勢閾值天數
- **葛蘭碧八大法則**:

1. **(<font color="red">買</font>)突破**:**「MA 下 ---> 平 / 上」+「股價突破 MA」**
2. **(<font color="red">買</font>)假跌破**:**「MA 上」+「股價跌破 MA 再突破 MA」**,**(騙線)**
- **?**:幾天內回均線上
3. **(<font color="red">買</font>)支撐**:**「MA 上」+「股價下跌未破 MA 再上漲」**
- **?**:回看天數、判斷下跌或上升、靠均線多近、判斷反彈或反壓、後看是否破均線
4. **(<font color="red">買</font>)抄底**:**「MA 下」+「股價負乖離過大」**
- **?**:乖離值、正負乖門檻砍是否相同、超過門檻後是否看後面趨勢
5. **(<font color="green">賣</font>)跌破**:**「MA 上 ---> 平 / 下」+「股價跌破 MA」**
6. **(<font color="green">賣</font>)假突破**:**「MA 下」+「股價突破 MA 再跌破 MA」**
- **?**:幾天內回均線下
7. **(<font color="green">賣</font>)反壓**:**「MA 下」+「股價上漲未破 MA 再下跌」**
- **?**:回看天數、判斷下跌或上升、靠均線多近、判斷反彈或反壓、後看是否破均線
8. **(<font color="green">賣</font>)反轉**:**「MA 上」+「股價正乖離過大」**
- **?**:乖離值、正負乖門檻砍是否相同、超過門檻後是否看後面趨勢
### 均線乖離率(MA Bias)
- **股價偏離平均線的百分比** ---> 方便衡量目前**股價與均線的距離**
- $$均線乖離率 = \frac{收盤價 - 移動平均價}{移動平均價} \times 100\ \% = (\frac{收盤價}{移動平均價} - 1) * 100\ \%$$
### 多頭、空頭、盤整
- **多頭(頭頭高、底底高)**:

- **空頭(頭頭低、底底低)**:

- **盤整**:

- **判斷方法**:
- 利用 MA5 找出**上漲(高於均線)和下跌(低於均線)區間**
---> 找出區間中的**極大(上漲)極小(下跌)值**
---> 利用極值判斷**多頭、空頭、盤整**
### 切線關係

- **支撐線**:
- 股價**下跌到某個價位**附近
---> **買方增加、賣方減少**
---> 股價**停止下跌**,甚至**可能回升**
- **壓力線**:
- 股價**上漲到某價位**附近時
---> **買方減少、賣方增加**
---> 股價**停止上漲**,甚至**可能回落**
- **切線斜率**:
- $收盤價差 - 開市日數$
- **正斜率大** ---> 股價**成長的速度加快**
**正斜率小** ---> 股價**走勢將會變化成盤整或是開始下跌**
**負斜率大** ---> 股價**走勢將會變化成盤整或是開始上漲**
**負斜率小** ---> 股價**下跌的速度加快**
- 日期選擇:
- 極大值
- 極小值
- 設一個固定的日期間隔
### ==W 底 M 頭==
> ==圖很重要==
- **W 底(W 型(W Shape) / 雙重底(Double Bottoms))**:
當股價下跌又反彈至一高點,再度下跌後又反彈,直至突破頸線
---> **會上漲、做多**

- **頸線**:**W 中間高點畫水平線**
- **M 頭(M 型(M Shape) / 雙重頂(Double Tops))**:
當股價上漲又反彈至一低點,再度上漲後又反彈,直至突破頸線
---> **會下跌、做空**

- **頸線**:**M 中間低點畫水平線**
- **識別方法**:
- **區域極值**
---> **判斷趨勢**
---> **轉折點**
---> **轉折波**
---> **WM 圖形**
- **找出圖形**
| 圖形 | 圖示 | 條件 |
|:-----:|:---------------------------------------------------:|:-------------------------------------------------------------------- |
| **W** |  | 1. $b,d < c$<br>2. $abs(b - d) \le mean(b, d) * k\ \%$<br>3. $a \ge c$ |
| **M** |  | 1. $b,d > c$<br>2. $abs(b - d) \le mean(b, d) * k\ \%$<br>3. $a \le c$ |
### 三重底 / 三重頂
- **三重底(Triple Bottoms) / 頭肩底(Inverse Head and Shoulders)**
當股價連續下跌又反彈至一高點,直至突破頸線
---> **會上漲、做多**

- **頸線**:**中間兩個高點連線 ==(與 W 不同)==**
- **三重頂(Triple Tops) / 頭肩頂(Head and Shoulders)**
當股價連續上漲又反彈至一低點,直至跌破頸線
---> **會下跌、做空**

- **頸線**:**中間兩個低點連線 ==(與 M 不同)==**
- **識別方法**:與 WM 圖形識別方法一樣
- **找出圖形**
| 圖形 | 圖示 | 條件 |
|:-----:|:---------------------------------------------------:|:-------------------------------------------------------------------- |
| **三重底** |  | 1. $d < b,c,e,f$<br>2. $b < c,\ f < e$<br>3. $abs(c - e) \le mena(c, e) * k\ \%$ |
| **三重頂** |  | 1. $d > b,c,e,f$<br>2. $b > c,\ f > e$<br>3. $abs(c - e) \le mena(c, e) * k\ \%$ |
## SQL 奇技淫巧
### `ROW_NUMBER()`:行號
```sql=
SELECT ROW_NUMBER() OVER (ORDER BY a_col DESC) AS ROWID
FROM a_table;
```
### `PARTITION BY`:分組計算
```sql=
SELECT ROW_NUMBER() OVER (PARTITION BY col_a ORDER BY col_b DESC) AS ROWID
FROM a_table;
```
### `CROSS APPLY`:欄位帶入逐一查詢資料列並加入
```sql=
SELECT *
FROM a_table AS t1
CROSS APPLY ( -- find the second large a_col
SELECT TOP 1 *
FROM a_table
WHERE a_col <= t1.a_col
ORDER BY a_col DESC) AS t2;
```
### ==W12 - P1 - 斜率關係變化==
> ==期末考會考==
| 切線斜率 | 股票走勢 |
|:------------------:|:------------:|
| **正斜率變大** | 價格加速上漲 |
| **正斜率變小** | 上漲速度趨緩 |
| **負斜率轉正斜率** | 轉為上漲 |
| **負斜率變大** | 下跌速度趨緩 |
| **負斜率變小** | 價格加速下跌 |
| **正斜率轉負斜率** | 轉為下跌 |
| **其他** | 狀況不變 |
```sql=
SELECT *
FROM @date_select AS T1 -- 當前日期
CROSS APPLY ( -- 取得前一個日期
SELECT TOP 1 *
FROM @date_select
WHERE date < T1.date
ORDER BY date DESC
) AS T2;
```
```sql=
CREATE OR ALTER FUNCTION [dbo].[slope_trend]
(
@company VARCHAR(10),
@interval_size INT,
@StatementType NVARCHAR(20) = ''
)
RETURNS @Result_Table TABLE
(
start_date DATE,
start_day_price REAL,
end_date DATE,
end_day_price REAL,
slop REAL,
trend NVARCHAR(20)
)
AS
BEGIN
DECLARE @date_select TABLE
(
date DATE NOT NULL,
close_price REAL NOT NULL
);
-- 根據 INPUT,挑選出要比較的日期
IF @StatementType = 'Extremum_MAX'
BEGIN
INSERT @date_select (date, close_price)
SELECT date, close_price
FROM dbo.find_max_min(@company)
WHERE max_min = 1
ORDER BY date DESC;
END
ELSE
IF @StatementType = 'Extremum_MIN'
BEGIN
INSERT @date_select (date, close_price)
SELECT date, close_price
FROM dbo.find_max_min(@company)
WHERE max_min = 0
ORDER BY date DESC;
END
ELSE IF @StatementType = 'Interval'
BEGIN
-- 先為 stock_price 中的資料依據日期給予編號,再依據 INPUT 決定多久要找一次斜率
INSERT @date_select (date, close_price)
SELECT T1.date, T1.c
FROM (SELECT ROW_NUMBER() OVER (ORDER BY date DESC) AS ROW, date, c
FROM [dbo].[stock_price]
WHERE stock_code = @company) AS T1
WHERE (T1.ROW % @interval_size) = 1;
END
-- 設定斜率的起始日期和結束日期,並計算斜率
INSERT INTO @Result_Table (start_date, start_day_price, end_date, end_day_price)
SELECT T2.date, T2.close_price, T1.date, T1.close_price
FROM @date_select AS T1
CROSS APPLY ( -- 取得前一個日期
SELECT TOP 1 *
FROM @date_select
WHERE date < T1.date
ORDER BY date DESC
) AS T2;
UPDATE @Result_Table
SET slop = [dbo].[slope_calculate](@company, start_date, end_date)
WHERE 0 = 0;
-- 根據不同的情況,判斷股票走勢的變化
UPDATE @Result_Table
SET trend = (
CASE WHEN T1.slop > T2.slop AND T1.slop > 0 AND T2.slop > 0 THEN N'價格加速上漲'
WHEN T1.slop < T2.slop AND T1.slop > 0 AND T2.slop > 0 THEN N'上漲速度趨緩'
WHEN T1.slop > 0 AND T2.slop < 0 THEN N'轉為上漲'
WHEN T1.slop > T2.slop AND T1.slop < 0 AND T2.slop < 0 THEN N'下跌速度趨緩'
WHEN T1.slop < T2.slop AND T1.slop < 0 AND T2.slop < 0 THEN N'價格加速下跌'
WHEN T1.slop < 0 AND T2.slop > 0 THEN N'轉為下跌'
ELSE N'狀況不變'
END
)
FROM @Result_Table AS T1
CROSS APPLY ( -- 取得前一個日期
SELECT TOP 1 *
FROM @Result_Table
WHERE start_date < T1.start_date
ORDER BY start_date DESC
) AS T2;
RETURN;
END;
GO;
```
## Python 葵花寶典
### `mplfinance` - `make_addlpot(...)`:加入標記點
```python=
def draw_candlestick(stock_prices=None, buy_or_sells=None):
if stock_prices is None or len(stock_prices) == 0 or \
buy_or_sells is None or len(buy_or_sells) == 0:
return
# Create a new dataframe
stock_prices_df = pd.DataFrame([list(e) for e in stock_prices])
# Use the 1st column (datetime) as its index
stock_prices_df.index = pd.to_datetime(stock_prices_df[0])
stock_prices_df.index.name = "Date"
# Drop the 1st column (datetime)
stock_prices_df = stock_prices_df.drop(columns=[0])
# Set columns' names
stock_prices_df.columns = ["Open", "High", "Low", "Close", "Volume"]
# Set chart styles
mc = mpf.make_marketcolors(up="r", down="g", edge="",
wick="inherit", volume="inherit")
s = mpf.make_mpf_style(base_mpf_style="charles", marketcolors=mc)
# Transform signals for each dates
# `np.nan` means no signals here
bs_dict = dict(buy_or_sells)
buy_signals = [p[4] if bs_dict.get(p[0]) == 1 else np.nan for p in stock_prices]
sell_signals = [p[4] if bs_dict.get(p[0]) == -1 else np.nan for p in stock_prices]
# Combine buying and selling signals
# Use `make_addplot(...)` to make plots
apds = [
mpf.make_addplot(sell_signals, type='scatter', markersize=200, marker='^', color="g"),
mpf.make_addplot(buy_signals, type='scatter', markersize=200, marker='v', color="y")
]
# Draw the chart
mpf.plot(stock_prices_df, type='candle', style=s, mav=20, addplot=apds)
```
### `mplfinance` - 轉折波
==TODO==
### `mplfinance` - 畫出 WM
==TODO==
### `mplfinance` - 畫出三重底 / 頂
==TODO==
## その他