|
本文將介紹一種基于龍系短線(xiàn)SHT指標(biāo)的交易策略,并使用Python編寫(xiě)代碼。該策略的思想是在每個(gè)股票交易日中,通過(guò)計(jì)算SHT指標(biāo)的值來(lái)判斷市場(chǎng)趨勢(shì),并在趨勢(shì)發(fā)生變化時(shí)開(kāi)倉(cāng)或平倉(cāng)。接下來(lái),我們將按照以下順序進(jìn)行講解: - 什么是龍系短線(xiàn)SHT指標(biāo)?
- 編寫(xiě)計(jì)算SHT指標(biāo)的Python函數(shù)。
- 定義交易策略。
- 編寫(xiě)實(shí)現(xiàn)交易策略的Python函數(shù)。
在開(kāi)始之前,請(qǐng)確保您已安裝以下Python庫(kù): - pandas
- numpy
- talib
- yfinance
- matplotlib
1. 什么是龍系短線(xiàn)SHT指標(biāo)?龍系短線(xiàn)SHT指標(biāo)是一種趨勢(shì)指標(biāo),由兩條線(xiàn)組成:短期趨勢(shì)線(xiàn)(SHT)和長(zhǎng)期趨勢(shì)線(xiàn)(LHT)。通過(guò)比較這兩條線(xiàn)的位置和交叉情況,可以評(píng)估市場(chǎng)的短期和長(zhǎng)期趨勢(shì)。 具體而言,當(dāng)SHT線(xiàn)位于LHT線(xiàn)之上時(shí),市場(chǎng)處于上漲趨勢(shì);當(dāng)SHT線(xiàn)位于LHT線(xiàn)之下時(shí),市場(chǎng)處于下跌趨勢(shì)。當(dāng)SHT線(xiàn)向上穿過(guò)LHT線(xiàn)時(shí),市場(chǎng)趨勢(shì)可能發(fā)生轉(zhuǎn)變,建議買(mǎi)入;反之,當(dāng)SHT線(xiàn)向下穿過(guò)LHT線(xiàn)時(shí),市場(chǎng)趨勢(shì)可能發(fā)生轉(zhuǎn)變,建議賣(mài)出。 2. 編寫(xiě)計(jì)算SHT指標(biāo)的Python函數(shù)。我們可以使用TALib庫(kù)計(jì)算龍系短線(xiàn)SHT指標(biāo)的值。下面是一個(gè)計(jì)算函數(shù)的示例代碼: import talibdef calculate_sht(data, short_period=5, long_period=20): sht = talib.EMA(data, timeperiod=short_period) lht = talib.EMA(data, timeperiod=long_period) return sht, lht
該函數(shù)接受一個(gè)數(shù)據(jù)序列(例如股票價(jià)格)和可選的短期和長(zhǎng)期滑動(dòng)窗口大小,并返回兩個(gè)序列:SHT指標(biāo)和LHT指標(biāo)的值。 3. 定義交易策略。基于龍系短線(xiàn)SHT指標(biāo),我們可以設(shè)計(jì)一個(gè)簡(jiǎn)單的交易策略:當(dāng)SHT線(xiàn)向上穿過(guò)LHT線(xiàn)時(shí),買(mǎi)入;當(dāng)SHT線(xiàn)向下穿過(guò)LHT線(xiàn)時(shí),賣(mài)出。具體而言,我們可以定義以下變量: - sht: SHT指標(biāo)的序列。
- lht: LHT指標(biāo)的序列。
- position: 當(dāng)前倉(cāng)位,即持有的股票數(shù)量。
- cash: 當(dāng)前現(xiàn)金余額。
- buy_price: 上次買(mǎi)入時(shí)的價(jià)格。
- sell_price: 上次賣(mài)出時(shí)的價(jià)格。
算法的流程如下: - 計(jì)算SHT和LHT指標(biāo)的值。
- 若SHT線(xiàn)向上穿過(guò)LHT線(xiàn)且當(dāng)前倉(cāng)位為0,則在開(kāi)盤(pán)價(jià)以當(dāng)前現(xiàn)金余額的全部金額買(mǎi)入,同時(shí)記錄買(mǎi)入價(jià)格。
- 若SHT線(xiàn)向下穿過(guò)LHT線(xiàn)且當(dāng)前倉(cāng)位大于0,則在收盤(pán)價(jià)以當(dāng)前持有的股票數(shù)量全部賣(mài)出,同時(shí)記錄賣(mài)出價(jià)格。
- 更新當(dāng)前現(xiàn)金余額和倉(cāng)位。
4. 編寫(xiě)實(shí)現(xiàn)交易策略的Python函數(shù)。
現(xiàn)在我們可以利用以上算法編寫(xiě)實(shí)現(xiàn)交易策略的Python函數(shù)了。示例代碼如下: import yfinance as yfimport matplotlib.pyplot as pltdef backtest(symbol, start_date, end_date, short_period=5, long_period=20, initial_cash=100000): # 下載股票數(shù)據(jù) data = yf.download(symbol, start=start_date, end=end_date, thread=0)# 計(jì)算SHT和LHTclose_price = data['Adj Close'].valuessht, lht = calculate_sht(close_price, short_period, long_period)# 初始化變量cash = initial_cashposition = 0buy_price = 0sell_price = 0# 遍歷每個(gè)交易日for i in range(long_period, len(close_price)): # 如果當(dāng)前倉(cāng)位為0 if position == 0: # 如果SHT向上穿過(guò)LHT if sht[i] > lht[i] and sht[i-1] <= lht[i-1]: # 計(jì)算可買(mǎi)入的股票數(shù)量 buy_count = int(cash / close_price[i]) # 更新倉(cāng)位和現(xiàn)金余額 position = buy_count cash -= buy_count * close_price[i] # 記錄買(mǎi)入價(jià)格 buy_price = close_price[i] print('買(mǎi)入 %d 股,價(jià)格為 %.2f,余額為 %.2f' % (buy_count, buy_price, cash)) # 如果當(dāng)前倉(cāng)位不為0 else: # 如果SHT向下穿過(guò)LHT if sht[i] < lht[i] and sht[i-1] >= lht[i-1]: # 更新倉(cāng)位和現(xiàn)金余額 cash += position * close_price[i] # 記錄賣(mài)出價(jià)格 sell_price = close_price[i] print('賣(mài)出 %d 股,價(jià)格為 %.2f,余額為 %.2f' % (position, sell_price, cash)) position = 0 # 計(jì)算收益率和資產(chǎn)價(jià)值 returns = (cash + position * close_price[-1] - initial_cash) / initial_cash asset_value = cash + position * close_price[-1] # 輸出回測(cè)結(jié)果 print('收益率: %.2f%%' % (returns * 100)) print('資產(chǎn)價(jià)值: %.2f' % asset_value) # 畫(huà)出股票價(jià)格和SHT/LHT指標(biāo)的圖像 fig, ax = plt.subplots(figsize=(12, 8)) ax.plot(data.index, close_price) ax.plot(data.index, sht) ax.plot(data.index, lht) plt.legend(['Close', 'SHT', 'LHT']) plt.title(symbol) plt.show()
|