程式交易050回溯測試過去60天

Поділитися
Вставка
  • Опубліковано 18 тра 2024
  • 示範 programmingtrading.blogspot.c...
    #資料檔 drive.google.com/file/d/1eB8B...
    import csv #輸入csv套件comma separated value
    file = open('SPY.csv','r') #打開下載的檔案SPY.CSV,模式是r讀取,
    csvreader = csv.reader(file) #將檔案逐列讀入串列變數csvreader
    header, rows = [], [] #宣告空白串列(陣列,清單)
    header = next(csvreader) #串列header儲存檔案第一列
    for row in csvreader: #檔案接續逐列附加append於rows串列
    rows.append(row)
    file.close() #關閉檔案
    header.extend(['MA20','部位','最大','獲利','最小','損失']) #第7至12欄
    for i in range(19):
    rows[i].extend([rows[i][5],0]) #第7欄用收盤當20日平均,第8欄部位0
    for i in range(19,len(rows)):
    sum20 = 0.0 #實數=浮點數
    for j in range(i-19, i+1):
    sum20 += float(rows[j][5])
    rows[i].extend([sum20/20, 0]) #第7欄20日平均,第8欄部位0
    listx = [y/1000 for y in range (31)]#測試31個突破點0, 0.1%...3%
    for i in range(80,len(rows)): #目標是len(rows)
    listgain = [0.0 for y in range (31)]#儲存31個突破點的損益,預設0
    listextreme = [0, 0.0, 0, 0.0] #儲存最大值、最小值
    for k in range(len(listx)): #測試特定參數
    for j in range (i-60,i):
    dayClose = float(rows[j][5])
    if rows[j-1][8]小於 1 and dayClose 大於 rows[j-1][7]*(1+listx[k]):
    rows[j][8]=1 #做多
    elif rows[j-1][8]大於 -1 and dayClose 小於 rows[j-1][7]*(1-listx[k]):
    rows[j][8]=-1 #做空
    else:
    rows[j][8]=rows[j-1][8] #維持原來的部位
    for j in range (i-60,i): #計算損益
    dayGain = float(rows[j][6])-float(rows[j-1][6])
    if rows[j-1][8] == 1:
    listgain[k] += dayGain
    elif rows[j-1][8] == -1:
    listgain[k] += - dayGain
    else: pass #沒有損益
    if listextreme[1] 小於 listgain[k]: #測試是否更大
    listextreme[0] = k
    listextreme[1] = listgain[k]
    if listextreme[3] 大於 listgain[k]: #測試是否更小
    listextreme[2] = k
    listextreme[3] = listgain[k]
    rows[i].extend(listextreme) #形成9至12欄
    file = open('SPYW.CSV','w',newline='',encoding='utf-8')
    w = csv.writer(file) #寫入檔案
    w.writerow(header) #寫入標題
    w.writerows(rows) #第7列將檔案內容名稱rows
    file.close()

КОМЕНТАРІ •