from chalicelib.analysis.StockAnalysis import StockAnalysis
import pandas as pd
class MeanVarSMA(StockAnalysis):
def __init__(self):
super().__init__("mean_var_sma")
def analyze_method(self, _df: pd.DataFrame) -> float:
self.logger.info(f"start analyzing by {self}")
_df = _df.reset_index(drop=True)
_df['sma5'] = _df['close'].rolling(5).mean()
_df = _df.tail(5)
_df['diff'] = _df.apply(lambda x: x['close'] - x['sma5'], axis=1)
mean = _df['diff'].mean()
var = _df['diff'].var()
return mean / var
from chalicelib.analysis.StockAnalysis import StockAnalysis
import numpy as np
class MacdCubicFunction(StockAnalysis):
# 分析に利用する日数
DAYS_TO_ANALYSIS = 20
# 分析に利用する日数
DAYS_UNDER_ZERO = 7
def __init__(self):
super().__init__("macd_cubic_function")
def analyze_method(self, _df) -> float:
"""
macdを基準として売り買いの目安を評価値で返す。
値が大きければ買いの傾向が高いことを表している。
値が小さければ売りの傾向が高いことを表している。
:param _df:
:return:
"""
self.logger.info(f"start analyzing by {self}")
_df = _df.reset_index(drop=True)
# histogramが図として表現されるMACDの値
_df = _df.assign(
# MACDの計算
ema_12=lambda x: x['close'].ewm(span=12).mean(),
ema_26=lambda x: x['close'].ewm(span=26).mean(),
macd=lambda x: x['ema_12'] - x['ema_26'],
signal=lambda x: x['macd'].ewm(span=9).mean(),
# ヒストグラム値
histogram=lambda x: x['macd'] - x['signal'],
)
# 3次関数に近似する(近似区間は直近の20日)
f_x = np.linspace(-10, 10, self.DAYS_TO_ANALYSIS)
y = _df['histogram'].tail(self.DAYS_TO_ANALYSIS)
res3 = np.polyfit(f_x, y, 3)
# 3次関数に近似した値を取得
y3 = np.poly1d(res3)(f_x)
# 階差を取得
diff_1st = np.diff(y3)
diff_2nd = np.diff(diff_1st)
# 評価値の算出
e_val = (diff_2nd[-1] - diff_2nd[0]) * np.var(diff_2nd) * np.var(diff_1st)
if abs(e_val) < 0.01:
e_val = 0
return e_val
@staticmethod
def sigmoid(x) -> float:
# pandasでcsvとして出力した際に、小さすぎる値の場合はeを用いた値で表示されて
# pandasで読み込むことができないため。
val = 1 / (1 + math.exp(-x))
return val if val > 0.001 else 0