इस R ट्यूटोरियल में, आप वेब स्क्रैपिंग करेंगे, एक फाइनेंस API को हिट करेंगे और एक htmlwidget का उपयोग करके इंटरएक्टिव टाइम सीरीज़ चार्ट बनाएंगे ताकि एक सरल एल्गोरिदमिक ट्रेडिंग रणनीति लागू की जा सके
इस पोस्ट में, मैं दिखाऊंगा कि R का उपयोग करके loyal3 पर सूचीबद्ध स्टॉक्स कैसे इकट्ठे करें, Yahoo से ऐतिहासिक डेटा लें और फिर एक सरल एल्गोरिदमिक ट्रेडिंग रणनीति लागू करें। इस दौरान, आप वेब स्क्रैपिंग, एक फाइनेंस API को हिट करने वाली फ़ंक्शन और एक htmlwidget का उपयोग करके इंटरएक्टिव टाइम सीरीज़ चार्ट बनाना सीखेंगे।
इस पोस्ट के लिए, ट्रेडिंग एल्गो को ऐसे नियमों के सेट के रूप में परिभाषित किया गया है जो प्रेडिक्टिव मॉडल या टाइम सीरीज़ फोरकास्ट के बजाय खरीद या बिक्री की घटना को ट्रिगर करते हैं। यह ट्रेडिंग एल्गो का सबसे सरल प्रकार है, लेकिन यदि आप R के साथ वित्त में गहराई से जाना चाहते हैं, तो मैं आपको DataCamp का R में क्वांटिटेटिव ट्रेडिंग स्ट्रेटेजी मॉडलिंग कोर्स करने के लिए प्रोत्साहित करूंगा।
पृष्ठभूमि
2015 में, मैंने loyal3 पर थोड़ा-बहुत निवेश करना शुरू किया। उनकी सेवा असामान्य है और अपनी निवेश यात्रा शुरू करने के लिए एक बेहतरीन जगह है। निवेशकों से ट्रेड के लिए शुल्क लेने के बजाय, loyal3 अपनी प्लेटफ़ॉर्म पर लिस्टिंग के लिए कंपनियों से शुल्क लेता है। premise यह है कि जिन लोगों को किसी कंपनी की सेवा पसंद है वे स्टॉक भी खरीदेंगे और ऐसा करके सशक्त ब्रांड एडवोकेट बनेंगे। इस प्लेटफ़ॉर्म का एक और आकर्षक पहलू यह है कि आप आंशिक शेयर खरीद सकते हैं। तो, आप $800 के Amazon स्टॉक में केवल $10 से प्रवेश कर सकते हैं और हर बार महीने के अंत में थोड़े अतिरिक्त पैसों से $10 का एक और अंश खरीद सकते हैं। हां, कुछ friction लागतें हैं क्योंकि आपको विंडोज़ में ट्रेड करना पड़ता है और आपका पूरा पोर्टफोलियो लगभग 70 स्टॉक्स तक सीमित है, लेकिन loyal3 इक्विटी ट्रेडिंग को एक्सप्लोर करने का एक मजेदार और कम लागत वाला तरीका प्रदान करता है। आप मात्र $10 से असली दांव लगा सकते हैं!
स्पष्ट करने के लिए, मेरे पास सामान्य रिटायरमेंट और इन्वेस्टमेंट अकाउंट्स हैं लेकिन मुझे loyal3 का ऐप पर स्वच्छ इंटरफ़ेस और फीस का अभाव पसंद है। यह आसान और मनभावन होने के कारण मैं अपने मज़ेदार loyal3 पोर्टफोलियो को अपने म्यूचुअल फंड्स की तुलना में ज़्यादा बार देखता हूं, क्योंकि इसमें सीधे चुने गए स्टॉक्स का प्रदर्शन देखना सुखद लगता है।
www.loyal3.com पर उपलब्ध स्टॉक्स
अपना वर्कस्पेस सेट करना
शुरू करने के लिए, लाइब्रेरीज़ को अपने एनवायरनमेंट में लोड करें। मैं इन दिनों वेब स्क्रैपिंग के लिए लगभग हमेशा rvest का उपयोग करता/करती हूं। अन्य पैकेज भी काम करते हैं जैसे RSelenium, लेकिन मुझे पसंद है कि rvest कितनी आसानी से चल जाता है।
दूसरा पैकेज, pbapply, वैकल्पिक है क्योंकि यह केवल apply फ़ंक्शंस में प्रोग्रेस बार जोड़ता है। चूँकि आप सैकड़ों वेब पेज स्क्रैप कर सकते हैं, समय का अनुमान लगाने के लिए प्रोग्रेस बार सहायक हो सकता है।
अगला, TTR एक पैकेज है जिसे मैंने अभी-अभी एक्सप्लोर करना शुरू किया है। यह लाइब्रेरी “Technical Trading Rules” बनाने के लिए उपयोग होती है। यद्यपि आप इस पोस्ट में एक सरल ट्रेडिंग एल्गो सीखेंगे, TTR पैकेज और भी विकसित गणनाएँ कर सकता है और सीखने लायक है।
dygraphs लाइब्रेरी एक तेज, ओपन सोर्स JavaScript चार्टिंग लाइब्रेरी के लिए रैपर है। यह उन htmlwidgets में से एक है जो R चार्टिंग को स्थिर इमेज के बजाय html फ़ाइल का डायनेमिक हिस्सा बनाता है। अंत में, lubridate पैकेज दिनांक (date) में आसान हेरफेर के लिए उपयोग होता है।
library(rvest)
library(pbapply)
library(TTR)
library(dygraphs)
library(lubridate)संचालित द्वारा
डेटा संग्रह
सभी loyal3 स्टॉक्स एक ही पेज पर सूचीबद्ध हैं। अपनी ट्रेडिंग एल्गोरिदम बनाने के लिए व्यक्तिगत दैनिक स्टॉक कीमतें देखने से पहले, आपको उपलब्ध सभी स्टॉक टिकर्स इकट्ठा करने होंगे। सबसे पहले stock.list को एक URL स्ट्रिंग के रूप में घोषित करें। अगला, read_html() का उपयोग करें ताकि आपका R सत्र इंटरनेट सत्र बनाए और पेज की सारी html जानकारी को एक XML नोड सेट के रूप में इकट्ठा करे। पेज CSS में “.company-name” नाम का एक ID है। जब आप html_nodes() कॉल करते हैं, तो इसे पैरामीटर के रूप में उपयोग करें ताकि केवल इस नोड से संबद्ध XML डेटा चुना जाए। अंत में, html_text() का उपयोग करें ताकि कंपनी नामों के वास्तविक टेक्स्ट मान एकत्रित हो जाएं।
stock.list<-'https://www.loyal3.com/stocks'
stocks<-read_html(stock.list)
stocks.names<-html_nodes(stocks,'.company-name')
stocks.names<-html_text(stocks.names)संचालित द्वारा
loyal3 पर उपलब्ध स्टॉक्स की जाँच करने के लिए, आप stocks.names ऑब्जेक्ट को अपने कंसोल में प्रिंट कर सकते हैं। यह कंपनी का नाम एक टेक्स्ट वेक्टर के रूप में लौटाता है।
स्टॉक की कीमतों का शोध करने के लिए, आपको पहले टिकर प्रतीक (ticker symbol) प्राप्त करना होगा। जब आप loyal3 साइट पर होते हैं, तो आप कंपनी टाइल पर क्लिक करके एक ऐसा पेज खोल सकते हैं जिसमें टिकर सिंबल और अन्य कंपनी जानकारी होती है।
html_nodes() का उपयोग करके stocks पर, आप सभी ऐसे नोड्स खींचते हैं जिन्हें “a” से चिह्नित किया गया है। HTML में <a> टैग एक हाइपरलिंक को परिभाषित करता है जिसका उपयोग एक पेज से दूसरे पेज को लिंक करने के लिए किया जाता है। हाइपरलिंक टैग के भीतर, “href” सटीक URL पते को संदर्भित करता है। इसलिए यदि आप “href” पास करते हैं, तो html_attr() पेज के सभी लिंक के URL निकाल देगा।
कुछ मैनुअल निरीक्षण के बाद, मुझे पेज पर 54वें से 123वें लिंक तक वे कंपनी पेज मिले जो टिकर जानकारी स्क्रैप करने के लिए चाहिए। आखिरी पंक्ति paste0() का उपयोग करके बेस URL स्ट्रिंग ’http://www.loyal3.com` को विशिष्ट कंपनी पेजों, जैसे “/WALMART” से जोड़ती है। उदाहरण के लिए, http://www.loyal3.com/WALMART:
loyal.links<-html_nodes(stocks,"a")
loyal.links<-html_attr(loyal.links,"href")
stock.links<-paste0('http://www.loyal3.com',loyal.links[54:123])संचालित द्वारा
प्रत्येक कंपनी पेज पर एक विवरण, हाल की क्लोजिंग कीमत और टिकर होता है। सभी कंपनी पेज एक जैसे संगठित हैं, इसलिए कस्टम फ़ंक्शन get.ticker() का उपयोग टिकर सिंबल निकालने के लिए किया जा सकता है।
किसी कंपनी के वेब पेज के भीतर “ticker-price” नाम की एक तालिका होती है। फ़ंक्शन कंपनी पेज पर जाएगा, उपयुक्त तालिका की पहचान करेगा, html_text() से टेक्स्ट निकालेगा। अंत में, sub() के साथ नियमित अभिव्यक्ति ^([[:alpha:]]*).* और \\1 का उपयोग कर सभी वर्णात्मक (alphabetical) अक्षरों को बरकरार रखेगा। नतीजा यह होगा कि कोई भी विशेष वर्ण, जैसे $, और कोई भी संख्यात्मक वर्ण, जैसे क्लोजिंग कीमत, हटा दिए जाएंगे। जैसे-जैसे यह फ़ंक्शन 70 पेज पढ़ता है, यह केवल स्टॉक टिकर इकट्ठा करेगा।
get.ticker<-function(url){
x<-read_html(url)
x<-html_node(x,'.ticker-price')
x<-html_text(x)
x<-sub("^([[:alpha:]]*).*","\\1", x)
return(x)}संचालित द्वारा
Alibaba के लिए loyal3 स्टॉक पेज, जहाँ आप देख सकते हैं कि स्टॉक का टिकर, BABA, बोल्ड टेक्स्ट के नीचे तालिका में है
अपने कस्टम फ़ंक्शन से लैस होकर, pblapply() का उपयोग करके इसे प्रत्येक stock.links पर लागू करें, जिनमें प्रत्येक कंपनी का पेज शामिल है। परिणामी ऑब्जेक्ट, stock.tickers, व्यक्तिगत स्टॉक टिकर्स की एक सूची है जिसमें प्रत्येक एलिमेंट एक कंपनी के अनुरूप है।
stock.tickers<-pblapply(stock.links,get.ticker)संचालित द्वारा
एलिमेंट्स की सूची को एक फ्लैट ऑब्जेक्ट में बदलने का एक तरीका do.call() है। यहाँ, आप rbind लागू करके प्रत्येक सूची एलिमेंट को एक एकल वेक्टर में रो-बाइंड कर रहे हैं। अंत में, आप सिंबल और कंपनी नाम की जानकारी के साथ एक डेटा फ्रेम बनाते हैं।
stock.ticks<-do.call(rbind,stock.tickers)
stock.ticks<-data.frame(symbol=stock.ticks,name=stocks.names)संचालित द्वारा
अपने विश्लेषण में सुसंगत रहने के लिए, आप प्रत्येक स्टॉक पर एकत्रित ऐतिहासिक जानकारी की मात्रा सीमित करना चाह सकते हैं। Sys.Data() फ़ंक्शन एक तारीख ऑब्जेक्ट को वर्ष, महीना और फिर दिन के रूप में स्टोर करेगा। वर्षों को एक पूर्णांक के साथ उपयोग करना start.date ऑब्जेक्ट से एक विशिष्ट समय घटाने का एक तरीका है।
start.date<-Sys.Date()
end.date<-Sys.Date()-years(3)संचालित द्वारा
Yahoo फाइनेंस डेटा प्राप्त करने के लिए, तारीख ऑब्जेक्ट को बिना डैश के सरल कैरेक्टर ऑब्जेक्ट्स में बदला जाना चाहिए। start.date और end.date दोनों पर ग्लोबल सब्स्टीट्यूशन फ़ंक्शन gsub() का उपयोग करने से क्लास बदल जाएगी और साथ ही साथ डैश हट जाएंगे। gsub() के भीतर, खोजे जाने वाले कैरेक्टर पैटर्न को पास करें, फिर रिप्लेसमेंट कैरेक्टर्स। इस मामले में रिप्लेसमेंट पैटर्न उद्धरणों के बीच खाली कैरेक्टर है। अंतिम पैरामीटर वह ऑब्जेक्ट है जिस पर gsub() लागू होगा।
start.date<-gsub('-','', start.date)
end.date<-gsub('-','', end.date)संचालित द्वारा
TTR() का फ़ंक्शन getYahooData() एक स्टॉक सिंबल और एक प्रारंभ तथा समाप्ति तारीख स्वीकार करता है। यह फ़ंक्शन एक डेटा फ्रेम लौटाता है जिसमें टाइम सीरीज़ जानकारी होती है। प्रत्येक पंक्ति एक तारीख होती है और कॉलम में “Open”, “High”, “Low” और “Closing” कीमत जैसी जानकारी होती है। चूँकि आप कई कंपनियों को देख रहे हैं, आप lapply() या pblapply() का उपयोग कर सकते हैं। कंपनियों के सिंबल का वेक्टर, फिर फ़ंक्शन getYahooData(), और फिर तारीख की जानकारी पास करें। date ऑब्जेक्ट्स रिसाइकल्ड पैरामीटर होते हैं जो हर बार getYahooData() को एक स्टॉक सिंबल पर लागू करने पर उपयोग होते हैं।
stocks.ts<-pblapply(stock.ticks$symbol,getYahooData,end.date, start.date)संचालित द्वारा
वापसी में प्राप्त सूची stocks.ts को नेविगेट करना आसान बनाने के लिए आप सूची एलिमेंट्स को नाम दे सकते हैं। stocks.ts ऑब्जेक्ट पर names का उपयोग करते हुए नामों को मूल $symbol वेक्टर के रूप में घोषित करें।
बड़ी सूचियों के साथ काम करते समय, मुझे परिणामी ऑब्जेक्ट की जाँच करना पसंद है ताकि यह सुनिश्चित हो सके कि परिणाम अपेक्षित है। अब जब एलिमेंट्स के नाम हैं, तो आप उन्हें सीधे संदर्भित कर सकते हैं। इस उदाहरण में, आप AMC Entertainment Holdings (AMC) के लिए पहली 6 पंक्तियाँ देख रहे हैं। सूची पर head() का उपयोग करते हुए और $AMC का संदर्भ देते हुए इस स्टॉक के टाइम सीरीज़ का एक भाग प्राप्त होगा:
जब मैं वित्तीय समाचार सुनता/सुनती हूं तो कमेंटेटर अक्सर चार्ट्स का संदर्भ देते हैं। उच्च आवृत्ति ट्रेडिंग और दूसरों द्वारा की जाने वाली एक्टिव मैनेजमेंट के बावजूद, कई छोटे निवेशक अब भी अंतर्दृष्टि पाने के लिए चार्ट्स का सहारा लेते हैं। टाइम सीरीज़ ऑब्जेक्ट को plot का उपयोग कर जल्दी प्रदर्शित किया जा सकता है। नामित एलिमेंट जैसे $AMC और फिर वह कॉलम जिसे आप दिखाना चाहते हैं, यहाँ $Close, पास करें।
आइए एक JavaScript लाइब्रेरी का उपयोग करके ऐसा चार्ट बनाएं जिसे आप एक्सप्लोर कर सकें। इस कोड स्निपेट में, आप “%>%” या pipe ऑपरेटर देख सकते हैं। pipe ऑपरेटर संक्षिप्त कोड लिखने का एक अच्छा तरीका है। यह किसी ऑब्जेक्ट को अगले फ़ंक्शन तक फॉरवर्ड कर देता है, जिससे आपको इस पोस्ट में पहले की तरह बार-बार ऑब्जेक्ट नाम लिखने की ज़रूरत नहीं पड़ती।
इस उदाहरण में, आप Twitter स्टॉक $TWTR का संदर्भ लेते हुए और फिर जिस कॉलम को आप प्लॉट करना चाहते हैं $Close, एक dygraph बनाते हैं। dygraph के भीतर, main उद्धरणों के बीच निर्दिष्ट एक शीर्षक जोड़ता है। “%>%” का उपयोग करते हुए पूरा ऑब्जेक्ट अगले फ़ंक्शन dyRangeSelector() को फॉरवर्ड हो जाता है। आप c() का उपयोग करके एक प्रारंभ और एक समाप्ति तिथि स्ट्रिंग देकर डिफ़ॉल्ट तिथि सीमा निर्दिष्ट कर सकते हैं। परिणामी HTML ऑब्जेक्ट Twitter के स्टॉक के लिए एक डायनेमिक टाइम सीरीज़ है, जिसके नीचे एक डेट स्लाइडर है।
याद रखें, प्रदर्शित इक्विटी बदलने के लिए, stocks.ts सूची में टिकर सिंबल और फिर ग्राफ का शीर्षक बदलें।
dygraph(stocks.ts$TWTR$Close, main ="TWTR Stock Price")%>%
dyRangeSelector(dateWindow = c("2013-12-18","2016-12-30"))संचालित द्वारा
यह Twitter के स्टॉक के लिए एक बुनियादी dygraph है
एक सरल ट्रेडिंग रणनीति: ट्रेंड फॉलोइंग
हाई फ्रीक्वेंसी ट्रेडर्स और हेज फंड्स ट्रेड्स निष्पादित करने के लिए जटिल मॉडल और नियम-आधारित दृष्टिकोणों का उपयोग करते हैं। यदि आप और अधिक सीखना चाहते हैं तो उन्नत तरीकों के लिए www.quantopian.com देखें। सरल तरीकों के लिए www.Investopedia.com पर इस पेज से शुरुआत करें।
नीचे दिए गए कोड में, आप एक सरल मोमेंटम ट्रेडिंग रणनीति का विज़ुअलाइज़ेशन करेंगे। मूल रूप से, आप किसी स्टॉक कीमत के लिए 200 दिन और 50 दिन के मूविंग एवरेज की गणना करना चाहेंगे। जिस भी दिन 50 दिन का मूविंग एवरेज 200 दिन के मूविंग एवरेज से ऊपर है, आप अपनी पोजीशन खरीदेंगे या होल्ड करेंगे। जिन दिनों 200 दिन का एवरेज 50 दिन के मूविंग एवरेज से अधिक है, आप अपने शेयर बेच देंगे। इस रणनीति को ट्रेंड फॉलोइंग रणनीति कहा जाता है। समय-आधारित इन दोनों औसतों के बीच का सकारात्मक या नकारात्मक संबंध स्टॉक के मोमेंटम का प्रतिनिधित्व करता है।
TTR पैकेज SMA() प्रदान करता है जो सिंपल मूविंग एवरेज की गणना करता है। इस कोड स्निपेट में, आप Twitter के 200 और 50 दिन के मूविंग एवरेज के पहले 6 मान देख रहे हैं। SMA() किसी स्टॉक के टाइम सीरीज़ डेटा और एक विशिष्ट कॉलम जैसे Close को पास करने पर काम करता है। यह TWTR स्टॉक की क्लोजिंग कीमतों का एकल वेक्टर है। दूसरा पैरामीटर मूविंग एवरेज के लिए ऑब्ज़र्वेशंस की संख्या का प्रतिनिधित्व करने वाला एक पूर्णांक है। head() का उपयोग किए बिना SMA() फ़ंक्शन सभी मान लौटाएगा।
head(SMA(stocks.ts$TWTR$Close,200))
head(SMA(stocks.ts$TWTR$Close,50))संचालित द्वारा
अब जब आपने मूविंग एवरेज फ़ंक्शन का विस्तार से परीक्षण कर लिया है, तो आपको इसे 70 स्टॉक्स में से प्रत्येक पर लागू करने की आवश्यकता है। stocks.ts 70 डेटा फ्रेम्स की एक सूची है जिसमें व्यक्तिगत स्टॉक डेटा है। प्रत्येक डेटा फ्रेम का चौथा कॉलम क्लोजिंग प्राइस रखता है जिसे हम मूविंग एवरेज के लिए उपयोग करना चाहते हैं।
कस्टम फ़ंक्शन mov.avgs() मूविंग एवरेज की गणना करने के लिए एक एकल स्टॉक डेटा फ्रेम स्वीकार करता है। पहली पंक्ति [,4] को इंडेक्स करके क्लोजिंग कीमतें चुनती है और stock.close बनाती है। अगली पंक्ति में, फ़ंक्शन ifelse का उपयोग करके डेटा फ्रेम में पंक्तियों की संख्या की जाँच करता है। विशेष रूप से यदि डेटा फ्रेम में nrow(2*260) से कम है, तो फ़ंक्शन मूविंग एवरेज का एक डेटा फ्रेम “NA” के साथ बनाता है।
मैंने यह संख्या इसलिए चुनी क्योंकि एक साल में लगभग 250 ट्रेडिंग दिन होते हैं, इसलिए यह जाँच करेगा कि टाइम सीरीज़ लगभग 2 साल या उससे अधिक लंबी है। Loyal3 कभी-कभी IPOs तक पहुँच सकता है और यदि स्टॉक नया सार्वजनिक हुआ है तो 200 दिन के मूविंग एवरेज के लिए पर्याप्त डेटा नहीं होगा। हालाँकि, यदि nrow का मान 2*260 से अधिक है तो फ़ंक्शन मूल डेटा के साथ-साथ 200 और 50 दिन के मूविंग एवरेज को नए कॉलम के रूप में जोड़कर एक डेटा फ्रेम बनाएगा। colnames का उपयोग करके, मैं कॉलम नाम घोषित करता/करती हूं। फ़ंक्शन का अंतिम भाग complete.cases का उपयोग 200 दिन के मूविंग एवरेज कॉलम में मानों की जाँच करने के लिए करता है। जिन पंक्तियों में मान नहीं हैं उन्हें अंतिम परिणाम में हटा दिया जाता है।
किसी स्टॉक के मूविंग एवरेज को dygraph का उपयोग करके विज़ुअलाइज़ करने के लिए नीचे दिया गया कोड उपयोग करें। एक बार फिर, यह कोड ऑब्जेक्ट्स को फॉरवर्ड करने के लिए “%>%” ऑपरेटर का उपयोग कर रहा है। dygraph() फ़ंक्शन stocks.ts$FOX डेटा फ्रेम स्वीकार करता है। विशेष रूप से, डेटा फ्रेम को कॉलम नाम से c('sma_200','sma_50') के साथ इंडेक्स किया गया है। यह ऑब्जेक्ट अगली 2 पंक्तियों में dySeries() को पास किया जाता है। आप कॉलम का नाम लेकर संदर्भित कर सकते हैं, इसलिए dySeries() पंक्ति 2 और 3 में “sma_50” और “sma_200” मानों के लिए एक-एक रेखा प्लॉट करता है। यह ऑब्जेक्ट dyRangeSelector() को सिलेक्टर की ऊँचाई समायोजित करने के लिए फिर से फॉरवर्ड होता है। अंत में, मैंने कुछ शेडिंग जोड़ी है ताकि उन अवधियों को परिभाषित किया जा सके जब आप इक्विटी खरीदना/होल्ड करना चाहेंगे और वह अवधि जब आपको अपने शेयर बेच देने चाहिए या अपनी पोजीशन के अनुसार दूर रहना चाहिए।
dygraph(stocks.ts$FOX[,c('sma_200','sma_50')],main ='FOX Moving Averages')%>%
dySeries('sma_50', label ='sma 50')%>%
dySeries('sma_200', label ='sma 200')%>%
dyRangeSelector(height =30)%>%
dyShading(from ='2016-4-28', to ='2016-7-27', color ='#CCEBD6')%>%
dyShading(from ='2016-7-28', to ='2016-12-30', color ='#FFE6E6')संचालित द्वारा
यह रहा अंतिम परिणाम, एक इंटरएक्टिव टाइम सीरीज़ में।
खरीदने/होल्ड करने बनाम बेचने की अवधियों के लिए शेडेड क्षेत्रों के साथ FOX के मूविंग एवरेज
निष्कर्ष
एक नवोदित एल्गोरिदमिक ट्रेडर के रूप में, आपको सभी 70 शेयरों का प्लॉट बनाने की आवश्यकता नहीं है। इसके बजाय, आप हर दिन कोड चलाना चाहेंगे और नियम-आधारित विधि के अनुरूप स्टॉक्स की पहचान करने का एक प्रोग्रामेटिक तरीका जोड़ना चाहेंगे: “खरीदें यदि 50 दिन का मूविंग एवरेज 200 दिन के मूविंग एवरेज से ऊपर है।” उपरोक्त चार्ट की समीक्षा करते समय, हरा भाग वह समय है जिसमें आप FOX इक्विटी खरीदते। लाल भाग वह समय दर्शाता है जब आपको अपने शेयर बेच देने चाहिए और पुनः प्रवेश नहीं करना चाहिए।
चूँकि ग्राफ इंटरएक्टिव है, आप स्लाइडर का उपयोग करके विज़ुअल का आकार बदल सकते हैं। इस सरल एल्गो ट्रेडिंग दृष्टिकोण के आधार पर, अभी FOX खरीदने का अच्छा समय हो सकता है! 30 दिसंबर, 2016 एक ट्रेडिंग दिन था जब 50 दिन का मूविंग एवरेज 200 दिन के मूविंग एवरेज से $0.01 ऊपर चला गया!
FOX इक्विटी का ज़ूम किया हुआ भाग
बेशक, याद रखें कि सभी निवेशों का मूल्य घट सकता है। वित्त और एल्गो ट्रेडिंग के बारे में अधिक जानने के लिए, DataCamp के कोर्सेज़ को यहाँ देखें।
इस पोस्ट में, मैं दिखाऊंगा कि R का उपयोग करके loyal3 पर सूचीबद्ध स्टॉक्स कैसे इकट्ठे करें, Yahoo से ऐतिहासिक डेटा लें और फिर एक सरल एल्गोरिदमिक ट्रेडिंग रणनीति लागू करें। इस दौरान, आप वेब स्क्रैपिंग, एक फाइनेंस API को हिट करने वाली फ़ंक्शन और एक htmlwidget का उपयोग करके इंटरएक्टिव टाइम सीरीज़ चार्ट बनाना सीखेंगे।
इस पोस्ट के लिए, ट्रेडिंग एल्गो को ऐसे नियमों के सेट के रूप में परिभाषित किया गया है जो प्रेडिक्टिव मॉडल या टाइम सीरीज़ फोरकास्ट के बजाय खरीद या बिक्री की घटना को ट्रिगर करते हैं। यह ट्रेडिंग एल्गो का सबसे सरल प्रकार है, लेकिन यदि आप R के साथ वित्त में गहराई से जाना चाहते हैं, तो मैं आपको DataCamp का R में क्वांटिटेटिव ट्रेडिंग स्ट्रेटेजी मॉडलिंग कोर्स करने के लिए प्रोत्साहित करूंगा।
पृष्ठभूमि
2015 में, मैंने loyal3 पर थोड़ा-बहुत निवेश करना शुरू किया। उनकी सेवा असामान्य है और अपनी निवेश यात्रा शुरू करने के लिए एक बेहतरीन जगह है। निवेशकों से ट्रेड के लिए शुल्क लेने के बजाय, loyal3 अपनी प्लेटफ़ॉर्म पर लिस्टिंग के लिए कंपनियों से शुल्क लेता है। premise यह है कि जिन लोगों को किसी कंपनी की सेवा पसंद है वे स्टॉक भी खरीदेंगे और ऐसा करके सशक्त ब्रांड एडवोकेट बनेंगे। इस प्लेटफ़ॉर्म का एक और आकर्षक पहलू यह है कि आप आंशिक शेयर खरीद सकते हैं। तो, आप $800 के Amazon स्टॉक में केवल $10 से प्रवेश कर सकते हैं और हर बार महीने के अंत में थोड़े अतिरिक्त पैसों से $10 का एक और अंश खरीद सकते हैं। हां, कुछ friction लागतें हैं क्योंकि आपको विंडोज़ में ट्रेड करना पड़ता है और आपका पूरा पोर्टफोलियो लगभग 70 स्टॉक्स तक सीमित है, लेकिन loyal3 इक्विटी ट्रेडिंग को एक्सप्लोर करने का एक मजेदार और कम लागत वाला तरीका प्रदान करता है। आप मात्र $10 से असली दांव लगा सकते हैं!
स्पष्ट करने के लिए, मेरे पास सामान्य रिटायरमेंट और इन्वेस्टमेंट अकाउंट्स हैं लेकिन मुझे loyal3 का ऐप पर स्वच्छ इंटरफ़ेस और फीस का अभाव पसंद है। यह आसान और मनभावन होने के कारण मैं अपने मज़ेदार loyal3 पोर्टफोलियो को अपने म्यूचुअल फंड्स की तुलना में ज़्यादा बार देखता हूं, क्योंकि इसमें सीधे चुने गए स्टॉक्स का प्रदर्शन देखना सुखद लगता है।
अपना वर्कस्पेस सेट करना
शुरू करने के लिए, लाइब्रेरीज़ को अपने एनवायरनमेंट में लोड करें। मैं इन दिनों वेब स्क्रैपिंग के लिए लगभग हमेशा
rvestका उपयोग करता/करती हूं। अन्य पैकेज भी काम करते हैं जैसेRSelenium, लेकिन मुझे पसंद है किrvestकितनी आसानी से चल जाता है।दूसरा पैकेज,
pbapply, वैकल्पिक है क्योंकि यह केवल apply फ़ंक्शंस में प्रोग्रेस बार जोड़ता है। चूँकि आप सैकड़ों वेब पेज स्क्रैप कर सकते हैं, समय का अनुमान लगाने के लिए प्रोग्रेस बार सहायक हो सकता है।अगला,
TTRएक पैकेज है जिसे मैंने अभी-अभी एक्सप्लोर करना शुरू किया है। यह लाइब्रेरी “Technical Trading Rules” बनाने के लिए उपयोग होती है। यद्यपि आप इस पोस्ट में एक सरल ट्रेडिंग एल्गो सीखेंगे,TTRपैकेज और भी विकसित गणनाएँ कर सकता है और सीखने लायक है।dygraphsलाइब्रेरी एक तेज, ओपन सोर्स JavaScript चार्टिंग लाइब्रेरी के लिए रैपर है। यह उन htmlwidgets में से एक है जो R चार्टिंग को स्थिर इमेज के बजाय html फ़ाइल का डायनेमिक हिस्सा बनाता है। अंत में,lubridateपैकेज दिनांक (date) में आसान हेरफेर के लिए उपयोग होता है।डेटा संग्रह
सभी loyal3 स्टॉक्स एक ही पेज पर सूचीबद्ध हैं। अपनी ट्रेडिंग एल्गोरिदम बनाने के लिए व्यक्तिगत दैनिक स्टॉक कीमतें देखने से पहले, आपको उपलब्ध सभी स्टॉक टिकर्स इकट्ठा करने होंगे। सबसे पहले
stock.listको एक URL स्ट्रिंग के रूप में घोषित करें। अगला,read_html()का उपयोग करें ताकि आपका R सत्र इंटरनेट सत्र बनाए और पेज की सारी html जानकारी को एक XML नोड सेट के रूप में इकट्ठा करे। पेज CSS में “.company-name” नाम का एक ID है। जब आपhtml_nodes()कॉल करते हैं, तो इसे पैरामीटर के रूप में उपयोग करें ताकि केवल इस नोड से संबद्ध XML डेटा चुना जाए। अंत में,html_text()का उपयोग करें ताकि कंपनी नामों के वास्तविक टेक्स्ट मान एकत्रित हो जाएं।loyal3 पर उपलब्ध स्टॉक्स की जाँच करने के लिए, आप
stocks.namesऑब्जेक्ट को अपने कंसोल में प्रिंट कर सकते हैं। यह कंपनी का नाम एक टेक्स्ट वेक्टर के रूप में लौटाता है।स्टॉक की कीमतों का शोध करने के लिए, आपको पहले टिकर प्रतीक (ticker symbol) प्राप्त करना होगा। जब आप loyal3 साइट पर होते हैं, तो आप कंपनी टाइल पर क्लिक करके एक ऐसा पेज खोल सकते हैं जिसमें टिकर सिंबल और अन्य कंपनी जानकारी होती है।
html_nodes()का उपयोग करके stocks पर, आप सभी ऐसे नोड्स खींचते हैं जिन्हें “a” से चिह्नित किया गया है। HTML में<a>टैग एक हाइपरलिंक को परिभाषित करता है जिसका उपयोग एक पेज से दूसरे पेज को लिंक करने के लिए किया जाता है। हाइपरलिंक टैग के भीतर, “href” सटीक URL पते को संदर्भित करता है। इसलिए यदि आप “href” पास करते हैं, तोhtml_attr()पेज के सभी लिंक के URL निकाल देगा।कुछ मैनुअल निरीक्षण के बाद, मुझे पेज पर 54वें से 123वें लिंक तक वे कंपनी पेज मिले जो टिकर जानकारी स्क्रैप करने के लिए चाहिए। आखिरी पंक्ति
paste0()का उपयोग करके बेस URL स्ट्रिंग ’http://www.loyal3.com` को विशिष्ट कंपनी पेजों, जैसे “/WALMART” से जोड़ती है। उदाहरण के लिए, http://www.loyal3.com/WALMART:प्रत्येक कंपनी पेज पर एक विवरण, हाल की क्लोजिंग कीमत और टिकर होता है। सभी कंपनी पेज एक जैसे संगठित हैं, इसलिए कस्टम फ़ंक्शन
get.ticker()का उपयोग टिकर सिंबल निकालने के लिए किया जा सकता है।किसी कंपनी के वेब पेज के भीतर “ticker-price” नाम की एक तालिका होती है। फ़ंक्शन कंपनी पेज पर जाएगा, उपयुक्त तालिका की पहचान करेगा,
html_text()से टेक्स्ट निकालेगा। अंत में,sub()के साथ नियमित अभिव्यक्ति^([[:alpha:]]*).*और\\1का उपयोग कर सभी वर्णात्मक (alphabetical) अक्षरों को बरकरार रखेगा। नतीजा यह होगा कि कोई भी विशेष वर्ण, जैसे $, और कोई भी संख्यात्मक वर्ण, जैसे क्लोजिंग कीमत, हटा दिए जाएंगे। जैसे-जैसे यह फ़ंक्शन 70 पेज पढ़ता है, यह केवल स्टॉक टिकर इकट्ठा करेगा।अपने कस्टम फ़ंक्शन से लैस होकर,
pblapply()का उपयोग करके इसे प्रत्येकstock.linksपर लागू करें, जिनमें प्रत्येक कंपनी का पेज शामिल है। परिणामी ऑब्जेक्ट,stock.tickers, व्यक्तिगत स्टॉक टिकर्स की एक सूची है जिसमें प्रत्येक एलिमेंट एक कंपनी के अनुरूप है।एलिमेंट्स की सूची को एक फ्लैट ऑब्जेक्ट में बदलने का एक तरीका
do.call()है। यहाँ, आपrbindलागू करके प्रत्येक सूची एलिमेंट को एक एकल वेक्टर में रो-बाइंड कर रहे हैं। अंत में, आप सिंबल और कंपनी नाम की जानकारी के साथ एक डेटा फ्रेम बनाते हैं।अपने विश्लेषण में सुसंगत रहने के लिए, आप प्रत्येक स्टॉक पर एकत्रित ऐतिहासिक जानकारी की मात्रा सीमित करना चाह सकते हैं।
Sys.Data()फ़ंक्शन एक तारीख ऑब्जेक्ट को वर्ष, महीना और फिर दिन के रूप में स्टोर करेगा। वर्षों को एक पूर्णांक के साथ उपयोग करनाstart.dateऑब्जेक्ट से एक विशिष्ट समय घटाने का एक तरीका है।Yahoo फाइनेंस डेटा प्राप्त करने के लिए, तारीख ऑब्जेक्ट को बिना डैश के सरल कैरेक्टर ऑब्जेक्ट्स में बदला जाना चाहिए।
start.dateऔरend.dateदोनों पर ग्लोबल सब्स्टीट्यूशन फ़ंक्शनgsub()का उपयोग करने से क्लास बदल जाएगी और साथ ही साथ डैश हट जाएंगे।gsub()के भीतर, खोजे जाने वाले कैरेक्टर पैटर्न को पास करें, फिर रिप्लेसमेंट कैरेक्टर्स। इस मामले में रिप्लेसमेंट पैटर्न उद्धरणों के बीच खाली कैरेक्टर है। अंतिम पैरामीटर वह ऑब्जेक्ट है जिस परgsub()लागू होगा।TTR()का फ़ंक्शनgetYahooData()एक स्टॉक सिंबल और एक प्रारंभ तथा समाप्ति तारीख स्वीकार करता है। यह फ़ंक्शन एक डेटा फ्रेम लौटाता है जिसमें टाइम सीरीज़ जानकारी होती है। प्रत्येक पंक्ति एक तारीख होती है और कॉलम में “Open”, “High”, “Low” और “Closing” कीमत जैसी जानकारी होती है। चूँकि आप कई कंपनियों को देख रहे हैं, आपlapply()याpblapply()का उपयोग कर सकते हैं। कंपनियों के सिंबल का वेक्टर, फिर फ़ंक्शनgetYahooData(), और फिर तारीख की जानकारी पास करें।dateऑब्जेक्ट्स रिसाइकल्ड पैरामीटर होते हैं जो हर बारgetYahooData()को एक स्टॉक सिंबल पर लागू करने पर उपयोग होते हैं।वापसी में प्राप्त सूची
stocks.tsको नेविगेट करना आसान बनाने के लिए आप सूची एलिमेंट्स को नाम दे सकते हैं।stocks.tsऑब्जेक्ट पर names का उपयोग करते हुए नामों को मूल$symbolवेक्टर के रूप में घोषित करें।बड़ी सूचियों के साथ काम करते समय, मुझे परिणामी ऑब्जेक्ट की जाँच करना पसंद है ताकि यह सुनिश्चित हो सके कि परिणाम अपेक्षित है। अब जब एलिमेंट्स के नाम हैं, तो आप उन्हें सीधे संदर्भित कर सकते हैं। इस उदाहरण में, आप AMC Entertainment Holdings (AMC) के लिए पहली 6 पंक्तियाँ देख रहे हैं। सूची पर
head()का उपयोग करते हुए और $AMC का संदर्भ देते हुए इस स्टॉक के टाइम सीरीज़ का एक भाग प्राप्त होगा:स्टॉक डेटा की जाँच
जब मैं वित्तीय समाचार सुनता/सुनती हूं तो कमेंटेटर अक्सर चार्ट्स का संदर्भ देते हैं। उच्च आवृत्ति ट्रेडिंग और दूसरों द्वारा की जाने वाली एक्टिव मैनेजमेंट के बावजूद, कई छोटे निवेशक अब भी अंतर्दृष्टि पाने के लिए चार्ट्स का सहारा लेते हैं। टाइम सीरीज़ ऑब्जेक्ट को plot का उपयोग कर जल्दी प्रदर्शित किया जा सकता है। नामित एलिमेंट जैसे
$AMCऔर फिर वह कॉलम जिसे आप दिखाना चाहते हैं, यहाँ$Close, पास करें।उपरोक्त प्लॉट स्थिर है और बहुत रोचक नहीं है।
आइए एक JavaScript लाइब्रेरी का उपयोग करके ऐसा चार्ट बनाएं जिसे आप एक्सप्लोर कर सकें। इस कोड स्निपेट में, आप “%>%” या pipe ऑपरेटर देख सकते हैं। pipe ऑपरेटर संक्षिप्त कोड लिखने का एक अच्छा तरीका है। यह किसी ऑब्जेक्ट को अगले फ़ंक्शन तक फॉरवर्ड कर देता है, जिससे आपको इस पोस्ट में पहले की तरह बार-बार ऑब्जेक्ट नाम लिखने की ज़रूरत नहीं पड़ती।
इस उदाहरण में, आप Twitter स्टॉक
$TWTRका संदर्भ लेते हुए और फिर जिस कॉलम को आप प्लॉट करना चाहते हैं$Close, एक dygraph बनाते हैं। dygraph के भीतर, main उद्धरणों के बीच निर्दिष्ट एक शीर्षक जोड़ता है। “%>%” का उपयोग करते हुए पूरा ऑब्जेक्ट अगले फ़ंक्शनdyRangeSelector()को फॉरवर्ड हो जाता है। आपc()का उपयोग करके एक प्रारंभ और एक समाप्ति तिथि स्ट्रिंग देकर डिफ़ॉल्ट तिथि सीमा निर्दिष्ट कर सकते हैं। परिणामी HTML ऑब्जेक्ट Twitter के स्टॉक के लिए एक डायनेमिक टाइम सीरीज़ है, जिसके नीचे एक डेट स्लाइडर है।याद रखें, प्रदर्शित इक्विटी बदलने के लिए,
stocks.tsसूची में टिकर सिंबल और फिर ग्राफ का शीर्षक बदलें।एक सरल ट्रेडिंग रणनीति: ट्रेंड फॉलोइंग
हाई फ्रीक्वेंसी ट्रेडर्स और हेज फंड्स ट्रेड्स निष्पादित करने के लिए जटिल मॉडल और नियम-आधारित दृष्टिकोणों का उपयोग करते हैं। यदि आप और अधिक सीखना चाहते हैं तो उन्नत तरीकों के लिए www.quantopian.com देखें। सरल तरीकों के लिए www.Investopedia.com पर इस पेज से शुरुआत करें।
नीचे दिए गए कोड में, आप एक सरल मोमेंटम ट्रेडिंग रणनीति का विज़ुअलाइज़ेशन करेंगे। मूल रूप से, आप किसी स्टॉक कीमत के लिए 200 दिन और 50 दिन के मूविंग एवरेज की गणना करना चाहेंगे। जिस भी दिन 50 दिन का मूविंग एवरेज 200 दिन के मूविंग एवरेज से ऊपर है, आप अपनी पोजीशन खरीदेंगे या होल्ड करेंगे। जिन दिनों 200 दिन का एवरेज 50 दिन के मूविंग एवरेज से अधिक है, आप अपने शेयर बेच देंगे। इस रणनीति को ट्रेंड फॉलोइंग रणनीति कहा जाता है। समय-आधारित इन दोनों औसतों के बीच का सकारात्मक या नकारात्मक संबंध स्टॉक के मोमेंटम का प्रतिनिधित्व करता है।
TTRपैकेजSMA()प्रदान करता है जो सिंपल मूविंग एवरेज की गणना करता है। इस कोड स्निपेट में, आप Twitter के 200 और 50 दिन के मूविंग एवरेज के पहले 6 मान देख रहे हैं।SMA()किसी स्टॉक के टाइम सीरीज़ डेटा और एक विशिष्ट कॉलम जैसेCloseको पास करने पर काम करता है। यह TWTR स्टॉक की क्लोजिंग कीमतों का एकल वेक्टर है। दूसरा पैरामीटर मूविंग एवरेज के लिए ऑब्ज़र्वेशंस की संख्या का प्रतिनिधित्व करने वाला एक पूर्णांक है।head()का उपयोग किए बिनाSMA()फ़ंक्शन सभी मान लौटाएगा।अब जब आपने मूविंग एवरेज फ़ंक्शन का विस्तार से परीक्षण कर लिया है, तो आपको इसे 70 स्टॉक्स में से प्रत्येक पर लागू करने की आवश्यकता है।
stocks.ts70 डेटा फ्रेम्स की एक सूची है जिसमें व्यक्तिगत स्टॉक डेटा है। प्रत्येक डेटा फ्रेम का चौथा कॉलम क्लोजिंग प्राइस रखता है जिसे हम मूविंग एवरेज के लिए उपयोग करना चाहते हैं।कस्टम फ़ंक्शन
mov.avgs()मूविंग एवरेज की गणना करने के लिए एक एकल स्टॉक डेटा फ्रेम स्वीकार करता है। पहली पंक्ति[,4]को इंडेक्स करके क्लोजिंग कीमतें चुनती है औरstock.closeबनाती है। अगली पंक्ति में, फ़ंक्शनifelseका उपयोग करके डेटा फ्रेम में पंक्तियों की संख्या की जाँच करता है। विशेष रूप से यदि डेटा फ्रेम मेंnrow(2*260)से कम है, तो फ़ंक्शन मूविंग एवरेज का एक डेटा फ्रेम “NA” के साथ बनाता है।मैंने यह संख्या इसलिए चुनी क्योंकि एक साल में लगभग 250 ट्रेडिंग दिन होते हैं, इसलिए यह जाँच करेगा कि टाइम सीरीज़ लगभग 2 साल या उससे अधिक लंबी है। Loyal3 कभी-कभी IPOs तक पहुँच सकता है और यदि स्टॉक नया सार्वजनिक हुआ है तो 200 दिन के मूविंग एवरेज के लिए पर्याप्त डेटा नहीं होगा। हालाँकि, यदि
nrowका मान 2*260 से अधिक है तो फ़ंक्शन मूल डेटा के साथ-साथ 200 और 50 दिन के मूविंग एवरेज को नए कॉलम के रूप में जोड़कर एक डेटा फ्रेम बनाएगा।colnamesका उपयोग करके, मैं कॉलम नाम घोषित करता/करती हूं। फ़ंक्शन का अंतिम भागcomplete.casesका उपयोग 200 दिन के मूविंग एवरेज कॉलम में मानों की जाँच करने के लिए करता है। जिन पंक्तियों में मान नहीं हैं उन्हें अंतिम परिणाम में हटा दिया जाता है।इस
mov.avgs()फ़ंक्शन के साथ आपpblapply()का उपयोग करके 70 डेटा फ्रेम्स में से प्रत्येक में मूविंग एवरेज की गणनाएँ जोड़ सकते हैं।किसी स्टॉक के मूविंग एवरेज को dygraph का उपयोग करके विज़ुअलाइज़ करने के लिए नीचे दिया गया कोड उपयोग करें। एक बार फिर, यह कोड ऑब्जेक्ट्स को फॉरवर्ड करने के लिए “%>%” ऑपरेटर का उपयोग कर रहा है।
dygraph()फ़ंक्शनstocks.ts$FOXडेटा फ्रेम स्वीकार करता है। विशेष रूप से, डेटा फ्रेम को कॉलम नाम सेc('sma_200','sma_50')के साथ इंडेक्स किया गया है। यह ऑब्जेक्ट अगली 2 पंक्तियों मेंdySeries()को पास किया जाता है। आप कॉलम का नाम लेकर संदर्भित कर सकते हैं, इसलिएdySeries()पंक्ति 2 और 3 में “sma_50” और “sma_200” मानों के लिए एक-एक रेखा प्लॉट करता है। यह ऑब्जेक्टdyRangeSelector()को सिलेक्टर की ऊँचाई समायोजित करने के लिए फिर से फॉरवर्ड होता है। अंत में, मैंने कुछ शेडिंग जोड़ी है ताकि उन अवधियों को परिभाषित किया जा सके जब आप इक्विटी खरीदना/होल्ड करना चाहेंगे और वह अवधि जब आपको अपने शेयर बेच देने चाहिए या अपनी पोजीशन के अनुसार दूर रहना चाहिए।यह रहा अंतिम परिणाम, एक इंटरएक्टिव टाइम सीरीज़ में।
निष्कर्ष
एक नवोदित एल्गोरिदमिक ट्रेडर के रूप में, आपको सभी 70 शेयरों का प्लॉट बनाने की आवश्यकता नहीं है। इसके बजाय, आप हर दिन कोड चलाना चाहेंगे और नियम-आधारित विधि के अनुरूप स्टॉक्स की पहचान करने का एक प्रोग्रामेटिक तरीका जोड़ना चाहेंगे: “खरीदें यदि 50 दिन का मूविंग एवरेज 200 दिन के मूविंग एवरेज से ऊपर है।” उपरोक्त चार्ट की समीक्षा करते समय, हरा भाग वह समय है जिसमें आप FOX इक्विटी खरीदते। लाल भाग वह समय दर्शाता है जब आपको अपने शेयर बेच देने चाहिए और पुनः प्रवेश नहीं करना चाहिए।
चूँकि ग्राफ इंटरएक्टिव है, आप स्लाइडर का उपयोग करके विज़ुअल का आकार बदल सकते हैं। इस सरल एल्गो ट्रेडिंग दृष्टिकोण के आधार पर, अभी FOX खरीदने का अच्छा समय हो सकता है! 30 दिसंबर, 2016 एक ट्रेडिंग दिन था जब 50 दिन का मूविंग एवरेज 200 दिन के मूविंग एवरेज से $0.01 ऊपर चला गया!
बेशक, याद रखें कि सभी निवेशों का मूल्य घट सकता है। वित्त और एल्गो ट्रेडिंग के बारे में अधिक जानने के लिए, DataCamp के कोर्सेज़ को यहाँ देखें।
हमारा Basic Programming Skills in R ट्यूटोरियल देखें।