上一篇進行到了透過 API 取得一支股票的歷史股價,然後計算 ATR。雖然堪用,但是如果手上有多支股票,那重複操作實在是有點麻煩。下面試試看有沒有辦法餵程式一組 ticker list,然後一次回傳結果。
想法是讓程式重複查詢、計算,然後再把結果存到一個新的 DataFrame。我實現的方法是 for loop 與用一個空 DataFrame 放資料。
import requests
import pandas as pd
client_id = '你的Consumer Key' #要註冊才會有
tickers = ['SE','AAPL','NTDOY','SHOP'] #看上股票的tickers
metrics = ['ATR'] #我們現在計算的指標
df_result = pd.DataFrame(index=tickers, columns=metrics) #來一個空的DataFrame,row放ticker column放指標
i=0 #放在外面,放在裡面i+=1就沒用了
for t in tickers: #用for loop來重複執行計算,按照tickers list的順序
endpoint = r"https://api.tdameritrade.com/v1/marketdata/{}/pricehistory".format(tickers[i])
payload ={'apikey':client_id,
'periodType':'month',
'period':'2',
'frequencyType':'daily',
'frequency':'1',
'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() #2
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
result = df_se[-1:]['ATR'].copy()
df_result.loc[tickers[i],metrics] = float(result) #把計算的結果放進一開始的空DataFrame,因為result似乎是個DataFrame,所以就用了float把它轉成value
print(df_se[-1:]['ATR']) #基本上可以省略,因為現在用df_result輸出結果
i+=1
print(df_result)
下面是 df_result
ATR
SE 1.03212
AAPL 4.31844
NTDOY 0.816372
SHOP 15.6881
哦哦哦!看起來成功了!之後只要餵它一組 tickers 就可以跑出來結果,真是方便,再加個 equity value, risk allocation, stop loss 的計算就可以跑 position sizing了,或者只要簡單在 excel 把欄位設好 (這些設好公式一拉就行),然後把 ATR 貼上去就算好了。那麼下一步先來看怎麼 DataFrame 存成 csv 或 excel 檔吧!
df_result.to_excel("ATR.xlsx") #先安裝XLRD套件後,一步到位
一步一步疊床架屋,慢慢增加功能,實現 scalability。從中好像可以體會 software is eating the world 的一些意涵?😏
好啦,就算做了這個小程式,實操要賺錢呀,不然有啥用?🤣這個 ATR 的計算是執行面,在想法的探索方面,應該可以用 API 取得歷史資料後,作一些測試吧? 只是我現在還不知道要測什麼。🤔
先想好要做什麼,怎麼做好像沒那麼難,Google 一下大多數的問題早就被解決了,只要用描述問題的方式正確,應該都可以找到相關討論串,真是讓人信心大增。😏
下週實操一下。😎
