chore: import upstream snapshot with attribution
This commit is contained in:
@@ -0,0 +1,4 @@
|
||||
## 说明
|
||||
|
||||
|
||||
之前测试使用的脚本。执行了一段时间,只是用来进行练习使用的。
|
||||
@@ -0,0 +1,126 @@
|
||||
#!/usr/local/bin/python3
|
||||
# -*- coding: utf-8 -*-
|
||||
|
||||
|
||||
import libs.common as common
|
||||
import pandas as pd
|
||||
import numpy as np
|
||||
import math
|
||||
import datetime
|
||||
import heapq
|
||||
|
||||
|
||||
### 对每日指标数据,进行筛选。将符合条件的。二次筛选出来。
|
||||
def stat_all_lite(tmp_datetime):
|
||||
# 要操作的数据库表名称。
|
||||
table_name = "guess_indicators_lite_buy_daily"
|
||||
datetime_str = (tmp_datetime).strftime("%Y-%m-%d")
|
||||
datetime_int = (tmp_datetime).strftime("%Y%m%d")
|
||||
print("datetime_str:", datetime_str)
|
||||
print("datetime_int:", datetime_int)
|
||||
|
||||
# try:
|
||||
# # 删除老数据。guess_indicators_lite_buy_daily 是一张单表,没有日期字段。
|
||||
# del_sql = " DELETE FROM `stock_data`.`%s` WHERE `date`= '%s' " % (table_name, datetime_int)
|
||||
# print("del_sql:", del_sql)
|
||||
# common.insert(del_sql)
|
||||
# print("del_sql")
|
||||
# except Exception as e:
|
||||
# print("error :", e)
|
||||
|
||||
sql_1 = """
|
||||
SELECT `date`, `code`, `name`, `changepercent`, `trade`,`turnoverratio`, `pb` ,`kdjj`,`rsi_6`,`cci`
|
||||
FROM stock_data.guess_indicators_lite_daily WHERE `date` = %s
|
||||
and `changepercent` > 2 and `pb` > 0
|
||||
"""
|
||||
# and `changepercent` > 2 and `pb` > 0 and `turnoverratio` > 5 去除掉换手率参数。
|
||||
data = pd.read_sql(sql=sql_1, con=common.engine(), params=[datetime_int])
|
||||
data = data.drop_duplicates(subset="code", keep="last")
|
||||
print("######## len data ########:", len(data))
|
||||
# del data["name"]
|
||||
# print(data)
|
||||
data["trade_float32"] = data["trade"].astype('float32', copy=True)
|
||||
# 输入 date 用作历史数据查询。
|
||||
stock_merge = pd.DataFrame({
|
||||
"date": data["date"], "code": data["code"], "wave_mean": data["trade"],
|
||||
"wave_crest": data["trade"], "wave_base": data["trade"]}, index=data.index.values)
|
||||
print(stock_merge.head(1))
|
||||
|
||||
stock_merge = stock_merge.apply(apply_merge, axis=1) # , axis=1)
|
||||
del stock_merge["date"] # 合并前删除 date 字段。
|
||||
# 合并数据
|
||||
data_new = pd.merge(data, stock_merge, on=['code'], how='left')
|
||||
|
||||
# 使用 trade_float32 参加计算。
|
||||
data_new = data_new[data_new["trade_float32"] > data_new["wave_base"]] # 交易价格大于波谷价格。
|
||||
data_new = data_new[data_new["trade_float32"] < data_new["wave_crest"]] # 小于波峰价格
|
||||
|
||||
# wave_base wave_crest wave_mean
|
||||
data_new["wave_base"] = data_new["wave_base"].round(2) # 数据保留2位小数
|
||||
data_new["wave_crest"] = data_new["wave_crest"].round(2) # 数据保留2位小数
|
||||
data_new["wave_mean"] = data_new["wave_mean"].round(2) # 数据保留2位小数
|
||||
|
||||
data_new["up_rate"] = (data_new["wave_mean"].sub(data_new["trade_float32"])).div(data_new["wave_crest"]).mul(100)
|
||||
data_new["up_rate"] = data_new["up_rate"].round(2) # 数据保留2位小数
|
||||
|
||||
data_new["buy"] = 1
|
||||
data_new["sell"] = 0
|
||||
data_new["today_trade"] = data_new["trade"]
|
||||
data_new["income"] = 0
|
||||
# 重命名 date
|
||||
data_new.columns.values[0] = "buy_date"
|
||||
del data_new["trade_float32"]
|
||||
|
||||
try:
|
||||
common.insert_db(data_new, table_name, False, "`code`")
|
||||
print("insert_db")
|
||||
except Exception as e:
|
||||
print("error :", e)
|
||||
# 重命名
|
||||
del data_new["name"]
|
||||
print(data_new)
|
||||
|
||||
|
||||
def apply_merge(tmp):
|
||||
date = tmp["date"]
|
||||
code = tmp["code"]
|
||||
date_end = datetime.datetime.strptime(date, "%Y%m%d")
|
||||
date_start = (date_end + datetime.timedelta(days=-300)).strftime("%Y-%m-%d")
|
||||
date_end = date_end.strftime("%Y-%m-%d")
|
||||
print(code, date_start, date_end)
|
||||
|
||||
# open, high, close, low, volume, price_change, p_change, ma5, ma10, ma20, v_ma5, v_ma10, v_ma20, turnover
|
||||
# 使用缓存方法。加快计算速度。
|
||||
stock = common.get_hist_data_cache(code, date_start, date_end)
|
||||
# 增加空判断,如果是空返回 0 数据。
|
||||
if stock is None:
|
||||
return list([code, date, 0, 0, 0])
|
||||
|
||||
stock = pd.DataFrame({"close": stock["close"]}, index=stock.index.values)
|
||||
stock = stock.sort_index(0) # 将数据按照日期排序下。
|
||||
|
||||
# print(stock.head(10))
|
||||
arr = pd.Series(stock["close"].values)
|
||||
# print(df_arr)
|
||||
wave_mean = arr.mean()
|
||||
max_point = 3 # 获得最高的几个采样点。
|
||||
# 计算股票的波峰值。
|
||||
wave_crest = heapq.nlargest(max_point, enumerate(arr), key=lambda x: x[1])
|
||||
wave_crest_mean = pd.DataFrame(wave_crest).mean()
|
||||
|
||||
# 输出元祖第一个元素是index,第二元素是比较的数值 计算数据的波谷值
|
||||
wave_base = heapq.nsmallest(max_point, enumerate(arr), key=lambda x: x[1])
|
||||
wave_base_mean = pd.DataFrame(wave_base).mean()
|
||||
# 输出数据
|
||||
print("##############", len(stock))
|
||||
if len(stock) > 180:
|
||||
# code date wave_base wave_crest wave_mean 顺序必须一致。返回的是行数据,然后填充。
|
||||
return list([code, date, wave_base_mean[1], wave_crest_mean[1], wave_mean])
|
||||
else:
|
||||
return list([code, date, 0, 0, 0])
|
||||
|
||||
|
||||
# main函数入口
|
||||
if __name__ == '__main__':
|
||||
# 二次筛选数据。
|
||||
tmp_datetime = common.run_with_args(stat_all_lite)
|
||||
@@ -0,0 +1,137 @@
|
||||
#!/usr/local/bin/python3
|
||||
# -*- coding: utf-8 -*-
|
||||
|
||||
|
||||
import libs.common as common
|
||||
import pandas as pd
|
||||
import numpy as np
|
||||
import math
|
||||
import datetime
|
||||
import heapq
|
||||
import stockstats
|
||||
|
||||
|
||||
# code date today_trade
|
||||
def apply_merge(tmp):
|
||||
date = tmp["date"]
|
||||
code = tmp["code"]
|
||||
date_end = datetime.datetime.strptime(date, "%Y%m%d")
|
||||
date_start = (date_end + datetime.timedelta(days=-300)).strftime("%Y-%m-%d")
|
||||
date_end = date_end.strftime("%Y-%m-%d")
|
||||
print(code, date_start, date_end)
|
||||
|
||||
# open, high, close, low, volume, price_change, p_change, ma5, ma10, ma20, v_ma5, v_ma10, v_ma20, turnover
|
||||
# 使用缓存方法。加快计算速度。
|
||||
stock = common.get_hist_data_cache(code, date_start, date_end)
|
||||
# 增加空判断,如果是空返回 0 数据。
|
||||
if stock is None:
|
||||
return list([code, date, 0.0])
|
||||
print("########")
|
||||
# print(stock.tail(1))
|
||||
close = stock.tail(1)["close"].values[0]
|
||||
print("close: ", close)
|
||||
print("########")
|
||||
return list([code, date, close])
|
||||
|
||||
|
||||
# buy code date sell sell_cci sell_kdjj sell_rsi_6
|
||||
def apply_merge_sell(tmp):
|
||||
date = tmp["date"]
|
||||
code = tmp["code"]
|
||||
date_end = datetime.datetime.strptime(date, "%Y%m%d")
|
||||
date_start = (date_end + datetime.timedelta(days=-300)).strftime("%Y-%m-%d")
|
||||
date_end = date_end.strftime("%Y-%m-%d")
|
||||
print(code, date_start, date_end)
|
||||
|
||||
# open, high, close, low, volume, price_change, p_change, ma5, ma10, ma20, v_ma5, v_ma10, v_ma20, turnover
|
||||
# 使用缓存方法。加快计算速度。
|
||||
stock = common.get_hist_data_cache(code, date_start, date_end)
|
||||
# 增加空判断,如果是空返回 0 数据。
|
||||
if stock is None:
|
||||
return list([1, code, date, 0, 0, 0, 0])
|
||||
print("########")
|
||||
# J大于100时为超买,小于10时为超卖。
|
||||
# 强弱指标保持高于50表示为强势市场,反之低于50表示为弱势市场。
|
||||
# 1、当CCI指标从下向上突破﹢100线而进入非常态区间时,表明股价脱离常态而进入异常波动阶段,
|
||||
# 2、当CCI指标从上向下突破﹣100线而进入另一个非常态区间时,表明股价的盘整阶段已经结束,
|
||||
stockStat = stockstats.StockDataFrame.retype(stock)
|
||||
kdjj = int(stockStat["kdjj"].tail(1).values[0])
|
||||
rsi_6 = int(stockStat["rsi_6"].tail(1).values[0])
|
||||
cci = int(stockStat["cci"].tail(1).values[0])
|
||||
print("kdjj:", kdjj, "rsi_6:", rsi_6, "cci:", cci)
|
||||
# and kdjj > 80 and rsi_6 > 55 and cci > 100 判断卖出时刻。也就是买入时刻的反面。发现有波动就卖了。
|
||||
# if kdjj <= 10 and rsi_6 <= 50 and cci <= 100: old
|
||||
if kdjj <= 80 or rsi_6 <= 55 or cci <= 100:
|
||||
return list([0, code, date, 1, cci, kdjj, rsi_6])
|
||||
else:
|
||||
return list([1, code, date, 0, cci, kdjj, rsi_6])
|
||||
|
||||
|
||||
# 增加 收益计算。
|
||||
def stat_index_calculate(tmp_datetime):
|
||||
# 要操作的数据库表名称。
|
||||
table_name = "guess_indicators_lite_sell_daily"
|
||||
datetime_str = (tmp_datetime).strftime("%Y-%m-%d")
|
||||
datetime_int = (tmp_datetime).strftime("%Y%m%d")
|
||||
print("datetime_str:", datetime_str)
|
||||
print("datetime_int:", datetime_int)
|
||||
|
||||
sql_1 = """
|
||||
SELECT `buy_date`, `code`, `name`, `changepercent`, `trade`, `turnoverratio`, `pb`, `kdjj`, `rsi_6`,
|
||||
`cci`, `wave_base`, `wave_crest`, `wave_mean`, `up_rate`
|
||||
FROM guess_indicators_lite_buy_daily where `buy_date` <= """ + datetime_int
|
||||
print(sql_1)
|
||||
data = pd.read_sql(sql=sql_1, con=common.engine(), params=[])
|
||||
data = data.drop_duplicates(subset="code", keep="last")
|
||||
print(data["trade"])
|
||||
data["trade_float32"] = data["trade"].astype('float32', copy=False)
|
||||
print(len(data))
|
||||
data["date"] = datetime_int
|
||||
|
||||
stock_merge = pd.DataFrame({
|
||||
"date": data["date"], "code": data["code"], "today_trade": data["trade"]}, index=data.index.values)
|
||||
print(stock_merge.head(1))
|
||||
|
||||
stock_merge = stock_merge.apply(apply_merge, axis=1) # , axis=1)
|
||||
|
||||
del stock_merge["date"] # 合并前删除 date 字段。
|
||||
# 合并数据
|
||||
data_new = pd.merge(data, stock_merge, on=['code'], how='left')
|
||||
data_new["income"] = (data_new["today_trade"] - data_new["trade_float32"]) * 100
|
||||
data_new["income"] = data_new["income"].round(4) # 保留4位小数。
|
||||
|
||||
# 增加售出列。看看是否需要卖出。
|
||||
stock_sell_merge = pd.DataFrame({
|
||||
"date": data["date"], "code": data["code"], "sell": 0, "buy": 0, "sell_kdjj": 0, "sell_rsi_6": 0,
|
||||
"sell_cci": 0},
|
||||
index=data.index.values)
|
||||
print(stock_sell_merge.head(1))
|
||||
|
||||
merge_sell_data = stock_sell_merge.apply(apply_merge_sell, axis=1) # , axis=1)
|
||||
# 重命名
|
||||
del merge_sell_data["date"] # 合并前删除 date 字段。
|
||||
# 合并数据
|
||||
data_new = pd.merge(data_new, merge_sell_data, on=['code'], how='left')
|
||||
|
||||
# 删除老数据。
|
||||
try:
|
||||
del_sql = " DELETE FROM `stock_data`.`" + table_name + "` WHERE `date`= '%s' " % datetime_int
|
||||
common.insert(del_sql)
|
||||
print("insert_db")
|
||||
except Exception as e:
|
||||
print("error :", e)
|
||||
del data_new["trade_float32"]
|
||||
try:
|
||||
common.insert_db(data_new, table_name, False, "`date`,`code`")
|
||||
print("insert_db")
|
||||
except Exception as e:
|
||||
print("error :", e)
|
||||
# 重命名
|
||||
del data_new["name"]
|
||||
print(data_new)
|
||||
|
||||
|
||||
# main函数入口
|
||||
if __name__ == '__main__':
|
||||
# 计算买卖。
|
||||
tmp_datetime = common.run_with_args(stat_index_calculate)
|
||||
@@ -0,0 +1,119 @@
|
||||
#!/usr/local/bin/python3
|
||||
# -*- coding: utf-8 -*-
|
||||
|
||||
|
||||
import libs.common as common
|
||||
import sys
|
||||
import time
|
||||
import pandas as pd
|
||||
import tushare as ts
|
||||
from sqlalchemy.types import NVARCHAR
|
||||
from sqlalchemy import inspect
|
||||
import datetime
|
||||
import heapq
|
||||
|
||||
"""
|
||||
SELECT `date`, `code`, `name`, `changepercent`, `trade`, `open`, `high`, `low`,
|
||||
`settlement`, `volume`, `turnoverratio`, `amount`, `per`, `pb`, `mktcap`, `nmc`
|
||||
FROM stock_data.ts_today_all where `date` = 20171106 and trade > 0 and trade <= 20
|
||||
and `code` not like '002%' and `code` not like '300%' and `name` not like '%st%'
|
||||
|
||||
"""
|
||||
|
||||
|
||||
def stat_index_all(tmp_datetime):
|
||||
datetime_str = (tmp_datetime).strftime("%Y-%m-%d")
|
||||
datetime_int = (tmp_datetime).strftime("%Y%m%d")
|
||||
print("datetime_str:", datetime_str)
|
||||
print("datetime_int:", datetime_int)
|
||||
|
||||
# 查询今日满足股票数据。剔除数据:创业板股票数据,中小板股票数据,所有st股票
|
||||
# #`code` not like '002%' and `code` not like '300%' and `name` not like '%st%'
|
||||
sql_1 = """
|
||||
SELECT `date`, `code`, `name`, `changepercent`, `trade`, `open`, `high`, `low`,
|
||||
`settlement`, `volume`, `turnoverratio`, `amount`, `per`, `pb`, `mktcap`, `nmc`
|
||||
FROM stock_data.ts_today_all WHERE `date` = %s and `trade` > 0 and `open` > 0 and trade <= 20
|
||||
and `code` not like %s and `code` not like %s and `name` not like %s
|
||||
"""
|
||||
print(sql_1)
|
||||
data = pd.read_sql(sql=sql_1, con=common.engine(), params=[datetime_int, '002%', '300%', '%st%'])
|
||||
print(type(data))
|
||||
data = data.drop_duplicates(subset="code", keep="last")
|
||||
print(data["trade"])
|
||||
data["trade_float32"] = data["trade"].astype('float32', copy=False)
|
||||
print(len(data))
|
||||
print("########data[trade]########:")
|
||||
print(data["trade"])
|
||||
|
||||
# 使用 trade 填充数据
|
||||
stock_guess = pd.DataFrame({
|
||||
"date": data["date"], "code": data["code"], "wave_mean": data["trade"],
|
||||
"wave_crest": data["trade"], "wave_base": data["trade"]}, index=data.index.values)
|
||||
print(stock_guess.head())
|
||||
stock_guess = stock_guess.apply(apply_guess, axis=1) # , axis=1)
|
||||
print(stock_guess.head())
|
||||
# stock_guess.astype('float32', copy=False)
|
||||
stock_guess.drop('date', axis=1, inplace=True) # 删除日期字段,然后和原始数据合并。
|
||||
stock_guess = stock_guess.round(2) # 数据保留2位小数
|
||||
print(stock_guess["wave_base"])
|
||||
|
||||
data_new = pd.merge(data, stock_guess, on=['code'], how='left')
|
||||
print("#############")
|
||||
|
||||
# 使用pandas 函数 : https://pandas.pydata.org/pandas-docs/stable/api.html#id4
|
||||
data_new["up_rate"] = (data_new["trade_float32"].sub(data_new["wave_mean"])).div(data_new["wave_crest"]).mul(100)
|
||||
data_new["up_rate"] = data_new["up_rate"].round(2) # 数据保留2位小数
|
||||
data_new.drop('trade_float32', axis=1, inplace=True) # 删除计算字段。
|
||||
|
||||
# 删除老数据。
|
||||
del_sql = " DELETE FROM `stock_data`.`guess_period_daily` WHERE `date`= '%s' " % datetime_int
|
||||
common.insert(del_sql)
|
||||
# print(data_new.head())
|
||||
# data_new["down_rate"] = (data_new["trade"] - data_new["wave_mean"]) / data_new["wave_base"]
|
||||
common.insert_db(data_new, "guess_period_daily", False, "`date`,`code`")
|
||||
|
||||
# 进行左连接.
|
||||
# tmp = pd.merge(tmp, tmp2, on=['company_id'], how='left')
|
||||
|
||||
|
||||
def apply_guess(tmp):
|
||||
date = tmp["date"]
|
||||
code = tmp["code"]
|
||||
date_end = datetime.datetime.strptime(date, "%Y%m%d")
|
||||
date_start = (date_end + datetime.timedelta(days=-300)).strftime("%Y-%m-%d")
|
||||
date_end = date_end.strftime("%Y-%m-%d")
|
||||
print(code, date_start, date_end)
|
||||
|
||||
# open, high, close, low, volume, price_change, p_change, ma5, ma10, ma20, v_ma5, v_ma10, v_ma20, turnover
|
||||
# 使用缓存方法。加快计算速度。
|
||||
stock = common.get_hist_data_cache(code, date_start, date_end)
|
||||
# 增加空判断,如果是空返回 0 数据。
|
||||
if stock is None:
|
||||
return pd.Series([date, code, 0.0, 0.0, 0.0],
|
||||
index=['date', 'code', 'wave_mean', 'wave_crest', 'wave_base'])
|
||||
|
||||
stock = pd.DataFrame({"close": stock["close"]}, index=stock.index.values)
|
||||
stock = stock.sort_index(0) # 将数据按照日期排序下。
|
||||
|
||||
# print(stock.head(10))
|
||||
arr = pd.Series(stock["close"].values)
|
||||
# print(df_arr)
|
||||
wave_mean = arr.mean()
|
||||
# 计算股票的波峰值。
|
||||
wave_crest = heapq.nlargest(5, enumerate(arr), key=lambda x: x[1])
|
||||
wave_crest_mean = pd.DataFrame(wave_crest).mean()
|
||||
|
||||
# 输出元祖第一个元素是index,第二元素是比较的数值 计算数据的波谷值
|
||||
wave_base = heapq.nsmallest(5, enumerate(arr), key=lambda x: x[1])
|
||||
wave_base_mean = pd.DataFrame(wave_base).mean()
|
||||
# 输出数据
|
||||
# print("##############")
|
||||
# code date wave_base wave_crest wave_mean 顺序必须一致。返回的是行数据,然后填充。
|
||||
return pd.Series([date, code, wave_base_mean[1], wave_crest_mean[1], wave_mean],
|
||||
index=['date','code','wave_mean','wave_crest','wave_base'])
|
||||
|
||||
|
||||
# main函数入口
|
||||
if __name__ == '__main__':
|
||||
# 使用方法传递。
|
||||
tmp_datetime = common.run_with_args(stat_index_all)
|
||||
@@ -0,0 +1,130 @@
|
||||
#!/usr/local/bin/python3
|
||||
# -*- coding: utf-8 -*-
|
||||
|
||||
|
||||
import libs.common as common
|
||||
import sys
|
||||
import time
|
||||
import pandas as pd
|
||||
import numpy as np
|
||||
import math
|
||||
import tushare as ts
|
||||
from sqlalchemy.types import NVARCHAR
|
||||
from sqlalchemy import inspect
|
||||
import datetime
|
||||
import heapq
|
||||
|
||||
"""
|
||||
SELECT `date`, `code`, `name`, `changepercent`, `trade`, `open`, `high`, `low`,
|
||||
`settlement`, `volume`, `turnoverratio`, `amount`, `per`, `pb`, `mktcap`, `nmc`
|
||||
FROM stock_data.ts_today_all where `date` = 20171106 and trade > 0 and trade <= 20
|
||||
and `code` not like '002%' and `code` not like '300%' and `name` not like '%st%'
|
||||
|
||||
"""
|
||||
|
||||
|
||||
def stat_index_all(tmp_datetime):
|
||||
datetime_str = (tmp_datetime).strftime("%Y-%m-%d")
|
||||
datetime_int = (tmp_datetime).strftime("%Y%m%d")
|
||||
print("datetime_str:", datetime_str)
|
||||
print("datetime_int:", datetime_int)
|
||||
|
||||
# 查询今日满足股票数据。剔除数据:创业板股票数据,中小板股票数据,所有st股票
|
||||
# #`code` not like '002%' and `code` not like '300%' and `name` not like '%st%'
|
||||
sql_1 = """
|
||||
SELECT `date`, `code`, `name`, `changepercent`, `trade`, `open`, `high`, `low`,
|
||||
`settlement`, `volume`, `turnoverratio`, `amount`, `per`, `pb`, `mktcap`, `nmc`
|
||||
FROM stock_data.ts_today_all WHERE `date` = %s and `trade` > 0 and `open` > 0 and trade <= 20
|
||||
and `code` not like %s and `code` not like %s and `name` not like %s
|
||||
"""
|
||||
print(sql_1)
|
||||
data = pd.read_sql(sql=sql_1, con=common.engine(), params=[datetime_int, '002%', '300%', '%st%'])
|
||||
data = data.drop_duplicates(subset="code", keep="last")
|
||||
print("########data[trade]########:")
|
||||
# print(data["trade"])
|
||||
|
||||
# 使用 trade 填充数据
|
||||
stock_guess = pd.DataFrame({
|
||||
"date": data["date"], "code": data["code"], "5d": data["trade"],
|
||||
"10d": data["trade"], "20d": data["trade"], "60d": data["trade"], "5-10d": data["trade"],
|
||||
"5-20d": data["trade"], "return": data["trade"], "mov_vol": data["trade"]
|
||||
}, index=data.index.values)
|
||||
|
||||
stock_guess = stock_guess.apply(apply_guess, axis=1) # , axis=1)
|
||||
# print(stock_guess.head())
|
||||
# stock_guess.astype('float32', copy=False)
|
||||
stock_guess.drop('date', axis=1, inplace=True) # 删除日期字段,然后和原始数据合并。
|
||||
|
||||
# print(stock_guess["5d"])
|
||||
|
||||
data_new = pd.merge(data, stock_guess, on=['code'], how='left')
|
||||
print("#############")
|
||||
|
||||
# 使用pandas 函数 : https://pandas.pydata.org/pandas-docs/stable/api.html#id4
|
||||
data_new["return"] = data_new["return"].mul(100) # 扩大100 倍方便观察
|
||||
data_new["mov_vol"] = data_new["mov_vol"].mul(100)
|
||||
|
||||
data_new = data_new.round(2) # 数据保留2位小数
|
||||
|
||||
# 删除老数据。
|
||||
del_sql = " DELETE FROM `stock_data`.`guess_return_daily` WHERE `date`= '%s' " % datetime_int
|
||||
common.insert(del_sql)
|
||||
|
||||
# data_new["down_rate"] = (data_new["trade"] - data_new["wave_mean"]) / data_new["wave_base"]
|
||||
common.insert_db(data_new, "guess_return_daily", False, "`date`,`code`")
|
||||
|
||||
# 进行左连接.
|
||||
# tmp = pd.merge(tmp, tmp2, on=['company_id'], how='left')
|
||||
|
||||
|
||||
def apply_guess(tmp):
|
||||
date = tmp["date"]
|
||||
code = tmp["code"]
|
||||
date_end = datetime.datetime.strptime(date, "%Y%m%d")
|
||||
date_start = (date_end + datetime.timedelta(days=-300)).strftime("%Y-%m-%d")
|
||||
date_end = date_end.strftime("%Y-%m-%d")
|
||||
print(code, date_start, date_end)
|
||||
# open, high, close, low, volume, price_change, p_change, ma5, ma10, ma20, v_ma5, v_ma10, v_ma20, turnover
|
||||
# 使用缓存方法。加快计算速度。
|
||||
stock = common.get_hist_data_cache(code, date_start, date_end)
|
||||
# 增加空判断,如果是空返回 0 数据。
|
||||
if stock is None:
|
||||
return pd.Series([0.0, 0.0, 0.0, 0.0, 0.0, 0.0, code, date, 0.0, 0.0],
|
||||
index=['10d', '20d', '5-10d', '5-20d', '5d', '60d', 'code', 'date', 'mov_vol', 'return'])
|
||||
|
||||
stock = pd.DataFrame({"close": stock["close"]}, index=stock.index.values)
|
||||
stock = stock.sort_index(0) # 将数据按照日期排序下。
|
||||
# print(stock.head(10))
|
||||
# 5周期、10周期、20周期和60周期
|
||||
# 周线、半月线、月线和季度线
|
||||
stock["5d"] = stock["close"].rolling(window=5).mean() # 周线
|
||||
stock["10d"] = stock["close"].rolling(window=10).mean() # 半月线
|
||||
stock["20d"] = stock["close"].rolling(window=20).mean() # 月线
|
||||
stock["60d"] = stock["close"].rolling(window=60).mean() # 季度线
|
||||
# 计算日期差。
|
||||
stock["5-10d"] = (stock["5d"] - stock["10d"]) * 100 / stock["10d"] # 周-半月线差
|
||||
stock["5-20d"] = (stock["5d"] - stock["20d"]) * 100 / stock["20d"] # 周-月线差
|
||||
# 计算股票的收益价格
|
||||
stock["return"] = np.log(stock["close"] / stock["close"].shift(1))
|
||||
|
||||
# print(stock["return"])
|
||||
# 计算股票的【收益率的移动历史标准差】
|
||||
mov_day = int(len(stock) / 20)
|
||||
# print("mov_day:", mov_day, len(stock))
|
||||
stock["mov_vol"] = stock["return"].rolling(window=mov_day).std() * math.sqrt(mov_day)
|
||||
# print(stock["mov_vol"].tail())
|
||||
# print(stock["return"].tail())
|
||||
# print("stock[10d].tail(1)", stock["10d"].tail(1).values[0])
|
||||
# 10d 20d 5-10d 5-20d 5d 60d code date mov_vol return
|
||||
tmp = pd.Series([stock["10d"].tail(1).values[0], stock["20d"].tail(1).values[0], stock["5-10d"].tail(1).values[0],
|
||||
stock["5-20d"].tail(1).values[0], stock["5d"].tail(1).values[0], stock["60d"].tail(1).values[0],
|
||||
code, date, stock["mov_vol"].tail(1).values[0], stock["return"].tail(1).values[0]],
|
||||
index=['10d', '20d', '5-10d', '5-20d', '5d', '60d', 'code', 'date', 'mov_vol', 'return'])
|
||||
# print(tmp)
|
||||
return tmp
|
||||
|
||||
|
||||
# main函数入口
|
||||
if __name__ == '__main__':
|
||||
# 使用方法传递。
|
||||
tmp_datetime = common.run_with_args(stat_index_all)
|
||||
@@ -0,0 +1,146 @@
|
||||
#!/usr/local/bin/python3
|
||||
# -*- coding: utf-8 -*-
|
||||
|
||||
|
||||
import libs.common as common
|
||||
import pandas as pd
|
||||
import numpy as np
|
||||
import math
|
||||
import datetime
|
||||
import sklearn as skl
|
||||
from sklearn import datasets, linear_model
|
||||
# https://github.com/udacity/machine-learning/issues/202
|
||||
# sklearn.cross_validation 这个包不推荐使用了。
|
||||
from sklearn.model_selection import train_test_split, cross_val_score
|
||||
from sklearn.neighbors import KNeighborsClassifier
|
||||
|
||||
# 要操作的数据库表名称。
|
||||
table_name = "guess_sklearn_ma_daily"
|
||||
|
||||
|
||||
# 批处理数据。
|
||||
def stat_all_batch(tmp_datetime):
|
||||
datetime_str = (tmp_datetime).strftime("%Y-%m-%d")
|
||||
datetime_int = (tmp_datetime).strftime("%Y%m%d")
|
||||
print("datetime_str:", datetime_str)
|
||||
print("datetime_int:", datetime_int)
|
||||
|
||||
try:
|
||||
# 删除老数据。
|
||||
del_sql = " DELETE FROM `stock_data`.`%s` WHERE `date`= %s " % (table_name, datetime_int)
|
||||
print("del_sql:", del_sql)
|
||||
common.insert(del_sql)
|
||||
except Exception as e:
|
||||
print("error :", e)
|
||||
|
||||
sql_count = """
|
||||
SELECT count(1) FROM stock_data.ts_today_all WHERE `date` = %s and `trade` > 0 and `open` > 0 and trade <= 20
|
||||
and `code` not like %s and `name` not like %s
|
||||
"""
|
||||
# 修改逻辑,增加中小板块计算。 中小板:002,创业板:300 。and `code` not like %s and `code` not like %s and `name` not like %s
|
||||
# count = common.select_count(sql_count, params=[datetime_int, '002%', '300%', '%st%'])
|
||||
count = common.select_count(sql_count, params=[datetime_int, '300%', '%st%'])
|
||||
print("count :", count)
|
||||
batch_size = 100
|
||||
end = int(math.ceil(float(count) / batch_size) * batch_size)
|
||||
print(end)
|
||||
# for i in range(0, end, batch_size):
|
||||
for i in range(0, end, batch_size):
|
||||
print("loop :", i)
|
||||
# 查询今日满足股票数据。剔除数据:创业板股票数据,中小板股票数据,所有st股票
|
||||
# #`code` not like '002%' and `code` not like '300%' and `name` not like '%st%'
|
||||
sql_1 = """
|
||||
SELECT `date`, `code`, `name`, `changepercent`, `trade`, `open`, `high`, `low`,
|
||||
`settlement`, `volume`, `turnoverratio`, `amount`, `per`, `pb`, `mktcap`, `nmc`
|
||||
FROM stock_data.ts_today_all WHERE `date` = %s and `trade` > 0 and `open` > 0 and trade <= 20
|
||||
and `code` not like %s and `name` not like %s limit %s , %s
|
||||
"""
|
||||
print(sql_1)
|
||||
# data = pd.read_sql(sql=sql_1, con=common.engine(), params=[datetime_int, '002%', '300%', '%st%', i, batch_size])
|
||||
data = pd.read_sql(sql=sql_1, con=common.engine(), params=[datetime_int, '300%', '%st%', i, batch_size])
|
||||
data = data.drop_duplicates(subset="code", keep="last")
|
||||
print("########data[trade]########:", len(data))
|
||||
|
||||
# 使用 trade 填充数据
|
||||
stock_sklearn = pd.DataFrame({
|
||||
"date": data["date"], "code": data["code"], "next_close": data["trade"],
|
||||
"sklearn_score": data["trade"]}, index=data.index.values)
|
||||
print(stock_sklearn.head())
|
||||
stock_sklearn_apply = stock_sklearn.apply(apply_sklearn, axis=1) # , axis=1)
|
||||
# 重命名
|
||||
del stock_sklearn_apply["date"] # 合并前删除 date 字段。
|
||||
# 合并数据
|
||||
data_new = pd.merge(data, stock_sklearn_apply, on=['code'], how='left')
|
||||
# for index, row in data.iterrows():
|
||||
# next_stock, score = stat_index_all(row, i)
|
||||
# print(next_stock, score)
|
||||
data_new["next_close"] = data_new["next_close"].round(2) # 数据保留4位小数
|
||||
data_new["sklearn_score"] = data_new["sklearn_score"].round(2) # 数据保留2位小数
|
||||
|
||||
data_new["trade_float32"] = data["trade"].astype('float32', copy=False)
|
||||
data_new["up_rate"] = (data_new["next_close"] - data_new["trade_float32"]) * 100 / data_new["trade_float32"]
|
||||
data_new["up_rate"] = data_new["up_rate"].round(2) # 数据保留2位小数
|
||||
del data_new["trade_float32"]
|
||||
|
||||
try:
|
||||
common.insert_db(data_new, table_name, False, "`date`,`code`")
|
||||
print("insert_db")
|
||||
except Exception as e:
|
||||
print("error :", e)
|
||||
# 重命名
|
||||
del data_new["name"]
|
||||
print(data_new)
|
||||
|
||||
|
||||
# code date next_close sklearn_score
|
||||
def apply_sklearn(data):
|
||||
# 要操作的数据库表名称。
|
||||
print("########stat_index_all########:", len(data))
|
||||
date = data["date"]
|
||||
code = data["code"]
|
||||
print(date, code)
|
||||
date_end = datetime.datetime.strptime(date, "%Y%m%d")
|
||||
date_start = (date_end + datetime.timedelta(days=-300)).strftime("%Y-%m-%d")
|
||||
date_end = date_end.strftime("%Y-%m-%d")
|
||||
print(code, date_start, date_end)
|
||||
|
||||
# open high close low volume price_change p_change ma5 ma10 ma20 v_ma5 v_ma10 v_ma20 turnover
|
||||
stock_X = common.get_hist_data_cache(code, date_start, date_end)
|
||||
# 增加空判断,如果是空返回 0 数据。
|
||||
if stock_X is None:
|
||||
return list([code, date, 0.0, 0.0])
|
||||
|
||||
stock_X = stock_X.sort_index(0) # 将数据按照日期排序下。
|
||||
stock_y = pd.Series(stock_X["close"].values) # 标签
|
||||
|
||||
stock_X_next = stock_X.iloc[len(stock_X) - 1]
|
||||
print("########################### stock_X_next date:", stock_X_next)
|
||||
# 使用今天的交易价格,13 个指标预测明天的价格。偏移股票数据,今天的数据,目标是明天的价格。
|
||||
stock_X = stock_X.drop(stock_X.index[len(stock_X) - 1]) # 删除最后一条数据
|
||||
stock_y = stock_y.drop(stock_y.index[0]) # 删除第一条数据
|
||||
# print("########################### stock_X date:", stock_X)
|
||||
|
||||
# 删除掉close 也就是收盘价格。
|
||||
del stock_X["close"]
|
||||
del stock_X_next["close"]
|
||||
|
||||
model = linear_model.LinearRegression()
|
||||
# model = KNeighborsClassifier()
|
||||
|
||||
model.fit(stock_X.values, stock_y)
|
||||
# print("############## test_akshare & target #############")
|
||||
# print("############## coef_ & intercept_ #############")
|
||||
# print(model.coef_) # 系数
|
||||
# print(model.intercept_) # 截断
|
||||
next_close = model.predict([stock_X_next.values])
|
||||
if len(next_close) == 1:
|
||||
next_close = next_close[0]
|
||||
sklearn_score = model.score(stock_X.values, stock_y)
|
||||
print("score:", sklearn_score) # 评分
|
||||
return list([code, date, next_close, sklearn_score * 100])
|
||||
|
||||
|
||||
# main函数入口
|
||||
if __name__ == '__main__':
|
||||
# 使用方法传递。
|
||||
tmp_datetime = common.run_with_args(stat_all_batch)
|
||||
Reference in New Issue
Block a user