This commit is contained in:
dsyoon
2022-12-31 13:53:15 +09:00
parent 31d967faa2
commit 6135f45587
3 changed files with 58 additions and 7 deletions

View File

@@ -23,6 +23,7 @@ from stock.analysis.BolingerBand import BolingerBand
from stock.analysis.IchimokuCloud import IchimokuCloud
from stock.analysis.RSI import RSI
from stock.analysis.MACD import MACD
from stock.analysis.Envelope import Envelope
from stock.crawler.MovingAverage import MovingAverage
class AnalyzerSqlite:
@@ -33,6 +34,7 @@ class AnalyzerSqlite:
ichimokuCloud = None
rsi = None
macd = None
envelope = None
topCompany = None
fnguide = None
@@ -54,6 +56,7 @@ class AnalyzerSqlite:
self.ichimokuCloud = IchimokuCloud()
self.rsi = RSI()
self.macd = MACD()
self.envelope = Envelope()
self.topCompany = self.getTopCompany(stockFileName, 2000)
self.fnguide = self.readFnguide(stockFileName)
@@ -740,7 +743,7 @@ class AnalyzerSqlite:
stockAnalysisTableName = 'stock_analysis_' + type
# 테이블 생성
cursor.execute("CREATE TABLE IF NOT EXISTS " + stockAnalysisTableName + " (CODE text, NAME text, ymd text, close REAL, diff REAL, open REAL, high REAL, low REAL, volume REAL, avg3 REAL, avg4 REAL, avg5 REAL, avg6 REAL, avg10 REAL, avg12 REAL, avg20 REAL, avg36 REAL, avg40 REAL, avg48 REAL, avg60 REAL, avg120 REAL, avg200 REAL, avg240 REAL, avg300 REAL, disparity_avg5 REAL, disparity_avg10 REAL, disparity_avg20 REAL, disparity_avg60 REAL, disparity_avg120, bolingerband_upper REAL, bolingerband_lower REAL, bolingerband_middle REAL, ichimokucloud_changeLine REAL, ichimokucloud_baseLine REAL, ichimokucloud_leadingSpan1 REAL, ichimokucloud_leadingSpan2 REAL, stochastic_fast_k REAL, stochastic_slow_k REAL, stochastic_slow_d REAL, rsi REAL, rsis REAL, macd REAL, macds REAL, macdo REAL)")
cursor.execute("CREATE TABLE IF NOT EXISTS " + stockAnalysisTableName + " (CODE text, NAME text, ymd text, close REAL, diff REAL, open REAL, high REAL, low REAL, volume REAL, avg3 REAL, avg4 REAL, avg5 REAL, avg6 REAL, avg10 REAL, avg12 REAL, avg20 REAL, avg36 REAL, avg40 REAL, avg48 REAL, avg60 REAL, avg120 REAL, avg200 REAL, avg240 REAL, avg300 REAL, disparity_avg5 REAL, disparity_avg10 REAL, disparity_avg20 REAL, disparity_avg60 REAL, disparity_avg120, bolingerband_upper REAL, bolingerband_lower REAL, bolingerband_middle REAL, envelope_upper REAL, envelope_lower REAL, envelope_middle REAL, ichimokucloud_changeLine REAL, ichimokucloud_baseLine REAL, ichimokucloud_leadingSpan1 REAL, ichimokucloud_leadingSpan2 REAL, stochastic_fast_k REAL, stochastic_slow_k REAL, stochastic_slow_d REAL, rsi REAL, rsis REAL, macd REAL, macds REAL, macdo REAL)")
# 키 생성
create_key = "CREATE INDEX IF NOT EXISTS " + stockAnalysisTableName + "_idx on " + stockAnalysisTableName + " (CODE, ymd) "
@@ -756,6 +759,7 @@ class AnalyzerSqlite:
self.ichimokuCloud.analyze(stock)
self.stochastic.analyze(stock)
self.bolingerBand.analyze(stock)
self.envelope.analyze(stock)
self.rsi.analyze(stock)
self.macd.analyze(stock)
@@ -768,16 +772,18 @@ class AnalyzerSqlite:
sql += " avg3, avg4, avg5, avg6, avg10, avg12, avg20, avg36, avg40, avg48, avg60, avg120, avg200, avg240, avg300, "
sql += " disparity_avg5, disparity_avg10, disparity_avg20, disparity_avg60, disparity_avg120, "
sql += " bolingerband_upper, bolingerband_lower, bolingerband_middle, "
sql += " envelope_upper, envelope_lower, envelope_middle, "
sql += " ichimokucloud_changeLine, ichimokucloud_baseLine, ichimokucloud_leadingSpan1, ichimokucloud_leadingSpan2, "
sql += " stochastic_fast_k, stochastic_slow_k, stochastic_slow_d, "
sql += " rsi, rsis, macd, macds, macdo) "
sql += " VALUES(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)"
sql += " VALUES(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)"
cursor.execute(sql, (
stock["CODE"], stock["NAME"], price['ymd'], price['close'], price['diff'], price['open'], price['high'], price['low'], price['volume'],
price['avg3'], price['avg4'], price['avg5'], price['avg6'], price['avg10'], price['avg12'], price['avg20'], price['avg36'], price['avg40'], price['avg48'], price['avg60'], price['avg120'], price['avg200'], price['avg240'], price['avg300'],
price['disparity_avg5'], price['disparity_avg10'], price['disparity_avg20'], price['disparity_avg60'], price['disparity_avg120'],
price['bolingerband_upper'], price['bolingerband_lower'], price['bolingerband_middle'],
price['envelope_upper'], price['envelope_lower'], price['envelope_middle'],
price['ichimokucloud_changeLine'], price['ichimokucloud_baseLine'], price['ichimokucloud_leadingSpan1'],
price['ichimokucloud_leadingSpan2'],
price['stochastic_fast_k'], price['stochastic_slow_k'], price['stochastic_slow_d'],
@@ -788,6 +794,7 @@ class AnalyzerSqlite:
sql += " avg3=?, avg4=?, avg5=?, avg6=?, avg10=?, avg12=?, avg20=?, avg36=?, avg40=?, avg48=?, avg60=?, avg120=?, avg200=?, avg240=?, avg300=?, "
sql += " disparity_avg5=?, disparity_avg10=?, disparity_avg20=?, disparity_avg60=?, disparity_avg120=?, "
sql += " bolingerband_upper=?, bolingerband_lower=?, bolingerband_middle=?, "
sql += " enveolope_upper=?, enveolope_lower=?, enveolope_middle=?, "
sql += " ichimokucloud_changeLine=?, ichimokucloud_baseLine=?, ichimokucloud_leadingSpan1=?, ichimokucloud_leadingSpan2=?, "
sql += " stochastic_fast_k=?, stochastic_slow_k=?, stochastic_slow_d=?, "
sql += " rsi=?, rsis=?, "
@@ -798,8 +805,9 @@ class AnalyzerSqlite:
(price['close'], price['diff'], price['open'], price['high'], price['low'], price['volume'],
price['avg3'], price['avg4'], price['avg5'], price['avg6'], price['avg10'], price['avg12'], price['avg20'], price['avg36'], price['avg40'], price['avg48'], price['avg60'], price['avg120'], price['avg200'], price['avg240'], price['avg300'],
price['disparity_avg5'], price['disparity_avg10'], price['disparity_avg20'], price['disparity_avg60'], price['disparity_avg120'],
price['bolingerband_upper'], price['bolingerband_lower'], price['bolingerband_middle'], price['ichimokucloud_changeLine'], price['ichimokucloud_baseLine'],
price['ichimokucloud_leadingSpan1'], price['ichimokucloud_leadingSpan2'],
price['bolingerband_upper'], price['bolingerband_lower'], price['bolingerband_middle'],
price['envelope_upper'], price['envelope_lower'], price['envelope_middle'],
price['ichimokucloud_changeLine'], price['ichimokucloud_baseLine'], price['ichimokucloud_leadingSpan1'], price['ichimokucloud_leadingSpan2'],
price['stochastic_fast_k'], price['stochastic_slow_k'], price['stochastic_slow_d'],
price['rsi'], price['rsis'],
price['macd'], price['macds'], price['macdo'],
@@ -862,6 +870,9 @@ class AnalyzerSqlite:
"bolingerband_upper": -1,
"bolingerband_lower": -1,
"bolingerband_middle": -1,
"envelope_upper": -1,
"envelope_lower": -1,
"envelope_middle": -1,
"ichimokucloud_changeLine": -1,
"ichimokucloud_baseLine": -1,
"ichimokucloud_leadingSpan1": -1,
@@ -938,6 +949,9 @@ class AnalyzerSqlite:
"bolingerband_upper": -1,
"bolingerband_lower": -1,
"bolingerband_middle": -1,
"envelope_upper": -1,
"envelope_lower": -1,
"envelope_middle": -1,
"ichimokucloud_changeLine": -1,
"ichimokucloud_baseLine": -1,
"ichimokucloud_leadingSpan1": -1,
@@ -989,9 +1003,9 @@ if __name__ == "__main__":
stockFileName = PROJECT_HOME + '/resources/stock.db'
analyzer = AnalyzerSqlite(PROJECT_HOME, stockFileName)
#analyzer.analyzeDaily()
#analyzer.analyzeGrouping("weekly")
#analyzer.analyzeGrouping("monthly")
analyzer.analyzeDaily()
analyzer.analyzeGrouping("weekly")
analyzer.analyzeGrouping("monthly")
# HTML 출력
outPath = os.path.join(PROJECT_HOME, "resources", "analysis")

View File

@@ -0,0 +1,36 @@
import pandas as pd
from stock.analysis.Common import Common
import finterstellar as fs
class Envelope:
common = None
def __init__(self):
self.common = Common()
return
# c=9, b=26, l=52
def apply(self, df, w=13, s=0.08):
# 입력받은 값이 dataframe이라는 것을 정의해줌
df = pd.DataFrame(df["close"])
fs.envelope(df, w=w, spread=s)
return df.fillna(df["close"][0])
# 일목균형표의 구성을 훑어보면 주가를 선행과 후행으로 과거의 주가를 통해 미래 혹은 현재의 주식의 가격의 추세를 예측해보려는 지표라는 것을 이해할 수 있다.
# 또한 구름층의 색을 통해서 주식의 추세를 손쉽게 확인할 수 있을 것 같다는 것도 이해할 수 있다면 끝 !
def analyze(self, stock):
df = pd.DataFrame()
df = df.from_dict(stock['PRICE'])
df = self.apply(df)
for i in range(len(df.close)):
stock['PRICE'][i]['envelope_upper'] = df.ub.values[i]
stock['PRICE'][i]['envelope_middle'] = df.center.values[i]
stock['PRICE'][i]['envelope_lower'] = df.lb.values[i]
return