import os import re import sys import shutil import time import sqlite3 from datetime import datetime from dateutil.relativedelta import relativedelta from stock.crawler.FnGuideCrawler import FnGuideCrawler from stock.crawler.MetaCrawler import MetaCrawler from stock.crawler.StockCrawler import StockCrawler from stock.analysis.AnalyzerSqlite import AnalyzerSqlite from stock.analysis.StockStatus import StockStatus from stock.util.SlackBot import SlackBot today = datetime.now().strftime("%Y-%m-%d") # DB Browser for SQLite: http://hleecaster.com/python-sqlite3/ if len(sys.argv) == 2: PROJECT_HOME = sys.argv[1] else: PROJECT_HOME = os.getcwd() START_DATE = "2000.01.01" start = time.time() RESOURCE_PATH = os.path.join(PROJECT_HOME, 'resources') stockFileName = os.path.join(RESOURCE_PATH, 'stock.db') week = datetime.today().weekday() slackBot = SlackBot() error_count = 0 if week in (0, 1, 2, 3, 4): # 0:월, 1:화, 2:수, 3:목, 4:금, 5:토, 6:일 slackBot.sendMsg("1. start to crawl...") # 재무제표는 3개월마다 다운로드를 한다. fnGuideCrawler = FnGuideCrawler(START_DATE) print("[KOSPI 상장기업 재무제표 다운로드]") fnGuideCrawler.crawl_fnguide(stockFileName) metaCrawler = MetaCrawler(START_DATE) print("\n[증시자금동향 (신용잔고, 펀드자금 잔고)]") metaCrawler.crawl_money_trend(stockFileName) slackBot.sendMsg("2. done meta data...") print("\n[국내 시장금리]") metaCrawler.crawl_interest_rates(stockFileName) slackBot.sendMsg("3. done interest rates...") print("\n[투자자별 매매동향(Trading_Trend)]") metaCrawler.crawl_trading_trend(stockFileName) slackBot.sendMsg("4. done trade trend...") print("\n[환율 (USD, JPY, EUR, CNY)]") metaCrawler.crawl_exchange(stockFileName) slackBot.sendMsg("5. done exchange data...") print("\n[원유 (WTI), 국제금, COPPER, NATURALGAS, CORN, SOYBEAN]") metaCrawler.crawl_meterials(stockFileName) slackBot.sendMsg("6. done additional data...") print("\n[종목 다운로드]") stockCrawler = StockCrawler(START_DATE) stockCrawler.crawl_etf_stocks(stockFileName) slackBot.sendMsg("7. done etf stocks...") stockCrawler.crawl_stocks(stockFileName) slackBot.sendMsg("8. done stocks...") stockCrawler.crawl_special_stocks(stockFileName) slackBot.sendMsg("9. done US stocks...") print("\n[종목 분석]") # S: 분석까지 진행 inFileName = PROJECT_HOME + '/resources/stock.db' analyzerSqlite = AnalyzerSqlite(stockFileName) #stockStatus = StockStatus(RESOURCE_PATH) analyzerSqlite.analyzeDaily() analyzerSqlite.analyzeGrouping("weekly") analyzerSqlite.analyzeGrouping("monthly") print("\n[종목 결정]") # HTML 출력 outPath = os.path.join(PROJECT_HOME, "resources", "analysis") if not os.path.isdir(outPath): os.mkdir(outPath) day = datetime.today().strftime("%Y%m%d") before_7_day = datetime.today() + relativedelta(days=-7) dayList = os.listdir(outPath) for dayDir in dayList: if dayDir[0] != '.' and dayDir < before_7_day.strftime("%Y%m%d"): if os.path.exists(os.path.join(outPath, dayDir)): shutil.rmtree(os.path.join(outPath, dayDir)) outPath = os.path.join(outPath, day) if os.path.isdir(outPath): shutil.rmtree(outPath) os.mkdir(outPath) analyzerSqlite.findCandidates(outPath) #stockStatus.findCandidates(outPath) slackBot.sendMsg("10. done decision...") print("time : %6.2f 초", (time.time() - start)) print ("done...")