以下是一個簡單的 ChatGPT DMI 交易策略的程式碼範例,使用 Python 語言。
pythonimport talib
import yfinance as yf
# 下載股票歷史資料
stock_data = yf.download("AAPL", start="2020-01-01", end="2022-03-18")
# 計算 DMI 指標
high = stock_data["High"]
low = stock_data["Low"]
close = stock_data["Close"]
dmi_plus = talib.PLUS_DI(high, low, close)
dmi_minus = talib.MINUS_DI(high, low, close)
adx = talib.ADX(high, low, close)
# 設定 DMI 指標的參數
dmi_buy_level = 25
dmi_stop_loss_level = 20
dmi_sell_level = 10
# 初始化交易變數
position = 0 # 0 表示沒有持倉,1 表示持有多單,-1 表示持有空單
buy_price = 0 # 買進價格
# 進行 DMI 交易策略
for i in range(len(stock_data)):
# 買進訊號
if dmi_plus[i] > dmi_minus[i] and adx[i] > dmi_buy_level and position == 0:
position = 1
buy_price = stock_data["Close"][i]
print("買進:", buy_price)
# 停損訊號
if position == 1 and stock_data["Close"][i] < (buy_price - dmi_stop_loss_level):
position = 0
sell_price = stock_data["Close"][i]
print("停損:", sell_price)
# 買出訊號
if dmi_minus[i] > dmi_plus[i] and adx[i] > dmi_sell_level and position == 1:
position = 0
sell_price = stock_data["Close"][i]
print("賣出:", sell_price),以下是一個簡單的KDj交易策略範例。在這個策略中,當K線上穿D線時,產生買進訊號;當K線下穿D線時,產生賣出訊號。此外,設定一個停損點,當股價跌破停損點時,進行賣出。
css# 載入所需套件
import pandas as pd
import numpy as np
import talib
# 讀取歷史股價資料
df = pd.read_csv('stock_data.csv')
# 計算KDJ指標
high = df['High'].values
low = df['Low'].values
close = df['Close'].values
K, D = talib.STOCH(high, low, close)
# 計算KD線
J = 3 * D - 2 * K
# 設定買賣訊號
df['signal'] = 0
df.loc[(K > D) & (K.shift(1) < D.shift(1)), 'signal'] = 1 # 買進訊號
df.loc[(K < D) & (K.shift(1) > D.shift(1)), 'signal'] = -1 # 賣出訊號
# 設定停損點
stop_loss = 0.9 # 假設停損點為當前持股成本的90%
# 進行交易
df['position'] = df['signal'].shift(1)
df['position'].fillna(method='ffill', inplace=True)
df['cost'] = np.nan
df.loc[df['position'] == 1, 'cost'] = df['Close']
df['cost'].fillna(method='ffill', inplace=True)
df['stop_loss'] = df['cost'] * stop_loss
df['pnl'] = 0
df.loc[(df['position'] == 1) & (df['Low'] < df['stop_loss']), 'pnl'] = -stop_loss
df.loc[(df['position'] == -1) | ((df['position'] == 1) & (df['High'] > df['cost'] * 1.05)), 'pnl'] = 0.05
df.loc[(df['position'] == 1) & (df['High'] <= df['cost'] * 1.05) & (df['Low'] >= df['stop_loss']), 'pnl'] = df['Close'] / df['cost'] - 1
df['cum_return'] = (df['pnl'] * df['position'] + 1).cumprod()
# 計算交易績效
win_rate = len(df.loc[df['pnl'] > 0]) / len(df.loc[df['pnl'] != 0])
profit_factor = abs(df.loc[df['pnl'] > 0, 'pnl'].sum() / df.loc[df['pnl'] < 0, 'pnl'].sum())
print('Win rate:', win_rate)
print('Profit factor:', profit_factor)
需要注意的是,這個
以下是一个基于ChatGPT bias指标的交易策略的示例代码,使用Python语言实现:
lessimport talib
import numpy as np
import pandas as pd
def bias_strategy(df, n):
# 计算bias指标
bias = (df['close'] - talib.SMA(df['close'], n)) / talib.SMA(df['close'], n) * 100
df['bias'] = bias
# 设定交易信号
df['signal'] = np.where((df['bias'] > 0) & (df['bias'].shift(1) < 0), 1, 0)
df['signal'] = np.where((df['bias'] < 0) & (df['bias'].shift(1) > 0), -1, df['signal'])
# 设定持仓信号
df['position'] = df['signal'].ffill().fillna(0)
# 设定止损信号
stop_loss = df['close'] * 0.95
df['stop_loss'] = np.where((df['position'] == 1), stop_loss, np.nan)
df['stop_loss'] = df['stop_loss'].ffill()
# 设定交易记录
df['pct_change'] = df['close'].pct_change()
df['return'] = df['pct_change'] * df['position'].shift(1)
df['cum_return'] = (1 + df['return']).cumprod()
# 返回交易记录
return df[['date', 'close', 'bias', 'signal', 'position', 'stop_loss', 'return', 'cum_r以下是一個基於bias指標的交易策略的範例程式碼。這個策略主要是以價格相對於移動平均線的偏離程度來判斷買進或賣出的時機,並且設定了停損點以控制風險。
python# 載入相關套件
import talib
import numpy as np
# 設定參數
bias_period = 20 # bias計算的移動平均線週期
stop_loss = 0.05 # 停損比例
stop_profit = 0.1 # 停利比例
# 計算bias指標
def calculate_bias(close, period):
sma = talib.SMA(close, timeperiod=period)
bias = (close - sma) / sma * 100
return bias
# 策略主體
def strategy(close, high, low):
# 計算bias指標
bias = calculate_bias(close, bias_period)
# 判斷買進訊號
if bias[-1] < -2:
buy_price = close[-1]
stop_loss_price = buy_price * (1 - stop_loss)
stop_profit_price = buy_price * (1 + stop_profit)
return "Buy", buy_price, stop_loss_price, stop_profit_price
# 判斷賣出訊號
if bias[-1] > 2:
sell_price = close[-1]
stop_loss_price = sell_price * (1 + stop_loss)
stop_profit_price = sell_price * (1 - stop_profit)
return "Sell", sell_price, stop_loss_price, stop_profit_price
# 如果沒有買賣訊號,則持有不動
return "Hold", None, None, None以下是一個範例的ChatGPT 寶塔線指標交易策略,用 Python 語言實現:
pythonimport talib
import numpy as np
def tower_strategy(high, low, close):
# 計算寶塔線指標
tower = talib.CDL2CROWS(open, high, low, close)
# 設定交易訊號的閾值
buy_threshold = -100
sell_threshold = 100
# 計算交易訊號
buy_signal = np.where(tower < buy_threshold, 1, 0)
sell_signal = np.where(tower > sell_threshold, -1, 0)
# 設定停損訊號,這裡以固定比例的方式計算停損點
stop_loss = close * 0.95
# 計算實際的買賣訊號,這裡假設先買後賣
position = np.zeros_like(close)
buy_index = np.where(buy_signal > 0)[0]
sell_index = np.where(sell_signal < 0)[0]
for i in range(len(buy_index)):
# 買進訊號發生時,買入股票
position[buy_index[i]] = 1
# 設定停損點
stop_loss_price = stop_loss[buy_index[i]]
# 在下一個賣出訊號出現前,持有股票
if i < len(sell_index) and sell_index[i] > buy_index[i]:
# 賣出訊號出現時,賣出股票
position[sell_index[i]] = -1
# 如果賣出價格低於停損點,就以停損點為賣出價格
if close[sell_index[i]] < stop_loss_price:
position[sell_index[i]] = 0
# 設定下一個買進訊號為停損點
if i < len(buy_index) - 1:
stop_loss_price = stop_loss[buy_index[i+1]]
else:
# 如果沒有賣出訊號,就一直持有股票
position[-1] = -1
return position
這個交易策略使用 talib 套件來計算寶塔線指標,然後設定一個閾值來產生交易訊號。如果寶塔線指標小於閾值,則產生買進訊號;如果大於另一個閾值,則產生賣出訊號。接著,使用固定比例的方式計算停損點,並在下一個賣出訊號出現前持有股票。
以下是一個簡單的3-6天雙線背離交易策略的程式碼:
pythonimport pandas as pd
# 載入股票數據
data = pd.read_csv("stock_data.csv")
# 計算3日均線
data['ma_3'] = data['close'].rolling(3).mean()
# 計算6日均線
data['ma_6'] = data['close'].rolling(6).mean()
# 計算3日均線與6日均線之差
data['diff'] = data['ma_3'] - data['ma_6']
# 計算昨日和今日的差
data['diff_shift'] = data['diff'].shift(1)
# 買進訊號:當昨日的差小於0,今日的差大於0
data['buy_signal'] = (data['diff_shift'] < 0) & (data['diff'] > 0)
# 買出訊號:當昨日的差大於0,今日的差小於0
data['sell_signal'] = (data['diff_shift'] > 0) & (data['diff'] < 0)
# 停損訊號:當股價跌破20日均線
data['stop_loss_signal'] = (data['close'] < data['ma_20'])
# 將買進訊號和停損訊號合併成一個訊號
data['signal'] = data['buy_signal'] & ~data['stop_loss_signal']
# 初始持有股票為0
hold = 0
# 設定初始資金為10000元
cash = 10000
# 設定每筆交易的股數
num_of_shares = 1000
# 迭代每個交易日
for i in range(len(data)):
# 如果有買進訊號,則買進股票
if data.loc[i, 'signal'] and not hold:
hold = 1
cash -= data.loc[i, 'close'] * num_of_shares
# 如果有停損訊號或賣出訊號,則賣出股票
elif (data.loc[i, 'stop_loss_signal'] or data.loc[i, 'sell_signal']) and hold:
hold = 0
cash += data.loc[i, 'close'] * num_of_shares
# 計算最終資產價值
final_value = cash + hold * data.loc[len(data)-1, 'close'] * num_of_shares
print("Final Value:", final_value)
以下是一個基於ChatGPT 布林通道的交易策略的程式碼,使用Python語言撰寫:
lessimport pandas as pd
import talib
# 設定參數
symbol = 'AAPL'
period = '1d'
start_date = '2021-01-01'
end_date = '2021-12-31'
upper_sd = 2.0
lower_sd = 2.0
stop_loss = 0.05
# 下載歷史股價資料
df = pd.read_csv(f'https://query1.finance.yahoo.com/v7/finance/download/{symbol}?period1={start_date}&period2={end_date}&interval={period}&events=history&includeAdjustedClose=true')
# 計算布林通道
df['upper_band'], df['middle_band'], df['lower_band'] = talib.BBANDS(df['Adj Close'], timeperiod=20, nbdevup=upper_sd, nbdevdn=lower_sd)
# 初始化交易訊號
df['signal'] = 0
df['position'] = 0
# 計算交易訊號
for i in range(1, len(df)):
if df['Adj Close'][i] > df['upper_band'][i-1]:
df['signal'][i] = 1
elif df['Adj Close'][i] < df['lower_band'][i-1]:
df['signal'][i] = -1
if df['signal'][i-1] == 1 and df['Adj Close'][i] < df['middle_band'][i]:
df['signal'][i] = -1
elif df['signal'][i-1] == -1 and df['Adj Close'][i] > df['middle_band'][i]:
df['signal'][i] = 1
# 計算持倉
for i in range(1, len(df)):
if df['signal'][i-1] == 0:
df['position'][i] = df['position'][i-1]
elif df['signal'][i-1] == 1:
df['position'][i] = 1
elif df['signal'][i-1] == -1:
df['position'][i] = -1
# 計算交易回報
df['returns'] = df['Adj Close'].pct_change() * df['position'].shift(1)
# 計算停損訊號
for i in range(1, len(df)):
if df['position'][i-1] == 1 and df['returns'][i] < -stop_loss:
df['signal'][i] = -1
elif df['position'][i-1] == -1 and df['returns'][i] < -stop_loss:
df['signal'][i] = 1
else:
df['signal'][i] = df['signal'][i]
# 計算交易回報
df['returns'] = df['Adj Close'].pct_change() * df['position'].shift(1)
# 計算累積回報
df['cumulative_returns'] = (1 + df['returns']).cumprod() - 1
# 輸出結果
print(df.tail())以下是一個基於ChatGPT SAR指標的簡單交易策略,包括買進訊號、停損訊號和賣出訊號的定義。
買進訊號: 當SAR指標從股票價格下方轉向上方時,產生買進訊號。
停損訊號: 當SAR指標從股票價格上方轉向下方時,產生停損訊號。
賣出訊號: 當股票價格跌破SAR指標時,產生賣出訊號。
以下是使用Python語言編寫的程式碼:
bashimport talib
import yfinance as yf
# 載入股票資料
df = yf.download('AAPL', start='2020-01-01', end='2022-03-18')
# 計算SAR指標
df['SAR'] = talib.SAR(df['High'], df['Low'], acceleration=0.02, maximum=0.2)
# 計算買進訊號
df['Buy_Signal'] = (df['Close'] > df['SAR'].shift(1)) & (df['Close'].shift(1) <= df['SAR'].shift(1))
# 計算停損訊號
df['Stop_Loss'] = (df['Close'] < df['SAR'].shift(1)) & (df['Close'].shift(1) >= df['SAR'].shift(1))
# 計算賣出訊號
df['Sell_Signal'] = (df['Close'] < df['SAR']) & (df['Close'].shift(1) >= df['SAR'])
# 建立交易信號
df['Signal'] = 0
df.loc[df['Buy_Signal'], 'Signal'] = 1
df.loc[df['Stop_Loss'], 'Signal'] = -1
df.loc[df['Sell_Signal'], 'Signal'] = -1
# 計算每天的持倉量
df['Position'] = df['Signal'].cumsum()
# 計算每天的投資報酬率
df['Returns'] = df['Close'].pct_change() * df['Position'].shift(1)
# 計算投資結果
total_return = (df['Returns'] + 1).cumprod()[-1] - 1
# 印出投資結果
print(f'Total return: {total_return:.2%}')以下是一個使用ChatGPT WMS指標的交易策略範例:
less# 載入所需套件
import pandas as pd
import numpy as np
import talib
# 設定參數
overbought = 80
oversold = 20
lookback_period = 14
stop_loss = 0.05 # 停損比例
# 讀取歷史股價資料,以台積電2330為例
df = pd.read_csv('2330.csv')
# 計算WMS指標
df['highest_high'] = df['High'].rolling(window=lookback_period).max()
df['lowest_low'] = df['Low'].rolling(window=lookback_period).min()
df['wms'] = (df['Close'] - df['lowest_low']) / (df['highest_high'] - df['lowest_low']) * 100
# 計算WMS指標的平均值
df['wms_ma'] = talib.SMA(df['wms'].values, timeperiod=lookback_period)
# 計算交易訊號
df['buy_signal'] = np.where((df['wms'] < oversold) & (df['wms'] > df['wms_ma']), 1, 0)
df['sell_signal'] = np.where((df['wms'] > overbought) | (df['wms'] < df['wms_ma']), 1, 0)
# 計算停損訊號
entry_price = 0
df['stop_loss'] = 0
for i in range(1, len(df)):
if df.loc[i-1, 'Position'] == 0 and df.loc[i, 'buy_signal'] == 1:
entry_price = df.loc[i, 'Open']
elif df.loc[i-1, 'Position'] == 1:
stop_loss_price = entry_price * (1 - stop_loss)
df.loc[i, 'stop_loss'] = min(df.loc[i-1, 'Low'], stop_loss_price)
else:
entry_price = 0
# 計算持倉部位
df['Position'] = df['buy_signal'] - df['sell_signal']
df['Position'] = df['Position'].ffill()
# 將交易訊號和持倉部位合併
df['Signal'] = df['buy_signal'] - df['sell_signal']
df['Signal'] = df['Signal'].replace(to_replace=0, method='ffill')
df['Signal'] = df['Signal'].replace(to_replace=0, method='bfill')
df['Position'] = df['Signal'].shift()
# 計算每天的收益
df['pct_change'] = df['Close'].pct_change()
df['strategy_returns'] = df['pct_change'] * df['Position']
# 計算累積收益
df['cumulative_returns'] = (1 + df['strategy_returns']).cumprod() - 1
# 繪製累積收益曲線
df['cumulative_returns'].plot(figsize=(10, 6))
好的,以下是一個基於ChatGPT PSY指標的簡單交易策略示範,其中買進訊號為PSY指標突破30%的時候,賣出訊號為PSY指標回落至70%的時候,同時也設置了停損條件,當股價下跌超過設置的止損比例時,自動平倉。
pythonimport numpy as np
import pandas as pd
import talib
def psy_strategy(data, psy_period=12, buy_threshold=0.3, sell_threshold=0.7, stop_loss=0.05):
# 計算PSY指標
psy = talib.PSY(data['close'], timeperiod=psy_period)
# 創建一個DataFrame儲存交易訊號和持倉狀態
signals = pd.DataFrame(index=data.index)
signals['positions'] = 0
# 買進訊號:PSY指標突破30%
signals['positions'][psy > buy_threshold] = 1
# 賣出訊號:PSY指標回落至70%
signals['positions'][psy < sell_threshold] = -1
# 計算每日收益率
data['returns'] = np.log(data['close'] / data['close'].shift(1))
# 設置停損條件
long_positions = signals['positions'] == 1
signals['stop_loss'] = False
signals.loc[long_positions, 'stop_loss'] = (data['close'] / data['close'].rolling(psy_period).max() - 1) < -stop_loss
# 計算持倉變化
signals['positions'] = signals['positions'].diff()
# 刪除第一行
signals = signals.drop(signals.index[0])
return signals
以下是一個基於 ChatGPT OBV 的交易策略範例:
python# 設定初始變數
prev_obv = None
buy_price = None
stop_loss_price = None
stop_loss_threshold = 0.02 # 設定止損門檻為 2%
# 主要策略
def obv_strategy(df):
global prev_obv, buy_price, stop_loss_price
close = df['close']
volume = df['volume']
obv = df['obv']
current_obv = obv.iloc[-1]
# 如果是第一根 K 線,則初始化 prev_obv 和 stop_loss_price 變數
if prev_obv is None:
prev_obv = current_obv
stop_loss_price = close.iloc[-1] * (1 - stop_loss_threshold)
return None
# 如果 OBV 上漲,表示成交量也跟著上漲,則買進
if current_obv > prev_obv:
buy_price = close.iloc[-1]
stop_loss_price = buy_price * (1 - stop_loss_threshold)
prev_obv = current_obv
return 'BUY'
# 如果價格跌破停損價格,則賣出
if close.iloc[-1] < stop_loss_price:
prev_obv = current_obv
return 'SELL'
# 否則繼續持有
prev_obv = current_obv
return None
沒有留言:
張貼留言