2023年3月18日 星期六

ChatGPT寫股票交易策略與指標範例 _10個ChatGPT技術分析指標程式碼

以下是一個簡單的 ChatGPT DMI 交易策略的程式碼範例,使用 Python 語言。

python
import 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语言实现:

less
import 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 語言實現:

python
import 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天雙線背離交易策略的程式碼:

python
import 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語言撰寫:

less
import 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語言編寫的程式碼:

bash
import 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%的時候,同時也設置了停損條件,當股價下跌超過設置的止損比例時,自動平倉。

python
import 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

沒有留言:

張貼留言

我的人生轉折投資思維日記

  我的人生轉折投資思維日記 時間:2023.0520 每一天都是感恩開始 要感恩的人事物與有形與無形的天地萬物太多了 舉凡我所看過與想過的一切都將為我所用 比方說 孫子兵法:其戰略要義 用兵如神 每一次的閱...

熱門