接著就是把 API 與 ATR 的程式片段給接起來啦!
import requests
import pandas as pd
client_id = '你的consumer key' #要註冊才會有
endpoint = r"https://api.tdameritrade.com/v1/marketdata/{}/pricehistory".format('SE')
payload ={'apikey':client_id,
'periodType':'month',
'frequencyType':'daily',
'frequency':'1',
'period':'2',
'needExtendedHoursData':'true'}
content = requests.get(url= endpoint, params = payload)
data = content.json() #把json轉成字典
df = pd.DataFrame(data['candles']) #把candles字典裝進DataFrame
df_se = df.tail(23).copy() #取最後23天的資料。
df_se.index = range(23) #把index改成0到22
PreviousClose = df_se.close.shift(1).copy()
df_se.loc[:,'PreviousClose'] = PreviousClose
TrueRange = df_se[['PreviousClose','high']].max(axis=1).copy()-df_se[['PreviousClose','low']].min(axis=1).copy()
df_se.loc[:,'TrueRange']= TrueRange
PreAvgTR = df_se['TrueRange'].rolling(window=21).mean().shift().copy()
df_se.loc[:,'PreAvgTR'] = PreAvgTR
ATR = (df_se['PreAvgTR'].copy()*(21-1) + df_se['TrueRange'].copy())/21
df_se.loc[:,'ATR'] = ATR
print(df_se[-1:]['ATR'])
真的會動耶!Amazing!
後來我發現從 API 取得的資料跟從台灣券商下載的資料會有些許的不一樣,所以計算出來的 ATR 會有細微的差異,但因為 ATR 只是作為 position sizing 與 stop loss 的參考,所以影響並不大。
另外 Python 是 case sensitive 所以裡面有些 column name 從 AP I取得的時候就是小寫,因此後面的程式碼也跟著改動。
嗯,應該堪用,下週就來實操看看!🤔之後要達成的是如何餵它一串 tickers,然後回傳一串 tickers 與 ATRs。
