终於把资料取得都结束了,现在要制作模组化是讯号灯的部分。
本日程序码使用:fin_signal.py
将会改写:
fin_signal
,并且设定好__init__
,其中预设值是把三个dataframe
资料集设为None
。class fin_signal:
def __init__(self):
self.df_taiex = None
self.df_legal = None
self.df_stock = None
取得近一年的加权指数、三大法人期选交易状况、股价等等资料,并且放在self
底下:
def _get_db_data(self):
# 建立与MySQL的连线
my_connt_obj = db_connect.mysql_connect()
conn = my_connt_obj.connect()
# 半年前的日期
date_year = datetime.today() - relativedelta(year=1)
date_year = f"{date_year.year}-{date_year.month}-{date_year.date}"
# 加权指数资料
sql_script = (
f"SELECT * FROM StockTransactionInfo WHERE TradeDate > '{date_year}'"
)
self.df_taiex = pandas.read_sql(sql_script, con=conn)
# 取得三大法人期选的资料
sql_script = (
f"SELECT * FROM LegalDailyFutureOption WHERE TradeDate > '{date_year}'"
)
self.df_legal = pandas.read_sql(sql_script, con=conn)
# 取得股价资讯
sql_script = f"SELECT * FROM DailyPrice WHERE TradeDate > '{date_year}'"
self.df_stock = pandas.read_sql(sql_script, con=conn)
# 关闭连线
conn.close()
因讯号灯的程序码众多,直接去Github上面观看。
建立以下两个讯号灯:
外资部分为:
自营商部分为:
投信部分为:
移动平均线的穿过,也没有很难写,就直接把之前的带入,基本上就完成了。
def _get_signal_7(self) -> int:
"""signal_7: 5MA > 20MA
近期5日平均比20日还要高
Retrun:
bool: True:高;False:低
"""
# 取得台积电资料,代号:2330
df_2330 = self.df_stock.loc[self.df_stock["Symbol"] == "2330"]
# 制作5日移动平均数
close_price_5 = df_2330["ClosePrice"].rolling(5, min_periods=1).mean()
# 制作20日移动平均数
close_price_20 = df_2330["ClosePrice"].rolling(20, min_periods=1).mean()
r = True if close_price_5.iloc[-1] > close_price_20.iloc[-1] else False
return r
在这边使用get_signal
,里面把所有的讯号灯function加入,变成一个tuple,之後根据所要呈现的方式拆分此tuple即可。这边就先不多着墨如何呈现。
def get_signal(self) -> tuple:
r = (
self._get_signal_1(),
self._get_signal_2(),
self._get_signal_3_1(),
self._get_signal_3_2(),
self._get_signal_3_3(),
self._get_signal_4_1(),
self._get_signal_4_2(),
self._get_signal_4_3(),
self._get_signal_5_1(),
self._get_signal_5_2(),
self._get_signal_5_3(),
self._get_signal_6_1(),
self._get_signal_6_2(),
self._get_signal_6_3(),
self._get_signal_7(),
)
return r
执行下列的程序码:
signal = fin_signal()
signal._get_db_data()
signal.show_data()
r = signal.get_signal()
print(r)
可以看得到结果是:
(True, True, False, True, False, False, True, False, -11118, 2341, -2205, 0.04248570817156308, 0.07184728232513887, 1.3602714373843308, True)
讯号灯看起来不怎麽好读,这就需要之後的优化,但我们已经取得所有的讯号灯。当以後需要别的讯号灯的话,直接新增判别讯号灯的功能并且在get_signal
登记,就可以调用罗~
<<: [day-14] 认识Python的资料结构!(Part .1)
>>: Chapter4 - Canvas背景动画(III)风中的花朵 今天再加码让动画更加自然的方法
(这个标题有点耸动跟钓鱼,但不知道为什麽我就是很想用它,在文章开头先讲明。) 即使已经证实了苹果在i...
时间回到几年前,第一次面试一份资安公司行政助理职 记得那天除了该有的面试考题之外, 主管走到白板前说...
在第六天开始前,先祝各位朋朋中秋节快乐! 在写程序时,时常必须根据不同的状况做出不同的对应机制,而处...
说到Go最精华的部分就是concurrency的部分了 包含的范围蛮广的,当初在看的时候也是看得满头...
如同前面介绍的,Flutter 定义了三种不同型别的Platform Channel 在platfo...