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年:
。。。。。。
參考不了,僅供娛樂