---
# System prepended metadata

title: DBL Fin (06/12)
tags: [DBL]

---

# 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>）代表價格**持平**
- **極大量、大量、小量、極小量**

![](https://hackmd.io/_uploads/ryV1zJzv3.png)
> *成交量是股市的**元氣**，股價只不過是**量的表現**而已，股市成交量通常比股市**先行**！*

### 高檔 / 低檔
- **高檔**：股價相對高
    **低檔**：股價相對低
- 可以用來判斷例如**高檔爆大量／低檔大量**等情況發生，再去做決策

### KD 指標
- **KD 指標（隨機指標，Stochastic Oscillator）**：K 值、D 值
    - 範圍：**0 ～ 100**
    - ---> **股價強弱勢**、**股價轉折點**
- 使用 **RSV（Raw Stochastic Value；未成熟隨機值）** 來計算：
    ![](https://hackmd.io/_uploads/SJ9B0xMvn.png =440x)![](https://hackmd.io/_uploads/SyCS0lGw3.png =440x)
    - 最近 N 天中，股價表現強弱 **（通常 $N = 9$）**
    ![](https://hackmd.io/_uploads/r1BckbGPh.png)
- **K 值（快線）**：今日 RSV 與昨日 K 值的加權平均 ---> 反應較為**靈敏**
    **D 值（慢線）**：加權平均過的 K 值與昨日 D 值再一次平滑 ---> 反應較**不靈敏**
- ![](https://hackmd.io/_uploads/B1Y5g-Mv3.png =300x)
    **K 值 > D 值**：漲 ---> 偏多操作
    **K 值 < D 值**：跌 ---> 偏空操作
    **KD 值 > 80**：**高檔超買區** ---> 強 ---> 漲
    **KD 值 < 20**：**低檔超賣區** ---> 弱 ---> 跌

### KD 黃金 / 死亡交叉
- **KD 黃金交叉**：**「低檔超賣區」** & **「K 值往上突破 D 值」** ---> **買進**
    **KD 死亡交叉**：**「高檔超買區」** & **「K 值往下跌破 D 值」** ---> **賣出**
- **KD 指標**：
    - **黃金交叉 + 成交量加大** ---> 更適合**買入**
    - **相對高位、相對低位**~~（絕對高位、絕對低位）~~
    - 適合**股價震盪**階段，否則會**鈍化**（長時間維持在高檔、低檔）
    - **背離**：股價趨勢與 KD 指標趨勢不一致

### 葛蘭碧八大法則
- **葛蘭碧法則（Granville Theopry）**：
    - 美國知名量價分析專家 **葛蘭碧（Joseph Granville）** 所創
    - **價格**、**移動平均線**的關係 ---> **買進 / 賣出訊號**
- **均線趨勢判斷**：上升、下降、平緩（盤整）
    - **？**：回看天數與趨勢閾值天數
- **葛蘭碧八大法則**：
    ![](https://hackmd.io/_uploads/SygcOcWfwn.png)
    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\ \%$$

### 多頭、空頭、盤整
- **多頭（頭頭高、底底高）**：
    ![](https://hackmd.io/_uploads/HJ8huMzPn.png =400x)
- **空頭（頭頭低、底底低）**：
    ![](https://hackmd.io/_uploads/ryRhOGMDh.png =400x)
- **盤整**：
    ![](https://hackmd.io/_uploads/SkOWtGfD2.png =400x)
- **判斷方法**：
    - 利用 MA5 找出**上漲（高於均線）和下跌（低於均線）區間**
        ---> 找出區間中的**極大（上漲）極小（下跌）值**
        ---> 利用極值判斷**多頭、空頭、盤整**

### 切線關係
![](https://hackmd.io/_uploads/rkAlCfzD2.png)
- **支撐線**：
    - 股價**下跌到某個價位**附近
        ---> **買方增加、賣方減少**
        ---> 股價**停止下跌**，甚至**可能回升**
- **壓力線**：
    - 股價**上漲到某價位**附近時
        ---> **買方減少、賣方增加**
        ---> 股價**停止上漲**，甚至**可能回落**
- **切線斜率**：
    - $收盤價差 - 開市日數$
    - **正斜率大** ---> 股價**成長的速度加快**
        **正斜率小** ---> 股價**走勢將會變化成盤整或是開始下跌**
        **負斜率大** ---> 股價**走勢將會變化成盤整或是開始上漲**
        **負斜率小** ---> 股價**下跌的速度加快**
    - 日期選擇：
        - 極大值
        - 極小值
        - 設一個固定的日期間隔

### ==W 底 M 頭==
> ==圖很重要==
- **W 底（W 型（W Shape） / 雙重底（Double Bottoms））**：
    當股價下跌又反彈至一高點，再度下跌後又反彈，直至突破頸線
    ---> **會上漲、做多**
    ![](https://hackmd.io/_uploads/BkQHP7fD3.png =400x)
    - **頸線**：**W 中間高點畫水平線**
- **M 頭（M 型（M Shape） / 雙重頂（Double Tops））**：
    當股價上漲又反彈至一低點，再度上漲後又反彈，直至突破頸線
    ---> **會下跌、做空**
    ![](https://hackmd.io/_uploads/B135P7GD3.png =400x)
    - **頸線**：**M 中間低點畫水平線**
- **識別方法**：
    - **區域極值**
        ---> **判斷趨勢**
        ---> **轉折點**
        ---> **轉折波**
        ---> **WM 圖形**
- **找出圖形**
    | 圖形  |                        圖示                         | 條件                                                                 |
    |:-----:|:---------------------------------------------------:|:-------------------------------------------------------------------- |
    | **W** | ![](https://hackmd.io/_uploads/By8jTQfD3.png =200x) | 1. $b,d < c$<br>2. $abs(b - d) \le mean(b, d) * k\ \%$<br>3. $a \ge c$ |
    | **M** | ![](https://hackmd.io/_uploads/Hk9aaXMv3.png =200x) | 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）**
    當股價連續下跌又反彈至一高點，直至突破頸線
    ---> **會上漲、做多**
    ![](https://hackmd.io/_uploads/Sko2MNMwh.png =450x)
    - **頸線**：**中間兩個高點連線 ==（與 W 不同）==**
- **三重頂（Triple Tops） / 頭肩頂（Head and Shoulders）**
    當股價連續上漲又反彈至一低點，直至跌破頸線
    ---> **會下跌、做空**
    ![](https://hackmd.io/_uploads/rkE6z4zv3.png =450x)
    - **頸線**：**中間兩個低點連線 ==（與 M 不同）==**
- **識別方法**：與 WM 圖形識別方法一樣
- **找出圖形**
    | 圖形  |                        圖示                         | 條件                                                                 |
    |:-----:|:---------------------------------------------------:|:-------------------------------------------------------------------- |
    | **三重底** | ![](https://hackmd.io/_uploads/r1DhXVMw3.png =250x) | 1. $d < b,c,e,f$<br>2. $b < c,\ f < e$<br>3. $abs(c - e) \le mena(c, e) * k\ \%$ |
    | **三重頂** | ![](https://hackmd.io/_uploads/BJkTQ4fwh.png =250x) | 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==


## その他

