运用python进行海龟交易法回测
生活随笔
收集整理的這篇文章主要介紹了
运用python进行海龟交易法回测
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
海龜交易法作為最早的量化交易法,已經被利用了很多年了,我發現網絡上有很多利用python進行海龜交易法回測的代碼教程,而且都是先通過akshare庫再通過均線組合的方式實現,但是其中大多會報錯,小編找了很多很多,但是最后還是差強人意,因此有了下面的這些。希望對您有所幫助。我注釋了一些需要注意的地方,其實這個均線策略是可以修改的,比如把10日和20日均線改成100日和200日,小編認為均線的具體選擇可以根據具體股票和期貨品種的不同,我覺得還是應該根據你想要交易的股票的具體股性和基本面進行具體選擇,比如茅臺這樣適合價值投資的股票就可以選擇時間較長的均線組合,而一些歷史上波動比較大的股票或期貨品種就可以選擇一些時效性更強的均線組合,比如10日和20日,5日和10日等等,在均線的選擇上還可以加入神奇數字,斐波那契數列。不喜勿噴,狗頭保命。
# 讀取A股數據 import akshare as ak import tushare import pandas as pd import datetime import numpy import os, sys import nodejs # 調用akshare庫的API接口獲取數據 df = stock_zh_index_daily_df = ak.stock_zh_index_daily(symbol="sh600113") print(stock_zh_index_daily_df) df = df.reset_index()# 修改名字 df.columns = [x.upper() for x in df.columns] df.rename(columns={"DATE": "index"}, inplace=True) df = df[df['OPEN'].notnull()]# 通過rolling滾動計算均線和BOLL通道 df['MA_5'] = df['CLOSE'].rolling(window=5).mean() df['MA_10'] = df['CLOSE'].rolling(window=10).mean() df['MA_20'] = df['CLOSE'].rolling(window=20).mean() df['MA_30'] = df['CLOSE'].rolling(window=30).mean() df['MA_60'] = df['CLOSE'].rolling(window=60).mean() df['MA_250'] = df['CLOSE'].rolling(window=250).mean() df['BOLL_STD'] = df['CLOSE'].rolling(window=250).std() df['BOLL_UPPER'] = df['MA_250'] + 2 * df['BOLL_STD'] df['BOLL_LOWER'] = df['MA_250'] - 2 * df['BOLL_STD'] with pd.ExcelWriter('D:\jiangtingrui1\股票交易信息'+'XY'+'.xlsx') as writer:df.to_excel(writer, index=False, sheet_name='Sheet1')#這時會創建并寫入第一個excel把這個excel拖進與后面的excel共同的文件夾里,再次運行就會出現結果 # 判斷買賣結點 # 采用短線均線上穿長線均線為買點 # 采用短線均線下穿長線均線為賣點 def is_dbljx(data, i, mode='buy', j1='MA_60', j2='MA_250'):#這一步是修改你想要組合的均線,比如海龜交易法里的10日和20日,通過把上面的MA_60和MA_250進行修改從而完成修改均線組合if i < 250:return Falseif mode == 'buy':if (data.loc[i, j1] > data.loc[i, j2]) & (data.loc[i - 1, j1] < data.loc[i - 1, j2]):return Trueelse:if (data.loc[i, j1] < data.loc[i, j2]) & (data.loc[i - 1, j1] > data.loc[i - 1, j2]):return Truereturn False# data總數據,l操作記錄列表(買、賣形成一條記錄) # 計算出每一次持有股票的盈利金額、盈利幅度、持有天數、期間最高收益、區間最低收益 def huizong_one(data, l):# 輸出結果dfout = pd.DataFrame(l, columns=['證券代碼', '買入索引', '賣出索引', '買入日期', '賣出日期', '買入價格', '賣出價格', '狀態'])dfout = dfout.reindex(columns=['證券代碼', '買入索引', '賣出索引', '買入日期', '賣出日期', '買入價格', '賣出價格', '狀態', '期間最高收益', '期間最低收益', '盈利金額', '盈利幅度','持有天數'])# ,'盈利金額','盈利幅度','持有天數'for i, row in dfout.iterrows():dfout.loc[i, '盈利金額'] = dfout.loc[i, '賣出價格'] - dfout.loc[i, '買入價格']dfout.loc[i, '盈利幅度'] = (dfout.loc[i, '賣出價格'] - dfout.loc[i, '買入價格']) / dfout.loc[i, '買入價格'] * 100dfout.loc[i, '持有天數'] = dfout.loc[i, '賣出日期'] - dfout.loc[i, '買入日期']m = data.loc[dfout.loc[i, '買入索引']:dfout.loc[i, '賣出索引'], 'CLOSE'].max()if m < dfout.loc[i, '賣出價格']:m = dfout.loc[i, '賣出價格']dfout.loc[i, '期間最高收益'] = (m - dfout.loc[i, '買入價格']) / dfout.loc[i, '買入價格'] * 100m = data.loc[dfout.loc[i, '買入索引']:dfout.loc[i, '賣出索引'], 'CLOSE'].min()if m > dfout.loc[i, '賣出價格']:m = dfout.loc[i, '賣出價格']dfout.loc[i, '期間最低收益'] = (m - dfout.loc[i, '買入價格']) / dfout.loc[i, '買入價格'] * 100return dfout # 遍歷回測所有采集的股票數據 folder_name = 'D:\\jiangtingrui1\\股票交易信息' file_list = os.listdir(folder_name) ldf = [] if len(file_list) > 0:# 遍歷文件夾下所有文件ldf = []for f in range(len(file_list)):data = pd.read_excel(folder_name + str(file_list[f]), dtype=object)data['bs'] = ''code = str(file_list[f])[:-5]l = []buy_index = 0for i in range(250, len(data)):# 判斷買賣信號if is_dbljx(data, i, 'buy'):# 記錄買點buy_index = idata.loc[i, 'bs'] = 'b'# 賣出信號elif (buy_index != 0) & is_dbljx(data, i, 'sell'):# 證券代碼 買入索引 賣出索引 買入日期 賣出日期 買入價格 賣出價格# 記錄下買賣點,清除買點l.append([code, buy_index, i, data.loc[buy_index, 'index'], data.loc[i, 'index'],data.loc[buy_index, 'CLOSE'], data.loc[i, 'CLOSE'], '終止'])buy_index = 0data.loc[i, 'bs'] = 's'# 結束以后保存結果with pd.ExcelWriter(folder_name + str(file_list[f])) as writer:data.to_excel(writer, index=False, sheet_name='Sheet1')# 匯總單次結果if buy_index != 0:# 記錄一個當前l.append([code, buy_index, i - 1, data.loc[buy_index, 'index'], data.loc[i - 1, 'index'],data.loc[buy_index, 'CLOSE'], data.loc[i - 1, 'CLOSE'], '持有'])ldf.append(huizong_one(data, l)) # 存儲每只股票的操作結果# 最后匯總輸出 dfout = pd.concat(ldf, ignore_index=True) with pd.ExcelWriter('D:\jiangtingrui1\股票交易信息\XYYY.xlsx') as writer:dfout.to_excel(writer, index=False, sheet_name='Sheet1', float_format="%.2f")總結
以上是生活随笔為你收集整理的运用python进行海龟交易法回测的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python应用程序无法正常启动0xc0
- 下一篇: python 解决第三方app微信登入昵