日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

python 海龟交易法则_【手把手教你】用Python量化海龟交易法则

發布時間:2023/12/8 python 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 python 海龟交易法则_【手把手教你】用Python量化海龟交易法则 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

止損:什么時候放棄一個虧損的頭寸?

離市:什么時候退出一個盈利的頭寸?

策略:如何買賣?

趨勢追蹤——唐奇安通道

海龜交易法則利用唐奇安通道的突破點作為買賣信號指導交易,簡單而言唐奇安通道是由一條上軌線、中線和下線組成,上軌線由N1日內最高價構成,下軌線由N2日內最低價計算,當價格沖破上軌是可能的買入信號,反之,沖破下軌時是可能的賣出信號。

買賣單位及首次建倉

海龜交易系統本質上是一個趨勢跟隨的系統,但是最值得學習的是資金管理尤其是分批建倉及動態止損的部分。書中提到了N值倉位管理法,其中N值與技術指標平均真實波幅 ATR計算類似。ATR是真實波幅TR的20日平均值,而TR是當前交易日最高價和最低價之差 、前一交易日收盤價與當前交易日最高價之差、前一交易日收盤價與當前交易日最低價之差三者中的最大值,用公式表示為:

TR=Max(High?Low,abs(High?PreClose),abs(PreClose?Low)),技術指標庫TA-Lib提供了直接計算ATR的函數。

建倉單位:

Unit=(1%?賬戶總資金)/N

首次建倉的時候,當捕捉到趨勢,即價格突破唐奇安上軌時,買入1個unit。其意義就是,讓一個N值的波動與你總資金1%的波動對應,如果買入1unit單位的資產,當天震幅使得總資產的變化不超過1%。

例如:

現在你有1萬元資金,1%波動就是100元。假如某股票的N(ATR)值為0.1元,100÷0.1元=1000股。也就是說,你的第一筆倉位應該是在其突破上軌(假設為3元)時立刻買入1000股,耗資3000元。

動態止損或清倉條件

當股價跌破10日唐奇安通道下沿,清空頭寸結束本次交易。當價格比最后一次買入價格下跌2N時,則賣出全部頭寸止損。

接上面的例子,最后一次加倉價格為3.2。假如此時N值0.2元。當價格下跌到 3.2 - 2*0.2 = 2.8元時,清倉。持倉成本為 (3+3.1+3.2)*1000/3000 = 3.1元。此時虧損 (3.1-2.8)*3000 = 900元, 對于1萬來說 這波虧損9%。

原始的海龜交易采用唐奇安通道來追蹤趨勢,在趨勢比較明顯的行情表現不錯,但是在震蕩的行情中效果不佳,當然這是所有趨勢型策略的通病。下面著重使用Python對唐奇安通道進行可視化,并利用簡化版的海龜交易法則進行簡單的歷史回測。

2

3海龜交易規則Python實現

#先引入后面可能用到的包(package)

import pandas as pd

import numpy as np

import talib as ta

from datetime import datetime,timedelta

import matplotlib.pyplot as plt

%matplotlib inline

#正常顯示畫圖時出現的中文和負號

from pylab import mpl

mpl.rcParams['font.sans-serif']=['SimHei']

mpl.rcParams['axes.unicode_minus']=False

#使用tushare獲取交易數據

#設置token

import tushare as ts

#注意token更換為你在tushare網站上獲取的

token='輸入你的token'

pro=ts.pro_api(token)

index={'上證綜指': '000001.SH',

'深證成指': '399001.SZ',

'滬深300': '000300.SH',

'創業板指': '399006.SZ',

'上證50': '000016.SH',

'中證500': '000905.SH',

'中小板指': '399005.SZ',

'上證180': '000010.SH'}

#獲取當前交易的股票代碼和名稱

def get_code():

df = pro.stock_basic(exchange='', list_status='L')

codes=df.ts_code.values

names=df.name.values

stock=dict(zip(names,codes))

#合并指數和個股成一個字典

stocks=dict(stock,**index)

return stocks

#獲取行情數據

def get_daily_data(stock,start,end):

#如果代碼在字典index里,則取的是指數數據

code=get_code()[stock]

if code in index.values():

df=pro.index_daily(ts_code=code,start_date=start, end_date=end)

#否則取的是個股數據

else:

df=pro.daily(ts_code=code, adj='qfq',start_date=start, end_date=end)

#將交易日期設置為索引值

df.index=pd.to_datetime(df.trade_date)

df=df.sort_index()

#計算收益率

df['ret']=df.close/df.close.shift(1)-1

return df

下面以滬深300指數為例,對唐奇安通道和買賣突破信號進行可視化。

hs=get_daily_data('滬深300','20180101','')[['close','open','high','low','vol']]

#最近N1個交易日最高價

hs['up']=ta.MAX(hs.high,timeperiod=20).shift(1)

#最近N2個交易日最低價

hs['down']=ta.MIN(hs.low,timeperiod=10).shift(1)

#每日真實波動幅度

hs['ATR']=ta.ATR(hs.high,hs.low,hs.close,timeperiod=20)

hs.tail()

下面使用簡化版的海龜交易法則進行歷史回測,即不考慮倉位管理和動態止損/止盈條件,以唐奇安通道突破作為買入賣出信號。

交易規則為:

(1)當今天的收盤價,大于過去20個交易日中的最高價時,以收盤價買入;

(2)買入后,當收盤價小于過去10個交易日中的最低價時,以收盤價賣出。

def my_strategy(data):

x1=data.close>data.up

x2=data.close.shift(1)

x=x1&x2

y1=data.close

y2=data.close.shift(1)>data.down.shift(1)

y=y1&y2

data.loc[x,'signal']='buy'

data.loc[y,'signal']='sell'

buy_date=(data[data.signal=='buy'].index).strftime('%Y%m%d')

sell_date=(data[data.signal=='sell'].index).strftime('%Y%m%d')

buy_close=data[data.signal=='buy'].close.round(2).tolist()

sell_close=data[data.signal=='sell'].close.round(2).tolist()

return (buy_date,buy_close,sell_date,sell_close)

#對K線圖和唐奇安通道進行可視化

from pyecharts import *

grid = Grid()

attr=[str(t) for t in hs.index.strftime('%Y%m%d')]

v1=np.array(hs.loc[:,['open','close','low','high']])

v2=np.array(hs.up)

v3=np.array(hs.down)

kline = Kline("滬深300唐奇安通道",title_text_size=15)

kline.add("K線圖", attr, v1.round(1),is_datazoom_show=True,)

# 成交量

bar = Bar()

bar.add("成交量", attr, hs['vol'],tooltip_tragger="axis", is_legend_show=False,

is_yaxis_show=False, yaxis_max=5*max(hs["vol"]))

line = Line()

line.add("上軌線", attr, v2.round(1),is_datazoom_show=True,

is_smooth=True,is_symbol_show=False,line_width=1.5)

line.add("下軌線", attr, v3.round(1),is_datazoom_show=True,

is_smooth=True,is_symbol_show=False,line_width=1.5)

#添加買賣信號

bd,bc,sd,sc=my_strategy(hs)

es = EffectScatter("buy")

es.add( "sell", sd, sc, )

es.add("buy", bd, bc,symbol="triangle",)

overlap = Overlap(width=2000, height=600)

overlap.add(kline)

overlap.add(line)

overlap.add(bar,yaxis_index=1, is_add_yaxis=True)

overlap.add(es)

grid.add(overlap, grid_right="10%")

grid

(注:運行上述代碼得到的是動態交互圖,可調整時間區間)

#關掉pandas的warnings

pd.options.mode.chained_assignment = None

def strategy(stock,start,end,N1=20,N2=10):

df=get_daily_data(stock,start,end)

#最近N1個交易日最高價

df['H_N1']=ta.MAX(df.high,timeperiod=N1)

#最近N2個交易日最低價

df['L_N2']=ta.MIN(df.low,timeperiod=N2)

#當日收盤價>昨天最近N1個交易日最高點時發出信號設置為1

buy_index=df[df.close>df['H_N1'].shift(1)].index

df.loc[buy_index,'收盤信號']=1

#將當日收盤價

sell_index=df[df.close

df.loc[sell_index,'收盤信號']=0

df['當天倉位']=df['收盤信號'].shift(1)

df['當天倉位'].fillna(method='ffill',inplace=True)

d=df[df['當天倉位']==1].index[0]-timedelta(days=1)

df1=df.loc[d:].copy()

df1['ret'][0]=0

df1['當天倉位'][0]=0

#當倉位為1時,買入持倉,當倉位為0時,空倉,計算資金凈值

df1['策略凈值']=(df1.ret.values*df1['當天倉位'].values+1.0).cumprod()

df1['指數凈值']=(df1.ret.values+1.0).cumprod()

df1['策略收益率']=df1['策略凈值']/df1['策略凈值'].shift(1)-1

df1['指數收益率']=df1.ret

total_ret=df1[['策略凈值','指數凈值']].iloc[-1]-1

annual_ret=pow(1+total_ret,250/len(df1))-1

dd=(df1[['策略凈值','指數凈值']].cummax()-df1[['策略凈值','指數凈值']])/df1[['策略凈值','指數凈值']].cummax()

d=dd.max()

beta=df1[['策略收益率','指數收益率']].cov().iat[0,1]/df1['指數收益率'].var()

alpha=(annual_ret['策略凈值']-annual_ret['指數凈值']*beta)

exReturn=df1['策略收益率']-0.03/250

sharper_atio=np.sqrt(len(exReturn))*exReturn.mean()/exReturn.std()

TA1=round(total_ret['策略凈值']*100,2)

TA2=round(total_ret['指數凈值']*100,2)

AR1=round(annual_ret['策略凈值']*100,2)

AR2=round(annual_ret['指數凈值']*100,2)

MD1=round(d['策略凈值']*100,2)

MD2=round(d['指數凈值']*100,2)

S=round(sharper_atio,2)

df1[['策略凈值','指數凈值']].plot(figsize=(15,7))

plt.title('海龜交易策略簡單回測',size=15)

bbox = dict(boxstyle="round", fc="w", ec="0.5", alpha=0.9)

plt.text(df1.index[int(len(df1)/5)], df1['指數凈值'].max()/1.5, f'累計收益率:\

策略{TA1}%,指數{TA2}%;\n年化收益率:策略{AR1}%,指數{AR2}%;\n最大回撤: 策略{MD1}%,指數{MD2}%;\n\

策略alpha: {round(alpha,2)},策略beta:{round(beta,2)}; \n夏普比率: {S}',size=13,bbox=bbox)

plt.xlabel('')

ax=plt.gca()

ax.spines['right'].set_color('none')

ax.spines['top'].set_color('none')

plt.show()

#return df1.loc[:,['close','ret','H_N1','L_N2','當天倉位','策略凈值','指數凈值']]

下面對上證綜指、滬深300、創業板指數、中國平安、東方通信和貴州茅臺進行簡單回測,看看海龜交易規則唐奇安的擇時效果如何,具體指標看圖。

strategy('上證綜指','20050101','')

strategy('滬深300','','')

strategy('創業板指','','')

strategy('滬深300','20180101','')

strategy('中國平安','20050101','',N1=20,N2=10)

strategy('東方通信','20130101','',N1=20,N2=10)

strategy('貴州茅臺','20050101','',N1=20,N2=10)

上述回測沒有考慮使用N值的倉位管理和動態止損,下面是在萬礦平臺上加入了倉位管理進行回測,與上面簡單使用Pandas的回測框架相比(圖形比較丑陋),貴州茅臺的各項回測指標看上去更理想了,最大回撤也只有21%。具體實現代碼可參考萬礦平臺社區上面的分享。此外,聚寬、優礦等量化平臺上也提供了相應了策略回測模板,實現代碼大同小異,感興趣的可以進一步了解。

4結語

本文簡要介紹了海龜交易法則的基本原理,使用Python對其買賣信號進行了可視化分析,并利用Pandas對相關指數和個股運用簡化版的海龜交易規則進行了歷史回測。由回測結果可看出,該簡化的趨勢追蹤策略對于某些標的在某些區間效果表現不錯,但對于某些標的或某些時期則效果不佳。當然,本文旨在回顧經典策略,展示Pandas在金融量化分析的綜合運用,為Python在金融量化中的運用起到拋磚引玉的效果,不作出任何選股或策略推薦。值得注意的是,任何策略都具有一定的局限性,尤其是知道和使用該策略的交易者多了,其作用自然比該理念剛出現的的效果差得多。正如技術分析指標,剛出現的時候很有效,但被大家所熟知或應用后,自然效用就大打折扣(相對于多因子模型中的Alpha被大家挖掘后漸漸成了risk factor)。但所謂新理念、新策略一定是站在前人的肩膀上,因此不能因為經典策略回測效果不佳而全盤否定,如何改進、細化和升級,使之更適合當下的市場才是我們要面對的問題。

關于Python金融量化

專注于分享Python在金融量化領域的應用。加入知識星球,可以免費獲取30多g的量化投資視頻資料、量化金融相關PDF資料、公眾號文章Python完整源碼、量化投資前沿分析框架,與博主直接交流、結識圈內朋友等。

總結

以上是生活随笔為你收集整理的python 海龟交易法则_【手把手教你】用Python量化海龟交易法则的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。