將程式流程製作成Automator,就不用在終端機下指令,對一班使用這來說會比較簡單。
1.於程式庫中選 工具程式 -> 執行AppleScript
set theDialogText to "選擇 list 檔案"
display dialog theDialogText
--> Result: {button returned:"OK"}
return input
end run
2.於程式庫中選 檔案和檔案夾 -> 要求Finder項目
類型選擇"檔案"
將程式流程製作成Automator,就不用在終端機下指令,對一班使用這來說會比較簡單。
1.於程式庫中選 工具程式 -> 執行AppleScript
有一個檔案清單紀錄要找尋在 dir 目錄下的檔案,並將找到的檔案拷貝到桌面 tmp目錄下,
找尋的目錄dir,目錄下有多層目錄共38006個檔案(沒有順序)。
【方法1】:
讀取檔案清單,依清單第一筆資料遞迴搜尋目錄檔名是否符合,然後清單第二筆再遞迴搜尋目錄檔名是否符合 . . . 直到清單最後一筆。
程式碼:https://ideone.com/NSdqT4
圖示範例:
【方法2 】:
讀取檔案清單存放在Dictionary,遞迴目錄的每一檔案名稱是否是 dict 的 key 值。
程式碼:https://ideone.com/eN5xXP
由此看來遍歷目錄的檔案然後判斷是否在Dict 中的 key值(Hash Map)是比每一筆資料都要去遍歷目錄樹一次效率要好得多,當清單的數量多的時候差異會更大。
#【程式碼 】:
import os, re, shutil, sys, time
if len(sys.argv) == 1 or len(sys.argv) == 2:
lst_file = 'list2.txt' #欲搜尋檔案清單
search_dir = "./dir" #搜尋目錄
else:
lst_file = sys.argv[1]
search_dir = sys.argv[2]
start = time.time()
tag_dir = os.path.expandvars('$HOME') + "/Desktop/tmp/" #目標目錄
dict = {} #建立Hach map
with open(lst_file) as f:
for line in f.readlines():
line = line[:-1]
dict[line] = 0
num_files = 0 #計算檔案數量變數
if not os.path.isdir(tag_dir): #測試目標目錄存在否
os.mkdir(tag_dir)
#遞迴目錄樹
for dirPath, dirNames, fileNames in os.walk(search_dir):
for f in fileNames:
num_files += 1
basename = os.path.splitext(f)[0]
if basename in dict: #如果檔名與hash key相同
print "finded >>", os.path.join(dirPath, f)
old = os.path.join(dirPath, f)
new = tag_dir + f
shutil.copy(old, new) #複製檔案到目標目錄
print "Total search files:", num_files
end = time.time()
print "Elapsed time:", end - start
OSX 本身已經安裝了Postfix Mail Server,只要稍加設定就可以使用,下面就介紹設定的步驟:
1. 備份原有的 Postfix configuration
$ sudo cp /etc/postfix/main.cf /etc/postfix/main.cf.bak
2. 設定 Postfix mail server
$ sudo sh -c "cat >> /etc/postfix/main.cf" <<EOF
relayhost = smtp.gmail.com:587
smtp_sasl_mechanism_filter = plain
smtp_sasl_auth_enable = yes
smtp_sasl_password_maps = hash:/etc/postfix/sasl_passwd
smtp_sasl_security_options = noanonymous
smtp_use_tls = yes
smtp_tls_security_level = encrypt
tls_random_source = dev:/dev/urandom
EOF
3. 設定 gmail SASL 認證
$ EMAIL="youremail@gmail.com"
$ PASSWORD="password123"
$ sudo sh -c "cat >> /etc/postfix/sasl_passwd" <<EOF
smtp.gmail.com:587 $EMAIL:$PASSWORD
EOF
4. 產生 hash database
sudo postmap /etc/postfix/sasl_passwd
5. 更改 Postfix hash database and password files 權限
sudo chown root: /etc/postfix/sasl_passwd /etc/postfix/sasl_passwd.db
sudo chmod 600 /etc/postfix/sasl_passwd /etc/postfix/sasl_passwd.db
6. Restart the Postfix mail server
sudo launchctl stop org.postfix.master
sudo launchctl start org.postfix.master
7. 更改 gmail "低安全性應用程式存取權"
測試一下:
echo "Hello World" | mail -s "Test email" name@mail
此時 gmail 信箱應該就有一封上面發出的信了。
如果要夾帶附件
語法:uuencode [實際檔案] [信件中的檔名] | mail -s '標題' email
uuencode filename infilename | mail -s "Hello" name@mail
方法1:使用 shell script 管線導向來實現
程式碼:https://ideone.com/e.js/E0W01z
所需時間:1.085s
方法2:遞迴目錄下的每一檔案並製成HASH索引,讀取檔案清單,依清單比對HASH
程式碼:https://ideone.com/HDhrp6
所需時間:1.298s
由上可知效率上來說:方法1 > 方法4 > 方法2 > 方法3
利用 bash command 和管線(pipe line) 可以快速達到這個結果,如果只是想查看搜尋結果可以這樣: 根據道富環球投資管理公司(State Street Global Advisors)的最新數據,2020年流入美國ETF的資金突破5,000億美元大關,較2017年創下的新高紀錄高出400億美元。
既然ETF受到廣大投資人喜愛,連股神巴菲特都喜歡投資ETF,
程式碼如下:
library(quantmod)
library(PerformanceAnalytics)
d_from <- "2020-03-01"
symb <- c("SPY","SOXX","IWM","IYT","TAN")
getSymbols(symb, src="yahoo", from=d_from)
SPY2 <- dailyReturn(Ad(SPY))
SOX2 <- dailyReturn(Ad(SOXX))
IWM2 <- dailyReturn(Ad(IWM))
IYT2 <- dailyReturn(Ad(IYT))
TAN2 <- dailyReturn(Ad(TAN))
m1 <- merge(SPY2, SOX2, IWM2, IYT2, TAN2, all = F)
colnames(m1) <- c("標普500","費城半導體","羅素2000","運輸類","太陽能")
col <- c("red", "blue", "coral", "darkgreen", "brown")
chart.RiskReturnScatter(m1, Rf=0.03/12,
colorset = col,
main = "Trailing 9-Month Performance")
其中 Rf=.03/12 是 無風險利率/期待的報酬率,是以美國降息前的標準來評估,評估期間從2020/03/01 ~ 2021/01/ 06
輸出如下:
再來計算一下以 216交易日的回報率:
table.AnnualizedReturns(m1, scale = 216, Rf = 0.01/216)
我們可以看到風險最高的太陽能產業,報酬率也最高,在這段期間有211%的報酬率。
標普500 約23%報酬率,費城半導體表現也不錯有75%。
太陽能產業會有這樣的表現我想跟美國總統當選人拜登(Joe Biden)把應對氣候變化視為施政重點,上任後將積極推行各項ESG政策,進一步帶動ESG 類ETF的投資需求。
我們常常會覺得到底某幾間公司的股價漲跌之間有沒有關聯,如果有個工具可以來做關聯性的分析或是資料呈現會方便許多,正所謂雞蛋不要放在同一籃子裡。
利用PerformanceAnalytics套件裡面的chart.Correlation可以來做不同公司股價的關聯性分析。
下面我舉AAPL(蘋果公司),MSFT(微軟),AMZN(亞馬遜),GOOG(Google),FB(Facebook),TSM(美台積電)這6家公司來當例子,時間的範圍是從2018/1/1~2020/12/31,將每日的收盤價整合至dataframe,使用chart.Correlation來繪制圖表。
程式碼如下:
library(quantmod)
d_from <- "2018-01-01"
getSymbols(c("AAPL","MSFT","AMZN","GOOG","FB","TSM"), from=d_from)
Data <- cbind(Cl(AAPL),Cl(MSFT),Cl(AMZN),Cl(GOOG),Cl(FB),Cl(TSM))
chart.Correlation(Data,histogram = TRUE)
輸出的結果:
圖例說明:
對角線是變量本身的分布
對角線的左下方,給出了兩個屬性的散點圖,可以看到左下角(AAPL與TSM)具有很高的線性相關性。
對角線的右上方,數字表示連個屬性的相關性值,星號表示顯著程度(星星越多表明越顯著),可以看到AAPL與MSFT與AMZN與TSM都具有很大的程度的關聯。