- BKC : 水某的光陽 125, 續保兩年強制險 985 元.
- PPY : 鄉下光陽 CUE 100 (紅), 續保兩年強制險 985 元.
這兩台車主都是我, 直接網路投保很方便, 另外一台藍色的 Cue 100 車主登記為爸, 必須使用傳真投保, 想辦過戶又找不到行照, 辦過戶還要騎車去監理站驗車, 得請假跑一趟.
最近與阿中再次討論行程, 他想變更行程, 請依據 v7 版行程作如下修改 :1. Day 3 (10/25) 想改成早上去倉敷, 保留參觀大原美術館, 橘香堂與廣榮堂購物與午餐, 下午則去福山城, 傍晚返回岡山.2. Day 5 (10/27) 改為早上先去屋島, 下午才去栗林公園.3. Day 7 10/29 只去宮島嚴島神社, 取消福山行程 (已改到 10/25 下午).請先評估這樣變更是否 OK, 如果可以就根據上述安排修改這三天的行程規劃, 修改規劃書為 v8 版 (其他行程不變毋須更改). 本次對話內容仍更新到 "交談紀錄.md" 檔.
我是 Python 演算法開發者。【用戶原始需求】:【動態網格交易】【架構師前置任務(自動補齊規格)】:在生成 Prompt 前,請先依量化狀態機工程規範,主動將上述需求擴充為:1. 具體函式簽名:包含 df: pd.DataFrame、外部觸發訊號欄位(如 entry_col: str = "entry_signal")及合理預設參數。2. 精準功能描述:明確定義「外部觸發進場條件」、「持倉期間狀態更新」與「離場機制」,嚴禁遺漏外部觸發訊號。【硬性範疇限制】:每次提問僅限單一策略。嚴禁合併多個不同策略,嚴禁設計通用分發引擎(禁止 mode 參數)。請注意:現在先不要寫最終的 Python 實作代碼。請扮演資深系統架構師,梳理該策略的邏輯,並輸出一份『專門餵給本機 14B 代碼模型(Qwen 2.5 Coder 14B)執行的極簡結構化 Prompt』。為了防止本機小模型產生「陣列長度不匹配廣播崩潰」、「偽向量化偷換數學算式」、「時序穿透」、「分支漏賦值導致狀態中斷」或「注意力倒置漏給實作」,產出的 Prompt 必須嚴格遵守以下 5 項架構設計原則:1. 運算範式與數值計算契約(Numerical & Alignment Guard):- 【純無副作用】:函式開頭必須強制執行 `df = df.copy()`,嚴禁修改傳入的原始物件;所有計算出的核心特徵與狀態欄位必須完整回填輸出。- 【時序差分對齊】:凡涉及前一期資訊(t-1 lag)的向量化運算,必須明確給出切片對齊語法(當期切片 [1:] 與前期切片 [:-1] 長度對齊,第 0 筆獨立初始化),嚴禁不同長度陣列直接相減引發廣播崩潰。- 【拒絕偽向量化】:明確區分有限滑動視窗與遞迴平滑(如 EMA、Wilder 等依賴前一期數值之濾波)。凡具備遞迴相依特徵,指示直接以純數值迴圈計算,嚴禁用 np.convolve 或滑動平均冒充。- 【0-based 視窗邊界對齊】:凡涉及長度為 W 之視窗統計或初始暖機計算,首個有效聚合值必須精確對齊至視窗末端索引 W - 1,後續時序推進嚴格自索引 W 起算,嚴禁因 0-based 索引混淆導致邊界偏移(Off-by-one)。- 【異常值傳播契約】:若時序中間出現缺失值(NaN),當期指標計算設為 NaN 即可;當後續數值恢復有效時,直接沿用最近一期有效狀態值延續遞迴平滑,嚴禁指示小模型設計複雜的「中斷後重新累積暖機」邏輯。2. 迴圈拓撲與單一 Pass 限制(Single-Pass FSM Topology):- 明確區分「可全域預先向量化特徵」與「路徑依賴狀態機」。- 【單一迴圈紅線】:若存在狀態轉移依賴,所有相互關聯的事件、進出場判定與動態軌跡更新,必須嚴格封裝在唯一一個 `for t in range(n)` 迴圈內,嚴禁拆成多個獨立迴圈預算事件。3. 依賴閉環與變數綁定(Dependency Closure & Memory Scaffold):- 【依賴閉環原則】:輸入 Schema 中定義的所有決策驅動欄位,在迴圈前必須轉為 1D NumPy 陣列;且必須在狀態機迴圈的 `if` 條件分支中被顯式引用,嚴禁輸入欄位被閒置或遺忘。- 所有輸出欄位,在進入迴圈前於記憶體預先宣告配置好 1D NumPy 陣列(禁止在迴圈內對 DataFrame 逐列賦值)。4. 純量狀態機與統一提交架構(Scalar Register & Unified Commit):- 【純量變數隔離】:迴圈外部初始化純量狀態暫存器(如 curr_pos=0, curr_peak=np.nan, curr_stop=np.nan)。迴圈內部各條件分支「僅允許修改純量變數」,嚴禁在 if-elif 分支內部直接對 position[t] 或 stop[t] 賦值。- 【單向因果流動】:迴圈首行固定執行 prev_pos, prev_peak, prev_stop = curr_pos, curr_peak, curr_stop 凍結前值以防時序穿透。- 【統一提交出口】:迴圈末端必須且只能以無條件寫入,將所有當前純量狀態提交至對應陣列(如 `state_arr[t] = curr_state`),禁止在分支內有條件落盤,杜絕因分支漏賦值導致狀態靜默遺失。5. 極限邊界防禦與 Negative Constraints:- 空資料、長度不足時安全回傳帶有完整目標 Schema 的 DataFrame,嚴禁索引越界。- 數據中斷(NaN/None)時明確規定狀態凍結或沿用前值,嚴禁使用全域 fillna(0) 或重新累積暖機破壞時序。- 嚴格禁止使用 iterrows、itertuples、未定義欄位預先存取及拿回傳表比對原始物件。- 產出的 Prompt 篇幅控制在 600~800 字內,要求小模型依序輸出「完整函式」與「狀態邏輯 pytest 驗證(無須手算小數)」。
# 任務:實作單一動態網格交易函式你是 Python 量化策略工程師。只實作 `dynamic_grid(df: pd.DataFrame, entry_col: str = "entry_signal", grid_pct: float = 0.02, lot_size: float = 1.0, max_positions: int = 5) -> pd.DataFrame`,禁止 mode 參數、多策略或通用分發引擎。## 1. 策略規格使用 `Close` 與外部 `entry_col`。只有空倉且訊號明確為 True 時,才以當期 Close 啟動網格;無訊號不得進場。以啟動價為基準,每格固定間距 `grid_pct`。持倉期間,Close 下穿下一買入格且持倉未達上限時,增加一個 `lot_size`;Close 上穿下一賣出格且持倉大於零時,減少一個 `lot_size`。每根 K 線最多執行一筆網格交易;買賣格依實際交易方向逐格更新,避免同一根 K 線連續多格成交。持倉降至零時結束週期並清除網格;不得同根重新啟動。此函式輸出交易訊號,不假設實際成交滑價或手續費。## 2. 數值與對齊函式首行執行 `df = df.copy()`,保留原欄位,新增 `Grid_Level, Position, Entry_Event, Buy_Event, Sell_Event, Exit_Event`。先驗證 `Close`、`entry_col` 與參數,再處理空資料。`grid_pct`、`lot_size` 必須為正有限數;`max_positions` 必須為正整數且不可為 bool。所有決策欄位轉為一維 NumPy 陣列,所有輸出陣列在迴圈前預配置。若需前期差分,使用 `[1:]` 與 `[:-1]` 對齊,第 0 筆獨立處理。禁止用向量化近似替代路徑依賴狀態。## 3. FSM 與因果所有進場、買賣格判斷、持倉數量、網格更新及事件均放在唯一一個 `for t in range(n)` 狀態機迴圈。迴圈首行凍結 `prev_pos, prev_grid = curr_pos, curr_grid`。分支只修改純量暫存器與事件旗標,禁止分支內直接寫輸出陣列;迴圈末端無條件提交全部輸出。當期決策只使用當期 Close、當期外部訊號與前期已確認狀態,禁止使用未來資料。## 4. 缺失值與邊界缺失 Close 或訊號不明確時不觸發交易,沿用前期狀態;禁止全域 `fillna(0)`。空資料、短資料安全回傳完整 Schema,不得索引越界。禁止 `iterrows`、`itertuples`、未驗證欄位存取及 DataFrame 逐列賦值。## 5. 交付與測試依序輸出完整函式及 pytest。測試涵蓋空資料、參數與欄位驗證、外部訊號控制、網格逐格更新、持倉上限、買賣事件互斥、清倉後不重進、缺失值狀態延續及原始 DataFrame 不變。以事件位置與狀態關係驗證,不必手算小數。不得宣稱未實際執行的測試已通過。
import pandas as pdimport numpy as npdef dynamic_grid(df: pd.DataFrame, entry_col: str = "entry_signal", grid_pct: float = 0.02,lot_size: float = 1.0, max_positions: int = 5) -> pd.DataFrame:df = df.copy()# Validate inputrequired_cols = ['Close', entry_col]if not all(col in df.columns for col in required_cols):raise ValueError(f"Missing required columns: {', '.join(required_cols)}")if not pd.api.types.is_numeric_dtype(df['Close']):raise ValueError("Close must be a numeric type.")if not isinstance(grid_pct, (int, float)) or grid_pct <= 0:raise ValueError("grid_pct must be a positive float or integer.")if not isinstance(lot_size, (int, float)) or lot_size <= 0:raise ValueError("lot_size must be a positive float or integer.")if not isinstance(max_positions, int) or max_positions <= 0 or isinstance(max_positions,bool):raise ValueError("max_positions must be a positive integer.")n = len(df)close = df['Close'].valuesentry_signal = df[entry_col].values.astype(bool)grid_level = np.full(n, np.nan)position = np.zeros(n, dtype=int)entry_event = np.zeros(n, dtype=bool)buy_event = np.zeros(n, dtype=bool)sell_event = np.zeros(n, dtype=bool)exit_event = np.zeros(n, dtype=bool)curr_pos = 0curr_grid = np.nanfor t in range(n):prev_pos = curr_posprev_grid = curr_gridvalid_close = np.isfinite(close[t])valid_entry = entry_signal[t]if prev_pos == 0 and valid_entry and valid_close:curr_grid = close[t]curr_pos = 1entry_event[t] = Trueelif valid_close:if curr_pos < max_positions and close[t] < prev_grid * (1 - grid_pct):curr_pos += 1buy_event[t] = Trueelif curr_pos > 0 and close[t] > prev_grid * (1 + grid_pct):curr_pos -= 1sell_event[t] = Trueif curr_pos == 0 and prev_pos > 0:exit_event[t] = Truegrid_level[t] = curr_griddf['Grid_Level'] = grid_leveldf['Position'] = positiondf['Entry_Event'] = entry_eventdf['Buy_Event'] = buy_eventdf['Sell_Event'] = sell_eventdf['Exit_Event'] = exit_eventreturn dfdef test_dynamic_grid():data = {'Close': [100, 102, 103, 98, 95, 97, 100, 105, 110, 115, 118],'entry_signal': [True, False, False, False, False, False, False, False, False, False,False]}df = pd.DataFrame(data)result = dynamic_grid(df)# Check columnsrequired_cols = ['Close', 'entry_signal', 'Grid_Level', 'Position', 'Entry_Event','Buy_Event', 'Sell_Event', 'Exit_Event']assert all(col in result.columns for col in required_cols)# Check Grid_Level valuesexpected_grid_level = [100.0, 100.0, 100.0, 100.0, 100.0, 100.0, 100.0, 100.0, 100.0,100.0, 100.0]np.testing.assert_array_equal(result['Grid_Level'], expected_grid_level)# Check Position valuesexpected_position = [1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0]np.testing.assert_array_equal(result['Position'], expected_position)# Check Entry_Event valuesexpected_entry_event = [True, False, False, False, False, False, False, False, False,False, False]np.testing.assert_array_equal(result['Entry_Event'], expected_entry_event)# Check Buy_Event valuesexpected_buy_event = [False, False, False, False, False, False, False, False, False, False,False]np.testing.assert_array_equal(result['Buy_Event'], expected_buy_event)# Check Sell_Event valuesexpected_sell_event = [False, False, False, False, False, False, False, False, False,False, False]np.testing.assert_array_equal(result['Sell_Event'], expected_sell_event)# Check Exit_Event valuesexpected_exit_event = [False, False, False, True, False, False, False, False, False, False,False]np.testing.assert_array_equal(result['Exit_Event'], expected_exit_event)# Check that the original DataFrame is not modifiedassert 'Grid_Level' not in df.columnsdef test_empty_data():df = pd.DataFrame(columns=['Close', 'entry_signal'])result = dynamic_grid(df)required_cols = ['Close', 'entry_signal', 'Grid_Level', 'Position', 'Entry_Event','Buy_Event', 'Sell_Event', 'Exit_Event']assert all(col in result.columns for col in required_cols)def test_missing_data():data = {'Close': [100, np.nan, 103, 98, np.nan, 97, 100, np.nan, 110, 115, 118],'entry_signal': [True, False, False, False, False, False, False, False, False, False,False]}df = pd.DataFrame(data)result = dynamic_grid(df)assert 'Grid_Level' in result.columnsassert 'Position' in result.columnsassert 'Entry_Event' in result.columnsassert 'Buy_Event' in result.columnsassert 'Sell_Event' in result.columnsassert 'Exit_Event' in result.columns
- 【統一提交出口(顯式代碼清單)】:產出的 Prompt 嚴禁使用「提交所有狀態」等概括性文字。架構師必須在骨架尾端,根據該策略宣告的所有狀態純量,具體逐行寫出無條件提交的賦值代碼(格式為 arr_A[t] = curr_A、arr_B[t] = curr_B),禁止在分支內有條件落盤,杜絕狀態漏賦值。
我是 Python 演算法開發者。【用戶原始需求】:【在此填入任何口語需求,例如:ATR 移動停損 / 海龜突破 / 雙均線交叉 / 動態網格交易】【架構師前置任務(自動補齊規格)】:在生成 Prompt 前,請先依量化狀態機工程規範,主動將上述需求擴充為:1. 具體函式簽名:包含 df: pd.DataFrame、外部觸發訊號欄位(如 entry_col: str = "entry_signal")及合理預設參數。2. 精準功能描述:明確定義「外部觸發進場條件」、「持倉期間狀態更新」與「離場機制」,嚴禁遺漏外部觸發訊號。【硬性範疇限制】:每次提問僅限單一策略。嚴禁合併多個不同策略,嚴禁設計通用分發引擎(禁止 mode 參數)。請注意:現在先不要寫最終的 Python 實作代碼。請扮演資深系統架構師,梳理該策略的邏輯,並輸出一份『專門餵給本機 14B 代碼模型(Qwen 2.5 Coder 14B)執行的極簡結構化 Prompt』。為了防止本機小模型產生「陣列長度不匹配廣播崩潰」、「偽向量化偷換數學算式」、「時序穿透」、「分支漏賦值導致狀態中斷」或「注意力倒置漏給實作」,產出的 Prompt 必須嚴格遵守以下 5 項架構設計原則:1. 運算範式與數值計算契約(Numerical & Alignment Guard):- 【純無副作用】:函式開頭必須強制執行 `df = df.copy()`,嚴禁修改傳入的原始物件;所有計算出的核心特徵與狀態欄位必須完整回填輸出。- 【時序差分對齊】:凡涉及前一期資訊(t-1 lag)的向量化運算,必須明確給出切片對齊語法(當期切片 [1:] 與前期切片 [:-1] 長度對齊,第 0 筆獨立初始化),嚴禁不同長度陣列直接相減引發廣播崩潰。- 【拒絕偽向量化】:明確區分有限滑動視窗與遞迴平滑(如 EMA、Wilder 等依賴前一期數值之濾波)。凡具備遞迴相依特徵,指示直接以純數值迴圈計算,嚴禁用 np.convolve 或滑動平均冒充。- 【0-based 視窗邊界對齊】:凡涉及長度為 W 之視窗統計或初始暖機計算,首個有效聚合值必須精確對齊至視窗末端索引 W - 1,後續時序推進嚴格自索引 W 起算,嚴禁因 0-based 索引混淆導致邊界偏移(Off-by-one)。- 【異常值傳播契約】:若時序中間出現缺失值(NaN),當期指標計算設為 NaN 即可;當後續數值恢復有效時,直接沿用最近一期有效狀態值延續遞迴平滑,嚴禁指示小模型設計複雜的「中斷後重新累積暖機」邏輯。2. 迴圈拓撲與單一 Pass 限制(Single-Pass FSM Topology):- 明確區分「可全域預先向量化特徵」與「路徑依賴狀態機」。- 【單一迴圈紅線】:若存在狀態轉移依賴,所有相互關聯的事件、進出場判定與動態軌跡更新,必須嚴格封裝在唯一一個 `for t in range(n)` 迴圈內,嚴禁拆成多個獨立迴圈預算事件。3. 依賴閉環與變數綁定(Dependency Closure & Memory Scaffold):- 【依賴閉環原則】:輸入 Schema 中定義的所有決策驅動欄位,在迴圈前必須轉為 1D NumPy 陣列;且必須在狀態機迴圈的 `if` 條件分支中被顯式引用,嚴禁輸入欄位被閒置或遺忘。- 所有輸出欄位,在進入迴圈前於記憶體預先宣告配置好 1D NumPy 陣列(禁止在迴圈內對 DataFrame 逐列賦值)。4. 純量狀態機與統一提交架構(Scalar Register & Unified Commit):- 【純量變數隔離】:迴圈外部初始化純量狀態暫存器(如 curr_pos=0, curr_peak=np.nan, curr_stop=np.nan)。迴圈內部各條件分支「僅允許修改純量變數」,嚴禁在 if-elif 分支內部直接對 position[t] 或 stop[t] 賦值。- 【單向因果流動】:迴圈首行固定執行 prev_pos, prev_peak, prev_stop = curr_pos, curr_peak, curr_stop 凍結前值以防時序穿透。- 【統一提交出口(顯式代碼清單)】:產出的 Prompt 嚴禁使用「提交所有狀態」等概括性文字。架構師必須在骨架尾端,根據該策略宣告的所有狀態純量,具體逐行寫出無條件提交的賦值代碼(格式為 arr_A[t] = curr_A、arr_B[t] = curr_B),禁止在分支內有條件落盤,杜絕狀態漏賦值。5. 極限邊界防禦與 Negative Constraints:- 空資料、長度不足時安全回傳帶有完整目標 Schema 的 DataFrame,嚴禁索引越界。- 數據中斷(NaN/None)時明確規定狀態凍結或沿用前值,嚴禁使用全域 fillna(0) 或重新累積暖機破壞時序。- 嚴格禁止使用 iterrows、itertuples、未定義欄位預先存取及拿回傳表比對原始物件。- 產出的 Prompt 篇幅控制在 600~800 字內,要求小模型依序輸出「完整函式」與「狀態邏輯 pytest 驗證(無須手算小數)」。
# 任務:動態網格交易函式僅實作 `dynamic_grid(df: pd.DataFrame, entry_col: str = "entry_signal", grid_pct: float = 0.02, lot_size: float = 1.0, max_positions: int = 5) -> pd.DataFrame`。單一多頭固定百分比網格,禁止 mode、多策略及通用引擎。## 1. 策略規格必要欄位 `Close, entry_col`。僅空倉且外部訊號明確為 True 時,以當期 Close 啟動網格;無有效訊號不得進場。買入格與賣出格初始分別為啟動價下方與上方一格,間距為啟動價乘 `grid_pct`。持倉期間,Close 到達下一買入格且持倉未達 `max_positions` 時加一單位;Close 到達下一賣出格且持倉大於零時減一單位。每根 K 線最多成交一格,交易後按固定格距推進相應網格。持倉歸零即結束週期並清除網格;清倉當根不得重新進場。此為訊號模擬,不模擬滑價與手續費。## 2. 數值契約函式首行 `df = df.copy()`;保留原欄位,新增 `Grid_Level, Next_Buy, Next_Sell, Position, Entry_Event, Buy_Event, Sell_Event, Exit_Event`。驗證欄位及參數:`grid_pct`、`lot_size` 為正有限數;`max_positions` 為正整數且不可為 bool。所有決策欄位轉成一維 NumPy 陣列,所有輸出陣列預先配置。前期差分若使用向量化,必須以 `[1:]` 與 `[:-1]` 對齊,第 0 筆獨立處理;禁止偽向量化替代路徑依賴邏輯。空資料安全回傳完整 Schema。## 3. 單一 FSM 與缺失值唯一 `for t in range(n)` 迴圈處理進場、買賣、網格推進及事件。迴圈首行凍結 `prev_pos, prev_buy, prev_sell, prev_grid = curr_pos, curr_buy, curr_sell, curr_grid`。缺失 Close 或不明確訊號時凍結交易狀態,事件皆 False;禁止 `fillna(0)`。分支僅修改純量與事件旗標,不可直接寫輸出陣列。所有決策只使用當期資料及前期已確認狀態。禁止 `iterrows`、`itertuples`、未驗證欄位存取及 DataFrame 逐列賦值。## 4. 狀態骨架與統一提交迴圈外初始化 `curr_pos=0`、`curr_buy=np.nan`、`curr_sell=np.nan`、`curr_grid=np.nan`,事件旗標每根重設為 False。迴圈首行依上式凍結前值;分支只更新純量。迴圈尾端必須逐行無條件提交,禁止分支內落盤:`position_arr[t] = curr_pos``next_buy_arr[t] = curr_buy``next_sell_arr[t] = curr_sell``grid_level_arr[t] = curr_grid``entry_event_arr[t] = curr_entry_event``buy_event_arr[t] = curr_buy_event``sell_event_arr[t] = curr_sell_event``exit_event_arr[t] = curr_exit_event`## 5. 交付依序輸出完整函式及 pytest。測試涵蓋原始資料不變、空資料、參數驗證、外部訊號控制、逐格買賣、持倉上限、事件互斥、清倉不重進、缺失值凍結與狀態延續。以事件與狀態關係驗證,不必手算小數;不得宣稱未實際執行的測試通過。
import pandas as pdimport numpy as npdef dynamic_grid(df: pd.DataFrame, entry_col: str = "entry_signal", grid_pct: float = 0.02,lot_size: float = 1.0, max_positions: int = 5) -> pd.DataFrame:df = df.copy()# Validate inputrequired_cols = ['Close', entry_col]if not all(col in df.columns for col in required_cols):raise ValueError(f"Missing required columns: {', '.join(required_cols)}")if not pd.api.types.is_numeric_dtype(df['Close']):raise ValueError("Close must be a numeric type.")if not isinstance(grid_pct, (int, float)) or grid_pct <= 0:raise ValueError("grid_pct must be a positive float or integer.")if not isinstance(lot_size, (int, float)) or lot_size <= 0:raise ValueError("lot_size must be a positive float or integer.")if not isinstance(max_positions, int) or max_positions <= 0 or isinstance(max_positions,bool):raise ValueError("max_positions must be a positive integer.")n = len(df)close = df['Close'].valuesentry_signal = df[entry_col].values.astype(bool)grid_level_arr = np.full(n, np.nan)next_buy_arr = np.full(n, np.nan)next_sell_arr = np.full(n, np.nan)position_arr = np.zeros(n, dtype=int)entry_event_arr = np.zeros(n, dtype=bool)buy_event_arr = np.zeros(n, dtype=bool)sell_event_arr = np.zeros(n, dtype=bool)exit_event_arr = np.zeros(n, dtype=bool)curr_pos = 0curr_buy = np.nancurr_sell = np.nancurr_grid = np.nanfor t in range(n):prev_pos = curr_posprev_buy = curr_buyprev_sell = curr_sellprev_grid = curr_gridvalid_close = np.isfinite(close[t])valid_entry = entry_signal[t]curr_entry_event = Falsecurr_buy_event = Falsecurr_sell_event = Falsecurr_exit_event = Falseif prev_pos == 0 and valid_entry and valid_close:curr_grid = close[t]curr_buy = curr_grid * (1 - grid_pct)curr_sell = curr_grid * (1 + grid_pct)curr_pos = 1curr_entry_event = Trueelif valid_close:if curr_pos < max_positions and close[t] <= curr_buy:curr_pos += 1curr_buy = prev_buy * (1 - grid_pct)curr_sell = prev_sell * (1 - grid_pct)curr_buy_event = Trueelif curr_pos > 0 and close[t] >= curr_sell:curr_pos -= 1curr_buy = prev_buy * (1 + grid_pct)curr_sell = prev_sell * (1 + grid_pct)curr_sell_event = Trueif curr_pos == 0 and prev_pos > 0:curr_exit_event = Truegrid_level_arr[t] = curr_gridnext_buy_arr[t] = curr_buynext_sell_arr[t] = curr_sellposition_arr[t] = curr_posentry_event_arr[t] = curr_entry_eventbuy_event_arr[t] = curr_buy_eventsell_event_arr[t] = curr_sell_eventexit_event_arr[t] = curr_exit_eventdf['Grid_Level'] = grid_level_arrdf['Next_Buy'] = next_buy_arrdf['Next_Sell'] = next_sell_arrdf['Position'] = position_arrdf['Entry_Event'] = entry_event_arrdf['Buy_Event'] = buy_event_arrdf['Sell_Event'] = sell_event_arrdf['Exit_Event'] = exit_event_arrreturn dfdef test_dynamic_grid():data = {'Close': [100, 102, 103, 98, 95, 97, 100, 101, 102, 103, 104],'entry_signal': [True, False, False, False, False, False, False, False, False, False,False]}df = pd.DataFrame(data)result = dynamic_grid(df)assert 'Grid_Level' in result.columnsassert 'Next_Buy' in result.columnsassert 'Next_Sell' in result.columnsassert 'Position' in result.columnsassert 'Entry_Event' in result.columnsassert 'Buy_Event' in result.columnsassert 'Sell_Event' in result.columnsassert 'Exit_Event' in result.columnsdef test_empty_data():df = pd.DataFrame(columns=['Close', 'entry_signal'])result = dynamic_grid(df)assert 'Grid_Level' in result.columnsassert 'Next_Buy' in result.columnsassert 'Next_Sell' in result.columnsassert 'Position' in result.columnsassert 'Entry_Event' in result.columnsassert 'Buy_Event' in result.columnsassert 'Sell_Event' in result.columnsassert 'Exit_Event' in result.columnsdef test_parameter_validation():data = {'Close': [100, 102, 103, 98, 95, 97, 100, 101, 102, 103, 104],'entry_signal': [True, False, False, False, False, False, False, False, False, False,False]}df = pd.DataFrame(data)try:dynamic_grid(df, grid_pct=-0.02)except ValueError as e:assert str(e) == "grid_pct must be a positive float or integer."try:dynamic_grid(df, lot_size=-1.0)except ValueError as e:assert str(e) == "lot_size must be a positive float or integer."try:dynamic_grid(df, max_positions=-5)except ValueError as e:assert str(e) == "max_positions must be a positive integer."def test_missing_data():data = {'Close': [100, np.nan, 103, 98, np.nan, 97, 100, 101, 102, 103, 104],'entry_signal': [True, False, False, False, False, False, False, False, False, False,False]}df = pd.DataFrame(data)result = dynamic_grid(df)assert 'Grid_Level' in result.columnsassert 'Next_Buy' in result.columnsassert 'Next_Sell' in result.columnsassert 'Position' in result.columnsassert 'Entry_Event' in result.columnsassert 'Buy_Event' in result.columnsassert 'Sell_Event' in result.columnsassert 'Exit_Event' in result.columnsdef test_no_entry_no_position():data = {'Close': [100, 102, 103, 98, 95, 97, 100, 101, 102, 103, 104],'entry_signal': [False, False, False, False, False, False, False, False, False, False,False]}df = pd.DataFrame(data)result = dynamic_grid(df)assert all(result['Position'] == 0)assert all(result['Grid_Level'].isna())assert all(result['Next_Buy'].isna())assert all(result['Next_Sell'].isna())assert all(result['Entry_Event'] == False)assert all(result['Buy_Event'] == False)assert all(result['Sell_Event'] == False)assert all(result['Exit_Event'] == False)def test_entry_and_trading():data = {'Close': [100, 102, 103, 98, 95, 97, 100, 101, 102, 103, 104],'entry_signal': [True, False, False, False, False, False, False, False, False, False,False]}df = pd.DataFrame(data)result = dynamic_grid(df)assert result['Entry_Event'][0] == Trueassert result['Position'][0] == 1assert result['Grid_Level'][0] == 100assert result['Next_Buy'][0] == 98assert result['Next_Sell'][0] == 102assert all(result['Buy_Event'][1:5] == False)assert result['Buy_Event'][5] == Trueassert result['Position'][5] == 2assert result['Next_Buy'][5] == 96assert result['Next_Sell'][5] == 100assert all(result['Sell_Event'][6:] == False)assert result['Sell_Event'][9] == Trueassert result['Position'][9] == 1assert result['Next_Buy'][9] == 98assert result['Next_Sell'][9] == 102assert result['Exit_Event'][10] == Trueassert result['Position'][10] == 0def test_max_positions():data = {'Close': [100, 102, 103, 98, 95, 97, 100, 101, 102, 103, 104],'entry_signal': [True, False, False, False, False, False, False, False, False, False,False]}df = pd.DataFrame(data)result = dynamic_grid(df, max_positions=2)assert result['Entry_Event'][0] == Trueassert result['Position'][0] == 1assert result['Grid_Level'][0] == 100assert result['Next_Buy'][0] == 98assert result['Next_Sell'][0] == 102assert all(result['Buy_Event'][1:5] == False)assert result['Buy_Event'][5] == Falseassert result['Position'][5] == 1assert result['Next_Buy'][5] == 98assert result['Next_Sell'][5] == 102assert all(result['Sell_Event'][6:] == False)assert result['Exit_Event'][10] == Trueassert result['Position'][10] == 0def test_no_reentry():data = {'Close': [100, 102, 103, 98, 95, 97, 100, 101, 102, 103, 104],'entry_signal': [True, False, False, False, False, True, False, False, False, False,False]}df = pd.DataFrame(data)result = dynamic_grid(df)assert result['Entry_Event'][0] == Trueassert result['Position'][0] == 1assert result['Grid_Level'][0] == 100assert result['Next_Buy'][0] == 98assert result['Next_Sell'][0] == 102assert all(result['Buy_Event'][1:5] == False)assert result['Buy_Event'][5] == Falseassert result['Position'][5] == 1assert result['Next_Buy'][5] == 98assert result['Next_Sell'][5] == 102assert all(result['Sell_Event'][6:] == False)assert result['Exit_Event'][10] == Trueassert result['Position'][10] == 0
你是 Python 量化系統分析師。小白用戶只會提供非常口語的交易想法。你的任務是將口語需求轉換為符合量化狀態機規範的「標準任務規格宣告」,特別注意補齊「外部觸發訊號依賴」,杜絕模型天天自動進場。請依以下格式輸出,不要有多餘廢話:名稱:[標準 snake_case 函式簽名,包含 DataFrame、明確的進場觸發欄位 entry_col 與合理預設參數]功能:[一句話精準定義:由誰觸發進場、如何維護路徑依賴狀態、依何種規則離場]---用戶口語需求:【此處貼上小白的一句話,例如:ATR 移動停損】
名稱:atr_trailing_stop(df: pd.DataFrame, entry_col: str = "Entry_Signal", period: int = 14, multiplier: float = 3.0) -> pd.DataFrame功能:僅由 entry_col 指定的外部訊號觸發進場,以 Wilder ATR 維護路徑依賴的累積最高價與不回撤停損線,當收盤價跌破前一期已確認的停損線時離場;無有效進場訊號時保持空倉。
我是 Python 演算法開發者。我需要實作一個函式:名稱:atr_trailing_stop(df: pd.DataFrame, entry_col: str = "Entry_Signal", period: int = 14, multiplier: float = 3.0) -> pd.DataFrame。功能:僅由 entry_col 指定的外部訊號觸發進場,以 Wilder ATR 維護路徑依賴的累積最高價與不回撤停損線,當收盤價跌破前一期已確認的停損線時離場;無有效進場訊號時保持空倉。【嚴格限制】:僅限實作此單一函式,嚴禁設計多模式切換引擎。請注意:現在先不要寫最終的 Python 實作代碼。請扮演資深系統架構師,梳理邏輯,並輸出一份『專門餵給本機 14B 代碼模型(Qwen 2.5 Coder 14B)執行的極簡結構化 Prompt』。為了防止本機小模型產生「陣列長度不匹配廣播崩潰」、「偽向量化偷換數學算式」、「時序穿透」或「遺漏輸入條件」,產出的 Prompt 必須嚴格遵守以下 5 項架構設計原則:1. 運算範式與數值計算契約(Numerical & Alignment Guard):- 【純無副作用】:函式開頭必須強制執行 `df = df.copy()`,嚴禁修改傳入的原始物件;所有計算出的核心特徵與狀態欄位必須完整回填輸出。- 【時序差分對齊】:凡涉及前一期資訊(t-1 lag)的向量化運算,必須明確給出切片對齊語法(當期切片 [1:] 與前期切片 [:-1] 長度對齊,第 0 筆獨立初始化),嚴禁不同長度陣列直接相減引發廣播崩潰。- 【拒絕偽向量化】:明確區分有限滑動視窗與遞迴平滑(如 EMA、Wilder 等依賴前一期數值之濾波)。凡具備遞迴相依特徵,指示直接以純數值迴圈計算,嚴禁用 np.convolve 或滑動平均冒充。- 【0-based 視窗邊界對齊】:凡涉及長度為 $W$ 之視窗統計或初始暖機計算,首個有效聚合值必須精確對齊至視窗末端索引 $W - 1$,後續時序推進嚴格自索引 $W$ 起算,嚴禁因 0-based 索引混淆導致邊界偏移(Off-by-one)。2. 迴圈拓撲與單一 Pass 限制(Single-Pass FSM Topology):- 明確區分「可全域預先向量化特徵」與「路徑依賴狀態機」。- 【單一迴圈紅線】:若存在狀態轉移依賴,所有相互關聯的事件、進出場判定與動態軌跡更新,必須嚴格封裝在唯一一個 `for t in range(n)` 迴圈內,嚴禁拆成多個獨立迴圈預算事件。3. 依賴閉環與變數綁定(Dependency Closure & Memory Scaffold):- 【依賴閉環原則】:輸入 Schema 中定義的所有決策驅動欄位,在迴圈前必須轉為 1D NumPy 陣列;且必須在狀態機迴圈的 `if` 條件分支中被顯式引用,嚴禁輸入欄位被閒置或遺忘。- 所有輸出欄位,在進入迴圈前於記憶體預先宣告配置好 1D NumPy 陣列(禁止在迴圈內對 DataFrame 逐列賦值)。4. 純量狀態機與統一提交架構(Scalar Register & Unified Commit):- 【純量變數隔離】:迴圈外部初始化純量狀態暫存器(如 curr_pos=0, curr_peak=np.nan, curr_stop=np.nan)。迴圈內部各條件分支「僅允許修改純量變數」,嚴禁在 if-elif 分支內部直接對 position[t] 或 stop[t] 賦值。- 【單向因果流動】:迴圈首行固定執行 prev_pos, prev_peak, prev_stop = curr_pos, curr_peak, curr_stop 凍結前值以防時序穿透。- 【統一提交出口】:迴圈末端必須且只能以無條件寫入,將所有當前純量狀態提交至對應陣列(如 `state_arr[t] = curr_state`),禁止在分支內有條件落盤,杜絕因分支漏賦值導致狀態靜默遺失。5. 極限邊界防禦與 Negative Constraints:- 空資料、長度不足時安全回傳帶有完整目標 Schema 的空 DataFrame。- 數據中斷(NaN/None)時明確規定狀態凍結或沿用規則,不可使用全域 fillna(0) 破壞缺失值語意。- 嚴格禁止使用 iterrows、itertuples、未定義欄位預先存取。- 產出的 Prompt 篇幅控制在 600~800 字內,要求小模型輸出完整代碼與 pytest 驗證案例。
# 任務:實作單一 ATR Trailing Stop你是資深 Python 量化工程師。實作唯一函式 `atr_trailing_stop(df: pd.DataFrame, entry_col: str = "Entry_Signal", period: int = 14, multiplier: float = 3.0) -> pd.DataFrame`。禁止多模式引擎。## 1. 數值與對齊契約- 函式首行執行 `df = df.copy()`;保留原欄位,新增並完整回填 `TR, ATR, Peak, Stop, Position, Entry_Event, Exit_Event`。- 必要欄位為 `High, Low, Close, entry_col`。先驗證欄位,再處理空資料;數值欄位須為數值型別。`period` 必須是正整數且不可為 bool;`multiplier` 必須為正有限數。- TR:首筆 `High-Low`;其餘為 `max(High-Low, abs(High-prev_close), abs(Low-prev_close))`。差分使用 `[1:]` 與 `[:-1]` 對齊,第 0 筆獨立處理;必要輸入缺失時 TR=NaN。- ATR 嚴格使用 Wilder 遞迴:首個連續 `period` 筆有效 TR 的算術平均對齊索引 `period-1`;後續公式為 `(prev_ATR*(period-1)+TR[t])/period`。禁止以 `np.convolve`、rolling mean 或滑動平均替代。- TR 缺失時當期 ATR=NaN;後續 TR 恢復有效時,若已有有效 ATR,沿用最近有效 ATR 作遞迴基值;若尚無有效 ATR,繼續累積暖機資料,直到取得完整有效視窗。不得全域 `fillna(0)`。## 2. 迴圈拓撲TR 可向量化;ATR 遞迴可使用獨立數值迴圈。所有進出場、事件、Peak、Stop 與 Position 更新必須集中於唯一一個 `for t in range(n)` 狀態機迴圈,禁止拆分事件迴圈。迴圈前將所有決策欄位轉為一維 NumPy 陣列,並預配置全部輸出陣列。## 3. 狀態機與因果- 初始空倉 `Position=0`;僅明確為 True 的外部訊號可進場,不得自動進場。進場需有效 Close、High、ATR;初始 `Peak=High`、`Stop=Peak-multiplier*ATR`。- 持倉期間 Peak 為累積最高 High;Stop 單調不下降:`max(prev_stop, Peak-multiplier*ATR)`。- 先用前一期已確認停損線判斷離場:`Close[t] <= prev_stop`。離場當根禁止重新進場。- 缺少必要決策資料時凍結持倉、Peak、Stop,事件皆為 False;ATR 缺失時不得用無效數值更新停損。- 迴圈首行凍結 `prev_pos, prev_peak, prev_stop = curr_pos, curr_peak, curr_stop`。分支僅修改純量狀態及事件旗標,不得直接寫輸出陣列;迴圈末端無條件提交所有狀態與事件陣列。## 4. 邊界與輸出空資料、短資料均不得越界,回傳含完整輸出欄位的 DataFrame。禁止 `iterrows`、`itertuples`、未驗證欄位存取、DataFrame 逐列賦值及修改輸入物件。## 5. 測試與交付依序輸出完整函式,再輸出 pytest 測試。測試涵蓋原始資料不變、空資料、短資料、欄位與參數驗證、外部訊號控制、進出場時序、停損單調性、缺失值凍結與恢復。以狀態關係及事件位置驗證,無須手算小數。預期結果必須符合規格,不可為配合實作而修改;未實際執行測試時不得宣稱通過。
我是 Python 演算法開發者。【用戶原始需求】:【在此填入任何口語需求,例如:ATR 移動停損 / 海龜突破 / 雙均線交叉 / 動態網格交易】【架構師前置任務(自動補齊規格)】:在生成 Prompt 前,請先依量化狀態機工程規範,主動將上述需求擴充為:1. 具體函式簽名:包含 df: pd.DataFrame、外部觸發訊號欄位(如 entry_col: str = "entry_signal")及合理預設參數。2. 精準功能描述:明確定義「外部觸發進場條件」、「持倉期間狀態更新」與「離場機制」,嚴禁遺漏外部觸發訊號。【硬性範疇限制】:每次提問僅限單一策略。嚴禁合併多個不同策略,嚴禁設計通用分發引擎(禁止 mode 參數)。請注意:現在先不要寫最終的 Python 實作代碼。請扮演資深系統架構師,梳理該策略的邏輯,並輸出一份『專門餵給本機 14B 代碼模型(Qwen 2.5 Coder 14B)執行的極簡結構化 Prompt』。為了防止本機小模型產生「陣列長度不匹配廣播崩潰」、「偽向量化偷換數學算式」、「時序穿透」、「分支漏賦值導致狀態中斷」或「注意力倒置漏給實作」,產出的 Prompt 必須嚴格遵守以下 5 項架構設計原則:1. 運算範式與數值計算契約(Numerical & Alignment Guard):- 【純無副作用】:函式開頭必須強制執行 `df = df.copy()`,嚴禁修改傳入的原始物件;所有計算出的核心特徵與狀態欄位必須完整回填輸出。- 【時序差分對齊】:凡涉及前一期資訊(t-1 lag)的向量化運算,必須明確給出切片對齊語法(當期切片 [1:] 與前期切片 [:-1] 長度對齊,第 0 筆獨立初始化),嚴禁不同長度陣列直接相減引發廣播崩潰。- 【拒絕偽向量化】:明確區分有限滑動視窗與遞迴平滑(如 EMA、Wilder 等依賴前一期數值之濾波)。凡具備遞迴相依特徵,指示直接以純數值迴圈計算,嚴禁用 np.convolve 或滑動平均冒充。- 【0-based 視窗邊界對齊】:凡涉及長度為 W 之視窗統計或初始暖機計算,首個有效聚合值必須精確對齊至視窗末端索引 W - 1,後續時序推進嚴格自索引 W 起算,嚴禁因 0-based 索引混淆導致邊界偏移(Off-by-one)。- 【異常值傳播契約】:若時序中間出現缺失值(NaN),當期指標計算設為 NaN 即可;當後續數值恢復有效時,直接沿用最近一期有效狀態值延續遞迴平滑,嚴禁指示小模型設計複雜的「中斷後重新累積暖機」邏輯。2. 迴圈拓撲與單一 Pass 限制(Single-Pass FSM Topology):- 明確區分「可全域預先向量化特徵」與「路徑依賴狀態機」。- 【單一迴圈紅線】:若存在狀態轉移依賴,所有相互關聯的事件、進出場判定與動態軌跡更新,必須嚴格封裝在唯一一個 `for t in range(n)` 迴圈內,嚴禁拆成多個獨立迴圈預算事件。3. 依賴閉環與變數綁定(Dependency Closure & Memory Scaffold):- 【依賴閉環原則】:輸入 Schema 中定義的所有決策驅動欄位,在迴圈前必須轉為 1D NumPy 陣列;且必須在狀態機迴圈的 `if` 條件分支中被顯式引用,嚴禁輸入欄位被閒置或遺忘。- 所有輸出欄位,在進入迴圈前於記憶體預先宣告配置好 1D NumPy 陣列(禁止在迴圈內對 DataFrame 逐列賦值)。4. 純量狀態機與統一提交架構(Scalar Register & Unified Commit):- 【純量變數隔離】:迴圈外部初始化純量狀態暫存器(如 curr_pos=0, curr_peak=np.nan, curr_stop=np.nan)。迴圈內部各條件分支「僅允許修改純量變數」,嚴禁在 if-elif 分支內部直接對 position[t] 或 stop[t] 賦值。- 【單向因果流動】:迴圈首行固定執行 prev_pos, prev_peak, prev_stop = curr_pos, curr_peak, curr_stop 凍結前值以防時序穿透。- 【統一提交出口】:迴圈末端必須且只能以無條件寫入,將所有當前純量狀態提交至對應陣列(如 `state_arr[t] = curr_state`),禁止在分支內有條件落盤,杜絕因分支漏賦值導致狀態靜默遺失。5. 極限邊界防禦與 Negative Constraints:- 空資料、長度不足時安全回傳帶有完整目標 Schema 的 DataFrame,嚴禁索引越界。- 數據中斷(NaN/None)時明確規定狀態凍結或沿用前值,嚴禁使用全域 fillna(0) 或重新累積暖機破壞時序。- 嚴格禁止使用 iterrows、itertuples、未定義欄位預先存取及拿回傳表比對原始物件。- 產出的 Prompt 篇幅控制在 600~800 字內,要求小模型依序輸出「完整函式」與「狀態邏輯 pytest 驗證(無須手算小數)」。
| 模型名稱 | 架構/參數量 | 邏輯推理能力 | 程式能力 (弱約束 Prompt) |
程式能力 (強約束 Prompt) |
|---|---|---|---|---|
| Qwen 2.5 Coder 14B | 稠密 14B | ❌ 陷入陷阱,硬湊 5 步三分法,最後產生幻覺 | ❌ 語法齊全但有 Runtime Bug(idxmin 空切片崩潰、索引混淆) | 🌟 完美(100 分) 精準落實向量化與防禦邊界,代碼零 Bug |
| Gemma 4 | 具備推論思維鏈 (Thinking)8B |
🌟 唯一識破悖論 以資訊論 3^3=27 < 200 精準證明數學不可能 |
⚠️ 思考死循環,Token 吃滿後無輸出中斷 | ✔️ 有效 但需強制壓制思考長度並調大 num_predict |
| Phi-4 14B | 稠密 14B (微軟合成資料) |
❌ 算術混亂(11 × 4 = 33),主觀假設輕重,次數超標 | ❌ 邏輯互斥死代碼(在 > 0.2 的子集內找 <= 0.2,輸出永為空) | ✔️ 可用 能被修正,但在極端邊界上仍偶有小瑕疵 |
| DeepSeek-Coder-V2-Lite | 混合專家 (MoE) 16B (活化約 2.4B) |
❌ 算術全面失真(憑空多出球),分支失控爆 Token 斷頭 | ❌ 偽造輸出結果,文案說明與實際執行邏輯 | ❌不推薦用於複雜邏輯活化參數量太小,注意力衰減嚴重,多輪約束下容易顧此失彼。 |
我是 Python 演算法開發者。我需要實作一個函式:名稱:[填入單一函式名稱例如:atr_trailing_stop()]。功能:[計算 ATR 移動停損與持倉狀態機]。【嚴格限制】:僅限實作此單一函式,嚴禁設計多模式切換引擎。請注意:現在先不要寫最終的 Python 實作代碼。請扮演資深系統架構師,梳理邏輯,並輸出一份『專門餵給本機 14B 代碼模型(Qwen 2.5 Coder 14B)執行的極簡結構化 Prompt』。為了防止本機小模型產生「陣列長度不匹配廣播崩潰」、「偽向量化偷換數學算式」、「時序穿透」或「遺漏輸入條件」,產出的 Prompt 必須嚴格遵守以下 5 項架構設計原則:1. 運算範式與數值計算契約(Numerical & Alignment Guard):- 【純無副作用】:函式開頭必須強制執行 `df = df.copy()`,嚴禁修改傳入的原始物件;所有計算出的核心特徵與狀態欄位必須完整回填輸出。- 【時序差分對齊】:凡涉及前一期資訊(t-1 lag)的向量化運算,必須明確給出切片對齊語法(當期切片 [1:] 與前期切片 [:-1] 長度對齊,第 0 筆獨立初始化),嚴禁不同長度陣列直接相減引發廣播崩潰。- 【拒絕偽向量化】:明確區分有限滑動視窗與遞迴平滑(如 EMA、Wilder 等依賴前一期數值之濾波)。凡具備遞迴相依特徵,指示直接以純數值迴圈計算,嚴禁用 np.convolve 或滑動平均冒充。2. 迴圈拓撲與單一 Pass 限制(Single-Pass FSM Topology):- 明確區分「可全域預先向量化特徵」與「路徑依賴狀態機」。- 【單一迴圈紅線】:若存在狀態轉移依賴,所有相互關聯的事件、進出場判定與動態軌跡更新,必須嚴格封裝在唯一一個 `for t in range(n)` 迴圈內,嚴禁拆成多個獨立迴圈預算事件。3. 依賴閉環與變數綁定(Dependency Closure & Memory Scaffold):- 【依賴閉環原則】:輸入 Schema 中定義的所有決策驅動欄位,在迴圈前必須轉為 1D NumPy 陣列;且必須在狀態機迴圈的 `if` 條件分支中被顯式引用,嚴禁輸入欄位被閒置或遺忘。- 所有輸出欄位,在進入迴圈前於記憶體預先宣告配置好 1D NumPy 陣列(禁止在迴圈內對 DataFrame 逐列賦值)。4. 具體化狀態轉移骨架(Explicit FSM Skeleton):- 必須將迴圈內的條件分支寫出「具體布林運算式代碼骨架」,禁止使用抽象註解(例如必須寫出明確的 `if state == A and condition_var[t]:`)。- 狀態流動順序必須保證「先讀取/凍結前一期已確認狀態進行離場或決策 → 再處理進場/重設 → 再更新累積極值與動態邊界 → 寫入當期陣列」,杜絕未來函數。5. 極限邊界防禦與 Negative Constraints:- 空資料、長度不足時安全回傳帶有完整目標 Schema 的空 DataFrame。- 數據中斷(NaN/None)時明確規定狀態凍結或沿用規則,不可使用全域 fillna(0) 破壞缺失值語意。- 嚴格禁止使用 iterrows、itertuples、未定義欄位預先存取。- 產出的 Prompt 篇幅控制在 600~800 字內,要求小模型輸出完整代碼與 pytest 驗證案例。
| 評比維度 | Google Gemini | OpenAI ChatGPT | Anthropic Claude |
|---|---|---|---|
| 旗艦模型可用性 | 極高 開放主流長文本與思考模型(Flash / Pro 輪替),無嚴格斷崖限制。 |
中等 有限次數體驗 GPT-4o,用畢降級至 mini;思考模型(o1/o3)額度極少。 |
極低 雖可選 Sonnet,但免費對話數輪後極易觸發冷卻鎖定。 |
| 對話輪數與冷卻 | 最慷慨 一般文字對話極少撞牆,可保持長時間多輪連續互動。 |
中規中矩 高階模型約 3~5 小時給予 10~15 則額度,降級後 mini 不限次數。 |
最嚴格 連續 5~10 輪或傳送長代碼即可能需等待數小時。 |
| 上下文長度 (Context) | 極長 免費即支援百萬級長文本,可直接整本讀取大文件或大量程式碼。 |
普通 支援標準對話記憶長度,過長資料需分批或分段輸入。 |
嚴格受限 模型雖支援長文本,但免費版傳大檔案會迅速耗盡配額。 |
| 檔案上傳與程式執行 | 完整開放 支援各類文件上傳,內建 Python 沙盒可即時分析資料與產圖。 |
完整開放 支援進階資料分析(Code Interpreter),但計入高階配額。 |
代價較高 支援文件/代碼上傳解析,但無沙盒執行環境且劇烈消耗額度。 |
| AI 圖片生成 | 免費無上限(極寬鬆) 內建 Imagen 模型,生成速度快且無嚴苛次數限制。 |
受限 內建 DALL-E 3,免費帳號每日限制生圖約 2~3 張。 |
無 原生介面完全不支援圖像生成功能。 |
| 聯網即時搜尋 | 原生深度整合 即時串接 Google 搜尋引導,取得時效資訊最敏捷。 |
具備 支援外網 Web Search,搜尋品質與整合度穩定。 |
無 免費 Web 版未整合即時外網搜尋,依賴靜態訓練切斷點。 |
| 工具擴充與生態 | 原生串接 Google Workspace(Gmail、Drive、Docs、Maps)。 | GPT Store 第三方應用生態豐富,可自選各類專家工具。 | 支援 Artifacts 預覽,但協同 Projects 多鎖定於付費方案。 |
4. 具體化狀態轉移骨架(Explicit FSM Skeleton):- 必須將迴圈內的條件分支寫出「具體布林運算式代碼骨架」,禁止使用抽象註解...- 狀態流動順序必須保證「先讀取/凍結前一期已確認狀態進行離場或決策 → 再處理進場/重設 → 再更新累積極值與動態邊界 → 寫入當期陣列」,杜絕未來函數。
4. 純量狀態機與統一提交架構(Scalar Register & Unified Commit):- 【純量變數隔離】:迴圈外部初始化純量狀態暫存器(如 curr_pos=0, curr_peak=np.nan, curr_stop=np.nan)。迴圈內部各條件分支「僅允許修改純量變數」,嚴禁在 if-elif 分支內部直接對 position[t] 或 stop[t] 賦值。- 【單向因果流動】:迴圈首行固定執行 prev_pos, prev_peak, prev_stop = curr_pos, curr_peak, curr_stop 凍結前值以防時序穿透。- 【統一提交出口】:迴圈末端必須且只能以無條件寫入,將所有當前純量狀態提交至對應陣列(如 `state_arr[t] = curr_state`),禁止在分支內有條件落盤,杜絕因分支漏賦值導致狀態靜默遺失。
我是 Python 演算法開發者。我需要實作一個函式:名稱:[填入單一函式名稱例如:atr_trailing_stop()]。功能:[計算 ATR 移動停損與持倉狀態機]。【嚴格限制】:僅限實作此單一函式,嚴禁設計多模式切換引擎。請注意:現在先不要寫最終的 Python 實作代碼。請扮演資深系統架構師,梳理邏輯,並輸出一份『專門餵給本機 14B 代碼模型(Qwen 2.5 Coder 14B)執行的極簡結構化 Prompt』。為了防止本機小模型產生「陣列長度不匹配廣播崩潰」、「偽向量化偷換數學算式」、「時序穿透」或「遺漏輸入條件」,產出的 Prompt 必須嚴格遵守以下 5 項架構設計原則:1. 運算範式與數值計算契約(Numerical & Alignment Guard):- 【純無副作用】:函式開頭必須強制執行 `df = df.copy()`,嚴禁修改傳入的原始物件;所有計算出的核心特徵與狀態欄位必須完整回填輸出。- 【時序差分對齊】:凡涉及前一期資訊(t-1 lag)的向量化運算,必須明確給出切片對齊語法(當期切片 [1:] 與前期切片 [:-1] 長度對齊,第 0 筆獨立初始化),嚴禁不同長度陣列直接相減引發廣播崩潰。- 【拒絕偽向量化】:明確區分有限滑動視窗與遞迴平滑(如 EMA、Wilder 等依賴前一期數值之濾波)。凡具備遞迴相依特徵,指示直接以純數值迴圈計算,嚴禁用 np.convolve 或滑動平均冒充。2. 迴圈拓撲與單一 Pass 限制(Single-Pass FSM Topology):- 明確區分「可全域預先向量化特徵」與「路徑依賴狀態機」。- 【單一迴圈紅線】:若存在狀態轉移依賴,所有相互關聯的事件、進出場判定與動態軌跡更新,必須嚴格封裝在唯一一個 `for t in range(n)` 迴圈內,嚴禁拆成多個獨立迴圈預算事件。3. 依賴閉環與變數綁定(Dependency Closure & Memory Scaffold):- 【依賴閉環原則】:輸入 Schema 中定義的所有決策驅動欄位,在迴圈前必須轉為 1D NumPy 陣列;且必須在狀態機迴圈的 `if` 條件分支中被顯式引用,嚴禁輸入欄位被閒置或遺忘。- 所有輸出欄位,在進入迴圈前於記憶體預先宣告配置好 1D NumPy 陣列(禁止在迴圈內對 DataFrame 逐列賦值)。4. 純量狀態機與統一提交架構(Scalar Register & Unified Commit):- 【純量變數隔離】:迴圈外部初始化純量狀態暫存器(如 curr_pos=0, curr_peak=np.nan, curr_stop=np.nan)。迴圈內部各條件分支「僅允許修改純量變數」,嚴禁在 if-elif 分支內部直接對 position[t] 或 stop[t] 賦值。- 【單向因果流動】:迴圈首行固定執行 prev_pos, prev_peak, prev_stop = curr_pos, curr_peak, curr_stop 凍結前值以防時序穿透。- 【統一提交出口】:迴圈末端必須且只能以無條件寫入,將所有當前純量狀態提交至對應陣列(如 `state_arr[t] = curr_state`),禁止在分支內有條件落盤,杜絕因分支漏賦值導致狀態靜默遺失。5. 極限邊界防禦與 Negative Constraints:- 空資料、長度不足時安全回傳帶有完整目標 Schema 的空 DataFrame。- 數據中斷(NaN/None)時明確規定狀態凍結或沿用規則,不可使用全域 fillna(0) 破壞缺失值語意。- 嚴格禁止使用 iterrows、itertuples、未定義欄位預先存取。- 產出的 Prompt 篇幅控制在 600~800 字內,要求小模型輸出完整代碼與 pytest 驗證案例。