제가 구글 클라우드 플랫폼을 어떻게 사용해서 주식에 투자를 시작했는지.

나는 한 친구가 추천한 짧은 강연에 참가한 후 투자에 흥미를 느꼈다.나는 연구를 좀 하고 조엘 그린브라운(Joel Greenblatt)의 저서The Little Book That Still Beats The Market를 읽기 시작하기로 결정했다.이 책에서 나는 Singapore회사의 주식에 투자할지 말지를 결정할 때 이런 공식들이 나에게 유용할 수 있다는 공식을 발견했다.이 게시물은 이 책이나 투자 전략을 홍보하기 위한 것이 아니라 다음과 같은 내용과 내가 어떻게 했는지 보여주기 위한 것이다.
  • 파이톤을 통해Firestore와 상호작용
  • 컴퓨팅 엔진
  • 에서 Python 스크립트를 특정 시간 간격으로 실행
  • 클라우드 함수를 사용하여Firestore
  • 에서 데이터 검색
    먼저 Google 양식에 재무 세부 정보와 Singapore Exchange website 에 나열된 회사의 자체 계산 비율을 채우는 Python 스크립트를 만들었습니다.나는 주식의 최신 가격을 얻기 위해 매일 파이톤 스크립트를 실행해야 하기 때문에 매우 번거롭다는 것을 발견했다.그리고 저는 이 일상적인 절차를 곡가운 플랫폼으로 옮기기로 결정했습니다. 그러면 저는 일상적인 절차를 혼자 할 필요가 없고 구름이 저를 위해 할 수 있습니다. D
    다음은 제가 어떻게 했는지 설명해 드리겠습니다. 비슷한 방식으로 구글 클라우드 플랫폼을 사용하고 싶은 분들을 돕고 싶습니다.

    선결 조건


    계속하기 전에 내가 지적하고자 하는 것은 이 문장을 간단명료하게 하기 위해서는 반드시 아래의 몇 가지를 해야 한다는 것이다.나는 또 네가 공부를 시작하도록 링크를 제공했다.

  • Creating a Google Cloud Platform project
  • Retrieving service account key
  • Creating a Cloud Engine VM Instance
  • Setting Up Firebase Cloud Functions
  • 개술



    위의 그림에서 내가 유일하게 해야 할 일은 클라우드 함수인 HTTP API를 통해 GET 요청을 보내는 것이다. 이것은Firestore에 저장된 계산된 모든 공식과 값을 되돌려준다.기본적으로, 단계 1, 2, 3은 내가 만든 파이톤 스크립트와 관련이 있다.1단계와 2단계는 Requests library만 수행하면 됩니다.

    파이톤을 통한 Firestore 상호 작용


    Firestore는 집합, 문서 및 필드의 개념을 사용하여 저장하고자 하는 데이터를 저장합니다.예를 들어 도서도서관의 유형으로 책꽂이에 있는 책이 있다면Firestore가 보기에 그것은 소장품이다.책 자체가 문서이고 책의 매 페이지는 하나의 독립된 필드이다.문서마다 자신의 집합이 있을 수 있지만, 나는 이 문제를 토론하고 싶지 않다.
    shelf [collection]
    |--book1 [document]
      |-- page1 [field]
      |-- page2 [field]
    |--book2 [document]
      |-- page1 [field]
    
    Python 스크립트를 통해 Cloud Firestore에서 데이터를 상호 작용하고 업데이트하려면 먼저 pip install google-cloud-firestore를 통해 Google Cloud Firestore 라이브러리를 설치해야 합니다.다음은 이전에 검색한 서비스 계정 키를 사용하여Firestore를 초기화하는 코드 세션입니다.
    from google.cloud import firestore
    db = firestore.Client.from_service_account_json('/path/to/service/key')
    
    사실은 그렇다!Firestore에 데이터를 쓰려면 다음과 같이 하십시오.
    doc_ref = db.collection(u'name_of_collection').document(u'name_of_document')
    doc_ref.set(data_to_update)
    
    data_to_update는Firestore 문서에 포함하고자 하는 키와 해당하는 값을 포함하는 Python 사전입니다..set() 문서에서 새 필드를 업데이트하거나 삽입할 수 있습니다.나로서는 회사 이름, 주가, 재무 비율, 그리고 다른 필드를 여기에 두었다.
    문서나 집합이 존재하지 않아도 .set() 함수는 자동으로 집합과 문서를 만들고 앞에서 언급한 필드로 문서를 채웁니다.

    계산 엔진에서 Python 스크립트 실행


    Python 스크립트를 VM 인스턴스로 푸시할 수 있는 몇 가지 방법이 있습니다.내가 어떻게 구글 클라우드 프로젝트에 메모리 라이브러리를 만들어서 거기로 옮겼는지내가 저장소를 만든 이유는 내가 여전히 어떤 형식의 버전 제어를 필요로 하기 때문이다. 왜냐하면 나는 자신을 이해하고 코드에서 다른 방법을 바꾸고 탐색하는 것을 좋아하기 때문에 결국은 나를 곤혹스럽게 한다.비록 이것은 작은 프로젝트이지만, 나는 이것이 나 개인에게 있어서 매우 좋은 실천이라고 생각한다.그런 다음 SSH를 통해 VM 인스턴스에 원격으로 액세스하고 저장소를 복제합니다.
    지금은 파이썬 스크립트의 스케줄링입니다.처음에, 나는 30분마다 파이톤 스크립트를 호출하는 것이 좋은 생각이라고 생각했다.그러나 몇 가지 고려를 통해 저는 시나리오를 오후 6시(GMT+0800)에 운영하는 것이 이상적인 상황이라고 생각합니다. 싱가포르 거래소는 오전 9시에 문을 열고 오후 5시에 문을 닫기 때문에 저는 정말 퇴근 후에 주가를 볼 시간밖에 없습니다.
    파이썬 스크립트를 특정 시간 간격이나 특정 시간에 실행할 계획을 세우려면 나처럼 크론 작업을 사용할 수 있습니다.VM 인스턴스의 SSH 세션에서 crontab -e 명령을 사용하여 사용자의 Crontab을 편집합니다.파일 끝에서 다음 형식으로 당신의 계획에
    # m h  dom mon dow   command
    0 10 * * 1-5 cd /path/to/python/folder && python main.py
    
    위의 코드 세그먼트는 UTC 오전 10시(일명 SGT 오후 6시)에 파이썬 스크립트를 실행합니다. 이것은 하루 중 근무일마다1-5 세그먼트로 표시됩니다.각 간격 후에 스크립트를 실행하려면 다음과 같이 하십시오.
    # Runs the command every hour at the 0th minute
    0 */1 * * * <some command>
    
    # Runs the command at the 0th minute every day
    0 * */1 * * <some command>
    
    참고: Crontab을 VM 인스턴스에서 처음 몇 번 사용할 때 다음 오류가 발생했습니다.
    # Runs the command every minute after every hour
    * */1 * * * <some command>
    
    나의 의도는 시간당 한 번 운행하는 것이다.하지만 나는 크론 작업의 1분 표시0를 놓쳤다.그래서 매 분마다 스크립트를 실행합니다.호출할 때마다 스크립트를 실행하는 데 약 3분이 걸립니다.나는 비교적 긴 운행 시간을 개의치 않는다.하지만 스크립트가 분당 한 번씩 실행되기 때문에 매번 3분이 걸려야 완성할 수 있습니다...너는 계산해 볼 수 있다.어리석은 나는 왜 나의 가상 기기의 실례적인 CPU 사용률이 150-200%에 달하고 있는지 이해하려고 했지만, 나는 심지어 SSH를 통해 그것에 접근할 수 없었다.이것은 재미있는 교훈이다: P

    클라우드 함수를 사용하여Firestore에서 데이터 검색


    이 단계에서, 나는 곡가운 프로젝트를Firebase에 연결한다.내가 이렇게 한 이유는 장래에 가능한 버전을 위해서이다. 나는Firebase Hosting에 사이트를 위탁 관리할 수 있다. 이것은 클라우드Firestore의 데이터를 이용하여 누구나 재무 세부 사항을 한눈에 볼 수 있게 한다.또 다른 이유는 Firebase와 클라우드 기능에 대한 수요를 더 잘 알고 있기 때문이다.
    Express를 설치했습니다.js는 npm install --save express를 통해 나의 클라우드 기능 폴더에 들어간다.급행 열차.js는 Firestore에서 다양한 회사 정보를 검색하기 위해 여러 개의 포트가 필요하기 때문에 웹 API를 쉽게 만들 수 있습니다.
    var  db  =  admin.firestore();
    
    const  express  =  require("express");
    const  app  =  express();
    
    app.get('/:nameOfDocument',( req, res)=>{
        const  nameOfDocument  =  req.params.nameOfDocument;
        var  firestoreRef  =  db.collection("name_of_collection").doc(nameOfDocument);
        res.setHeader('Content-Type', 'application/json');
        firestoreRef.get().then((snapshot) => {
        if (snapshot.exists) {
            var  returnObj  =  snapshot.data();
            return  res.status(200).json(returnObj);
        }
        else {
            return  res.status(422).json({error:"Invalid document name"});
        }
        }).catch(errorObject  => {
            return  res.status(500).json({error:"Internal Server Error"});
        });
    })
    exports.api  =  functions.https.onRequest(app);
    
    다음은 위에서 무슨 일이 일어났는지 한 걸음 한 걸음 설명한다.먼저 Firestore에 대한 액세스는 var db = admin.firestore();로 초기화됩니다.
    app.get('/:nameOfDocument',( req, res)=>{
    ...
    }
    
    위의 내용은 Express에 '/:nameOfDocument' 단점이 있는 GET 요청을 만들고 싶습니다. 이 중 :nameOfDocument 은 URL의 매개 변수입니다.reqres는 각각 발송할 요청과 응답 대상이다.현재res만 사용하고 있지만 앞으로는 더 많아질 것이다.
    const nameOfDocument = req.params.nameOfDocument;
    
    이 행은 URL에서 매개변수를 가져옵니다. 이 예에서는 :nameOfDocument이고 다음 행에서 사용되는 nameOfDocument라는 변수로 저장됩니다.
    var firestoreRef = db.collection("name_of_collection").doc(nameOfDocument);
    
    이 줄은 기본적으로 문서 nameOfDocument 에 대한 인용을 만들었다.집합 이름은 현재 변수가 아닙니다.컬렉션의 이름을 매개변수로 사용할 수도 있습니다. 예를 들면 다음과 같습니다.
    app.get('/:nameOfCollection/:nameOfDocument',( req, res)=>{
        const nameOfDocument = req.params.nameOfDocument;
        const nameOfCollection= req.params.nameOfCollection;
        var firestoreRef = db.collection(nameOfCollection).doc(nameOfDocument);
        ...
    }
    
    이렇게 하면 코드를 수정하지 않고 URL에 지정할 수 있습니다.
    firestoreRef.get().then((snapshot)  =>  {
        if  (snapshot.exists)  {  
        var returnObj = snapshot.data();  
        return res.status(200).json(returnObj);  
        }
        ...
    }
    
    상술한 단락은 앞에서 언급한 인용을 채택하여 그것이 존재하는지 검사한다.이것은 매우 중요하다. 사용자가 의외로 잘못된 문서나 집합 이름을 입력할 수 있기 때문에, 우리는 상응하는 응답을 되돌려 주기를 바란다.snapshot.data() 모든 필드 키 값 쌍을 검색하여 returnObj라는 대상에 넣고 상태 코드 200의 JSON 대상으로 되돌려줍니다.
    exports.api  =  functions.https.onRequest(app);
    
    이 줄은 클라우드 함수에 <cloudfunctions.net url>/api에 요청을 할 때 app라는 익스프레스 대상에게 요청을 전달하고 app 대상 자체에 지정된 단점에 따라 처리해야 한다고 알려준다.
    이렇게!이제 Firebase Cloud Functions 페이지에서 제공하는 링크를 통해 클라우드 함수를 호출할 수 있습니다. 이 링크는Firestore에서 처리하고자 하는 데이터를 검색합니다.
    그리고 이것은 저의 첫 번째 강좌/개인 체험 댓글입니다.개선할 수 있는 것이 무엇인지, 그리고 내가 어떻게 더 좋은 프로그래머가 될 수 있는지 알려주세요.모든 건설적인 피드백을 환영합니다.내 게시물을 읽어주셔서 감사합니다!:D

    좋은 웹페이지 즐겨찾기