1. 程式人生 > >『Python學習』海龜法則學習

『Python學習』海龜法則學習

2、

import pandas as pd

# 匯入上證指數的原始資料
index_data = pd.read_csv(r"C:\Users\LCG22\Desktop\work\learn\Python\PythonLearn\DataSet\all_trading_data\index data\sh000001.csv", parse_dates=['date'])

# 保留這幾個需要的欄位
index_data = index_data[["date", "high", "low", "close", "change"]]

# 對資料按照 [date] 交易日期從小到大排序
index_data.sort("date", inplace=True)

N1 = 20
N2 = 10

# 通過 rolling_max 方法計算最近 N1 個交易日的最高價
index_data['最近N1個交易日的最高點'] = pd.rolling_max(index_data['high'], N1)
#對於上市不足 N1 天的資料, 取上市至今的最高價
index_data['最近N1個交易日的最高點'].fillna(value=pd.expanding_max(index_data['high']), inplace=True)

# 通過相似的計算方法計算最近 N2 個交易日的最低價
index_data['最近N2個交易日的最低點'] = pd.rolling_min(index_data['low'], N1)
index_data['最近N2個交易日的最低點'].fillna(value=pd.expanding_min(index_data['low']), inplace=True)

# 噹噹天的 [close] > 昨天的 [最近N1個交易日的最高點] 時, 將 [收盤發出的訊號] 設定為 1
buy_index = index_data[index_data['close'] > index_data['最近N1個交易日的最高點'].shift(1)].index
index_data.loc[buy_index, '收盤發出的訊號'] = 1
# 噹噹天的 [close] < 昨天的 [最近N2個交易日的最低點] 時, 將 [收盤發出的訊號] 設定為0
sell_index = index_data[index_data['close'] < index_data['最近N2個交易日的最低點'].shift(1)].index
index_data.loc[sell_index, '收盤發出的訊號'] = 0

# 計算每天的倉位, 當天持有上證指數時, 倉位為 1 , 當天不持有上證指數時, 倉位為 0
print '!!'*10
index_data['當天的倉位'] = index_data['收盤發出的訊號'].shift(1)
print '@@'*10
index_data['當天的倉位'].fillna(method='ffill', inplace=True)

# 取 1992 年之後的資料, 排出較早的資料
index_data = index_data[index_data['date'] >= pd.to_datetime('19930101')]

# 當倉位為 1 時, 買入上證指數, 當倉位為 0 時, 空倉。 計算從 19920101 至今的資金指數
index_data['資金指數'] = (index_data['change'] * index_data['當天的倉位'] + 1.0).cumprod()
initial_idx = index_data.iloc[0]['close'] / (1 + index_data.iloc[0]['change'])
index_data['資金指數'] *= initial_idx

# 輸出資料到指定檔案
index_data[['date', 'high', 'low', 'close', 'change', '最近N1個交易日的最高點', '最近N2個交易日的最低點', '當天的倉位', '資金指數']].to_csv(r'C:\Users\LCG22\Desktop\work\learn\Python\PythonLearn\DataSet\testResult\turtle.csv', index=False, encoding='gbk')

index_data['海龜法則每日漲跌幅'] = index_data['change'] * index_data['當天的倉位']
year_rtn = index_data.set_index('date')[['change', '海龜法則每日漲跌幅']].\
    resample('A', how=lambda x: (x+1.0).prod() - 1.0) * 100
print year_rtn
print '執行結束'