运用python进行海龟交易法回测
生活随笔
收集整理的這篇文章主要介紹了
运用python进行海龟交易法回测
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
海龜交易法作為最早的量化交易法,已經(jīng)被利用了很多年了,我發(fā)現(xiàn)網(wǎng)絡(luò)上有很多利用python進(jìn)行海龜交易法回測(cè)的代碼教程,而且都是先通過(guò)akshare庫(kù)再通過(guò)均線組合的方式實(shí)現(xiàn),但是其中大多會(huì)報(bào)錯(cuò),小編找了很多很多,但是最后還是差強(qiáng)人意,因此有了下面的這些。希望對(duì)您有所幫助。我注釋了一些需要注意的地方,其實(shí)這個(gè)均線策略是可以修改的,比如把10日和20日均線改成100日和200日,小編認(rèn)為均線的具體選擇可以根據(jù)具體股票和期貨品種的不同,我覺(jué)得還是應(yīng)該根據(jù)你想要交易的股票的具體股性和基本面進(jìn)行具體選擇,比如茅臺(tái)這樣適合價(jià)值投資的股票就可以選擇時(shí)間較長(zhǎng)的均線組合,而一些歷史上波動(dòng)比較大的股票或期貨品種就可以選擇一些時(shí)效性更強(qiáng)的均線組合,比如10日和20日,5日和10日等等,在均線的選擇上還可以加入神奇數(shù)字,斐波那契數(shù)列。不喜勿噴,狗頭保命。
# 讀取A股數(shù)據(jù) import akshare as ak import tushare import pandas as pd import datetime import numpy import os, sys import nodejs # 調(diào)用akshare庫(kù)的API接口獲取數(shù)據(jù) 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()]# 通過(guò)rolling滾動(dòng)計(jì)算均線和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')#這時(shí)會(huì)創(chuàng)建并寫(xiě)入第一個(gè)excel把這個(gè)excel拖進(jìn)與后面的excel共同的文件夾里,再次運(yùn)行就會(huì)出現(xiàn)結(jié)果 # 判斷買(mǎi)賣結(jié)點(diǎn) # 采用短線均線上穿長(zhǎng)線均線為買(mǎi)點(diǎn) # 采用短線均線下穿長(zhǎng)線均線為賣點(diǎn) def is_dbljx(data, i, mode='buy', j1='MA_60', j2='MA_250'):#這一步是修改你想要組合的均線,比如海龜交易法里的10日和20日,通過(guò)把上面的MA_60和MA_250進(jìn)行修改從而完成修改均線組合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總數(shù)據(jù),l操作記錄列表(買(mǎi)、賣形成一條記錄) # 計(jì)算出每一次持有股票的盈利金額、盈利幅度、持有天數(shù)、期間最高收益、區(qū)間最低收益 def huizong_one(data, l):# 輸出結(jié)果dfout = pd.DataFrame(l, columns=['證券代碼', '買(mǎi)入索引', '賣出索引', '買(mǎi)入日期', '賣出日期', '買(mǎi)入價(jià)格', '賣出價(jià)格', '狀態(tài)'])dfout = dfout.reindex(columns=['證券代碼', '買(mǎi)入索引', '賣出索引', '買(mǎi)入日期', '賣出日期', '買(mǎi)入價(jià)格', '賣出價(jià)格', '狀態(tài)', '期間最高收益', '期間最低收益', '盈利金額', '盈利幅度','持有天數(shù)'])# ,'盈利金額','盈利幅度','持有天數(shù)'for i, row in dfout.iterrows():dfout.loc[i, '盈利金額'] = dfout.loc[i, '賣出價(jià)格'] - dfout.loc[i, '買(mǎi)入價(jià)格']dfout.loc[i, '盈利幅度'] = (dfout.loc[i, '賣出價(jià)格'] - dfout.loc[i, '買(mǎi)入價(jià)格']) / dfout.loc[i, '買(mǎi)入價(jià)格'] * 100dfout.loc[i, '持有天數(shù)'] = dfout.loc[i, '賣出日期'] - dfout.loc[i, '買(mǎi)入日期']m = data.loc[dfout.loc[i, '買(mǎi)入索引']:dfout.loc[i, '賣出索引'], 'CLOSE'].max()if m < dfout.loc[i, '賣出價(jià)格']:m = dfout.loc[i, '賣出價(jià)格']dfout.loc[i, '期間最高收益'] = (m - dfout.loc[i, '買(mǎi)入價(jià)格']) / dfout.loc[i, '買(mǎi)入價(jià)格'] * 100m = data.loc[dfout.loc[i, '買(mǎi)入索引']:dfout.loc[i, '賣出索引'], 'CLOSE'].min()if m > dfout.loc[i, '賣出價(jià)格']:m = dfout.loc[i, '賣出價(jià)格']dfout.loc[i, '期間最低收益'] = (m - dfout.loc[i, '買(mǎi)入價(jià)格']) / dfout.loc[i, '買(mǎi)入價(jià)格'] * 100return dfout # 遍歷回測(cè)所有采集的股票數(shù)據(jù) 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)):# 判斷買(mǎi)賣信號(hào)if is_dbljx(data, i, 'buy'):# 記錄買(mǎi)點(diǎn)buy_index = idata.loc[i, 'bs'] = 'b'# 賣出信號(hào)elif (buy_index != 0) & is_dbljx(data, i, 'sell'):# 證券代碼 買(mǎi)入索引 賣出索引 買(mǎi)入日期 賣出日期 買(mǎi)入價(jià)格 賣出價(jià)格# 記錄下買(mǎi)賣點(diǎn),清除買(mǎi)點(diǎn)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'# 結(jié)束以后保存結(jié)果with pd.ExcelWriter(folder_name + str(file_list[f])) as writer:data.to_excel(writer, index=False, sheet_name='Sheet1')# 匯總單次結(jié)果if buy_index != 0:# 記錄一個(gè)當(dāng)前l(fā).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)) # 存儲(chǔ)每只股票的操作結(jié)果# 最后匯總輸出 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")總結(jié)
以上是生活随笔為你收集整理的运用python进行海龟交易法回测的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: python应用程序无法正常启动0xc0
- 下一篇: 计算机突然关闭应用程序,应用程序无法正常