Python 量化demo

渔樵江渚發表於2024-10-22

Python量化

量化交易: 透過程式選出合適的股票(或其他),在合適的時機,發起買入或賣出的交易,從中追求盈利。

量化指標

KDJ 指標

KDJ指標,也稱為隨機振盪器,是一種動量指標,用於衡量一定時間內股票收盤價與價格範圍(最高價和最低價)的關係。
KDJ由三條線組成:快速線K、慢速線D和動態線J。這個指標可以幫助交易者識別超買和超賣條件,以及潛在的轉折點。

MACD指標

  • MACD,全稱是移動平均線收斂/發散指標(Moving Average Convergence Divergence),由以下幾個主要部分組成:
  • 快線(短期EMA):這是短期的指數移動平均線,通常使用12天的價格資料進行計算。它對價格變化較為敏感,能夠迅速反映市場的最新動態。
  • 慢線(長期EMA):這是長期的指數移動平均線,通常使用26天的價格資料進行計算。與快線相比,它對價格變化的反應較慢,更能反映市場的整體趨勢。
  • DIF線(快線與慢線的差):DIF線是快線減去慢線的差值。它表示短期價格變化和長期價格趨勢之間的差異。當DIF線在正值區域時,表明短期趨勢較強;在負值區域時,表明長期趨勢較強。
  • DEA線(訊號線):DEA線是DIF線的9天指數移動平均線。它用於平滑DIF線的波動,幫助我們更清晰地觀察市場趨勢。
  • MACD柱狀圖:MACD柱狀圖顯示DIF線與DEA線之間的差距。柱狀圖的高度表示差距的大小,當柱狀圖由負轉正或由正轉負時,往往意味著市場趨勢的變化。
    透過這幾個部分的配合,MACD能夠為交易者提供清晰的買入和賣出訊號,幫助他們在市場中做出更明智的決策。

KDJ結合MACD和RSI指標的分析方法

程式碼實現

確定KDJ結合MACD的策略,使用python pandas進行資料處理

資料獲取

資料來源:baostock

#獲取股票資料
def get_data(ticket,start_date):
    today = datetime.datetime.now().strftime("%Y-%m-%d")
    # 登入 Baostock
    lg = bs.login()
    # 獲取股票資料,
    rs = bs.query_history_k_data_plus(ticket,
        "date,code,open,high,low,close,volume",
        start_date=start_date, end_date=today,
        frequency="d", adjustflag="3")
    data_list = []
    while (rs.error_code == '0') & rs.next():
        data_list.append(rs.get_row_data())
    result = pd.DataFrame(data_list, columns=rs.fields)
    # 轉換資料型別
    result['close'] = result['close'].astype(float)
    result['high'] = result['high'].astype(float)
    result['low'] = result['low'].astype(float)
    # 登出 Baostock
    bs.logout()
    return result

KDJ 計算

# 計算 KDJ 指標中的 RSV 值
def calculate_KDJ(data):
    low_9 = data['low'].rolling(window=9).min()
    high_9 = data['high'].rolling(window=9).max()
    data['RSV']  = ((data['close'] - low_9) / (high_9 - low_9)) * 100
    # 計算 K 值
    k_period = 3
    data['K'] = data['RSV'].ewm(alpha=1/k_period).mean()
    #return rsv
    # 計算 D 值
    d_period = 3
    data['D'] = data['K'].ewm(alpha=1/d_period).mean()
    # 計算 J 值
    data['J'] = 3 * data['K'] - 2 * data['D']
    return data

MACD 計算

# 計算MACD
def calculate_macd(data):
    ema12 = data['close'].ewm(span = 12).mean()
    ema26 = data['close'].ewm(span = 26).mean()
    dif = ema12 - ema26
    dea = dif.ewm(span = 9).mean()
    macd_bar = (dif - dea)
    data['DIF'], data['DEA'], data['MACD'] = dif, dea, macd_bar
    return data

買賣訊號

def get_final_result(ticket,start_date):
    data = get_data(ticket,start_date)
    calculate_macd(data)
    #print(data)
    calculate_KDJ(data)
    	# 生成買入賣出訊號,結合KDJ和MACD
    data['signal'] = np.where((data['K'] < data['D']) & (data['K'] > 20) & (data['D'] > 20) & (data['J'] < data['K']) & (data['J'] > data['D']) & (data['DIF'] > data['DEA']), 0,
                            np.where((data['K'] > data['D']) & (data['K'] < 80) & (data['D'] < 80) & (data['J'] > data['K']) & (data['J'] > data['D']) & (data['DIF'] < data['DEA']), 1, np.nan))
    return data

選擇一隻股票測試下:

將處理結果存到檔案:

資料視覺化

引入matplotlib 模組

def plot_chart(data):
    plt.figure(figsize=(12, 8))

    # 繪製收盤價曲線
    plt.plot(data['date'], data['close'], label='Close Price', color='blue')

    # 繪製 K、D、J 曲線
    plt.plot(data['date'], data['K'], label='K', color='green')
    plt.plot(data['date'], data['D'], label='D', color='orange')
    plt.plot(data['date'], data['J'], label='J', color='purple')

    # 繪製 MACD 曲線
    plt.plot(data['date'], data['DIF'], label='DIF', color='red')
    plt.plot(data['date'], data['DEA'], label='DEA', color='yellow')
    plt.bar(data['date'], data['MACD'], label='MACD', color='gray', alpha=0.6)

    # 新增買入賣出訊號標記
    for index, row in data.iterrows():
        if row['signal'] == 'buy':
            plt.scatter(row['date'], row['close'], marker='^', color='green', s=100)
        elif row['signal'] == 'sell':
            plt.scatter(row['date'], row['close'], marker='v', color='red', s=100)

    plt.title('Stock Analysis with KDJ and MACD')
    plt.xlabel('Date')
    plt.ylabel('Price')
    plt.legend()
    plt.xticks(rotation=45)
    plt.tight_layout()
    plt.show()

放到main裡測試下:

# 獲取處理完成後的資料
result = get_final_result('sh.600887','2024-8-21')
# 呼叫繪製圖表函式
plot_chart(result)
# 儲存到檔案
result.to_csv("D:\\my_result_241022.csv", index=False)
# 列印帶有訊號的結果
print(result[['date', 'close', 'K', 'D', 'J', 'DIF', 'DEA', 'MACD', 'signal']])

感覺不對呀

將日期改到23年:


。。。。。。
參考不了,僅供娛樂

相關文章