def serialListenForSell(): f = open('persist.txt', 'r') code = str(f.readline()) f.close() if code is not None and code != 'Nothing' and code != "": print("[" + str(du.getHMS()) + "]:已获取code:" + code) df = gs.getDataFrame(code) pre_b1_v = float(df['b1_v'][0]) while True: if du.getHMS() < "09:24:20": time.sleep(5) continue df = gs.getDataFrame(code) rate = float(gs.getRate(gs.getDataFrame(code))) if rate < 0 and du.getHMS() < "10:30:00": time.sleep(5) continue if rate > 9.89: b1_v = float(df['b1_v'][0]) if pre_b1_v - b1_v > 1280: sellAction(code=code) break else: sellAction(code=code) break print("[" + str(du.getHMS()) + "]:持续监听卖出->rate:" + str(rate) + "->b1_v:" + str(pre_b1_v) + "->volumeDis:" + str(pre_b1_v - b1_v)) pre_b1_v = float(df['b1_v'][0]) time.sleep(5) else: print("[" + str(du.getHMS()) + "]:没有持仓")
def prepareForAppChannelKpi(): listParams = [] channelType = 0 while (channelType < 7): channelType = channelType + 1 temp = (channelType, 1000000, 10000 * random.randint(10, 40), DateUtil.getNowTime(), DateUtil.getNowTime()) listParams.append(temp) return tuple(listParams)
def prepareForAppSummaryDaily(): date_rang = DateUtil.getDateRang("2016-03-01", "2016-04-01") now = DateUtil.getNowTime() listParams = [] for num in date_rang: tmp = (random.randint(2000, 10000), random.randint(2000, 10000), num, now, now) listParams.append(tmp) return tuple(listParams)
def startNotifyInTimeBigEmotion4Sell(): while True: hms = du.getHMS() if '09:25' in hms or '09:30' in hms or '09:32' in hms or '09:35' in hms or '09:40' in hms or '09:50' in hms or '10:00' in hms: if Config.isBigEmotionGood == False: pm.sendContent('市场环境氛围_差', '市场环境氛围_差') else: pm.sendContent('市场环境氛围_好', '市场环境氛围_好') time.sleep(60) time.sleep(1) print("[" + du.getHMS() + "] startNotifyInTimeBigEmotion4Sell: tik tok...") if hms > '10:30:00': break
def prepareForAppStatDaily(): appKeys = MySqlUtil.db_qa_sql_select("SELECT app_key FROM app", "open_api") date_rang = DateUtil.getDateRang("2016-03-01", "2016-04-01") listParams = [] for num in date_rang: for key in appKeys: tmp = (key, random.randint(500, 1000), random.randint(50000, 100000), random.randint(8000, 15000), random.randint(60, 1800), random.randint(3000, 6000), random.randint(60, 1800), round(random.random(), 2), round(random.random(), 2), round(random.random(), 2), num, DateUtil.getNowTime(), DateUtil.getNowTime()) listParams.append(tmp) return tuple(listParams)
def sendContent(title, content): try: requests.get('http://95.163.200.245:11251/sendEmail/[' + du.getYMD() + ':' + conf.hostname + ']:' + title + '/' + content + '/' + default_receivers) except Exception as e: print("ERROR Send Check Mail!")
def stu_selectcourse(self, studinfo, xuanke_counter=0): studenetId = studinfo['stu']['id'] studentNo = studinfo['stu']['studentNo'] semeId = str(int(studinfo['stu']['xueqi']['id']) + 1) #本学期选下学期的课 stu_plan_name = studinfo['stu']['planObj']['name'] dateutil = DateUtil.DateUtil() semenum = dateutil.getSCTermNo(stu_plan_name) tobeelectlistinfo = self.get_stu_tobeelect(studinfo) if tobeelectlistinfo and len(tobeelectlistinfo) == 2: stu_cur_eleactive = tobeelectlistinfo[0] tobeelectlist = tobeelectlistinfo[1] if stu_cur_eleactive and len( stu_cur_eleactive) > 0 and self.getifforceselectcourse( ) != True: self.log('学生' + str(studentNo) + '已有选课记录,不再进行自动选课。', True) else: # 优选本学期的推荐课,判断是否为推荐选课 tobeelectlist = self.selectCourseService.get_recommend_courselist( studentNo) if xuanke_counter > 0: # 在所有推荐选课列表中先选主修课再选选修课 #mainstudy_courselist=self.selectCourseService.get_recommend_courselist(studentNo,0) #if len(mainstudy_courselist)>=xuanke_counter: # tobeelectlist=mainstudy_courselist[0:xuanke_counter] #else: # selectstudy_courselist=self.selectCourseService.get_recommend_courselist(studentNo,1) # selectstudy_coursecount=len(selectstudy_courselist) # if selectstudy_coursecount>0: # selectstudycount=xuanke_counter-len(mainstudy_courselist) # if selectstudycount>selectstudy_coursecount: # selectstudycount=selectstudy_coursecount # mainstudy_courselist.extend(selectstudy_courselist[0:selectstudycount]) # tobeelectlist =mainstudy_courselist tobeelectlist = tobeelectlist[0:xuanke_counter] # 组织自动选课数据 selectcourselist = [] selectcoursetime = self.getcurrenttime() for course in tobeelectlist: # 优选本学期的推荐课,判断是否为推荐选课,如果是则选择 courseid = course['courseId'] coursetype = '必修' if course['type'] == 0: coursetype = '必修' if course['type'] == 1: coursetype = '选修' selectcouse = { "coursePlanId": course['id'], "courseD": course['courseD'], "studentId": studenetId, "studentNo": studentNo, "courseId": courseid, "planId": course['planId'], "semeId": semeId, "type": coursetype, "time": selectcoursetime } selectcourselist.append(selectcouse) selectcourse_data = json.dumps(selectcourselist, ensure_ascii=False) self.submit_selectcourse(studinfo, selectcourse_data)
def createJpg(uid, needCreateJpg=True, jpgName="分析词云"): # get data directory (using getcwd() is needed to support running example in generated IPython notebook) dpath = path.dirname(__file__) if "__file__" in locals() else os.getcwd() # Read the whole text. txtFilePath = FileUtil.getTxtFilePath(uid) text = open(txtFilePath, encoding="utf-8").read() # print(text) # 设置字体,使其支持中文显示,需要提前下载对应的字体 font = dpath + "\simfang.ttf" # Generate a word cloud image wordcloud = WordCloud(collocations=False, font_path=font, width=1400, height=1400, margin=2).generate(text) if needCreateJpg: # 把产生的词云保存进图片 if not jpgName: jpgName = "default_" + DateUtil.nowNoSplit() if not jpgName.endswith(".jpg"): jpgName = jpgName + ".jpg" print("生成图片名:" + jpgName) file_pref = txtFilePath[0:txtFilePath.rfind((os.sep))] wordcloud.to_file(file_pref + jpgName) # Display the generated image: # the matplotlib way: plt.imshow(wordcloud, interpolation='bilinear') plt.axis("off") plt.show()
def update(end_date): indexes = bd.getStocks(True) for each in indexes: stock_code = each[0] stock_code_163 = each[3] start_date = each[5] if start_date is None: start_date = du.convertStringToDate("1990-01-01", "%Y-%m-%d") elif start_date == end_date: continue else: start_date = start_date + timedelta(1) data = bd.getStockData(stock_code_163, start_date, end_date) last_updated_date = data[0].split(",")[0] bd.insertBasicData(stock_code, data) bd.insertTechData(stock_code, data) bd.insertAnalysisData(stock_code, data) bd.updateMasterDate("LAST_UPDATED_DATE", last_updated_date, stock_code_163) stocks = bd.getStocks(False) for each in stocks: stock_code = each[0] stock_code_163 = each[3] stock_code_sina = each[4] start_date = each[5] if start_date is None: start_date = du.convertStringToDate("1990-01-01", "%Y-%m-%d") elif start_date == end_date: continue else: start_date = start_date + timedelta(1) data = bd.getStockData(stock_code_163, start_date, end_date) last_updated_date = data[0].split(",")[0] bd.insertBasicData(stock_code, data) bd.insertTechData(stock_code, data) bd.insertAnalysisData(stock_code, data) bd.updateMasterDate("LAST_UPDATED_DATE", last_updated_date, stock_code_163) rf = bd.getRecoveryFactor(stock_code_163, stock_code_sina, start_date) bd.insertRecoveryFactor(stock_code, rf)
def process(image_file): tags = exifread.process_file(image_file) for tag in tags.keys(): # print "key:%s, value:%s" % (tag, tags[tag]) if tag == "Image DateTime": diff_str, date_str = DateUtil.get_days(tags[tag]) ImageUtil.set_text(image_file, diff_str, date_str)
def smartUpdate(end_date=date.today()): sql = "SELECT * FROM stockmaster where LAST_UPDATED_DATE < '" + du.convertDateToString(end_date, "%Y-%m-%d") + "'" result_set = dbu.query(sql) while len(result_set) > 0: for each in result_set: stock_code = each[0] index_indicator = each[2] stock_code_163 = each[3] stock_code_sina = each[4] start_date = each[5] logger.info("UPDATING STOCK, STOCK CODE IS " + stock_code) if start_date is None: start_date = du.convertStringToDate("1990-01-01", "%Y-%m-%d") elif start_date == end_date: continue else: start_date = start_date + timedelta(1) data = bd.getStockData(stock_code_163, start_date, end_date) if len(data) > 0: last_updated_date = data[0].split(",")[0] bd.insertBasicData(stock_code, data) logger.info("INSERT BASIC DATA COMPLETED") bd.insertTechData(stock_code, data) logger.info("INSERT TECH DATA COMPLETED") bd.insertAnalysisData(stock_code, data) logger.info("INSERT ANALYSIS DATA COMPLETED") bd.updateMasterDate("LAST_UPDATED_DATE", last_updated_date, stock_code_163) logger.info("LAST DATE UPDATED") if str(index_indicator) == "1": rf = bd.getRecoveryFactor(stock_code_163, stock_code_sina, start_date) bd.insertRecoveryFactor(stock_code, rf) logger.info("INSERT RF DATA COMPLETED") else: logger.error("NO DATA IS RECEIVED FROM 163") result_set = dbu.query(sql) if len(result_set) > 0: logger.info("NOT ALL STOCKS ARE UPDATED, WAIT 10 MINUTES FOR NEXT UPDATE") tm.sleep(10*60) return "COMPLETED"
def get_month_maxdate(stockno): try: sql = "select max(date) maxdate from stock_month_data where code='"+stockno+"'" conn = MySQLdb.connect(host='localhost',user='******',passwd='123456',db='stock') cursor = conn.cursor() n = cursor.execute(sql) maxdate = '' for r in cursor: maxdate = r[0] cursor.close() conn.close if maxdate=='': stockDf =ts.get_stock_basics() sssj = str(stockDf.ix[stockno]['timeToMarket']) #上市日期YYYYMMDD return dateutil.convertDate(sssj) return dateutil.get_next_day(maxdate) except Exception,e: print e.message
def sendCodeArr(codeArr): content = "_".join(codeArr) + "_共" + str(codeArr.__len__()) + "个" title = str(codeArr.__len__()) + "个" try: requests.get('http://95.163.200.245:11251/sendEmail/[' + du.getYMD() + ':' + conf.hostname + ']:盘前选股_' + title + '/候选:' + content + '/' + default_receivers) except Exception as e: print("ERROR Send Check Mail!")
def num2date(v): """ Convert numerical value to python date. :param v: Numerical value of date. :returns: Python date """ t = DateUtil.fromOADate(v) return pydate(t)
def sellIn0925(): res = requests.get("http://95.163.200.245:11252/chicang/read") if res.text is None or res.text == "Nothing": return code = str(res.text) while True: time.sleep(5) if du.getHMS() > Config.SellTime: df = gs.getDataFrame(code) if df is None: return name = gs.getStockName(df) pre_close = str(round(float(df['pre_close'][0]), 2)) sp = str(round(float(pre_close) * 0.91, 2)) sellAction(code, name, sp, '100') requests.get("http://95.163.200.245:11252/chicang/deleteall") break else: print('[' + du.getHMS() + ']:sellIn0925 waitting...')
def date2num(t): """ Convert python date to numerical value. :param t: Python date. :returns: Numerical value """ tt = jdate(t) v = DateUtil.toOADate(tt) return v
def log(string): filename = _getFilename("LOG") try: if Config.IS_PRINT_CONSOLE == True: print(string) if Config.IS_PRINT_FILE == True: f = open('log/' + filename, 'a') f.write('[' + du.getYMDHMS() + "]: " + string + "\n") f.close() except: return
def calcTRIX(stock_code, date, period): global ITERATOR_COUNT TR = calcEMA(stock_code, date, period) pday = du.convertDateToString(bd.getStockDate(stock_code, date, 1), "%Y-%m-%d") ITERATOR_COUNT = 0 TR_pday = calcEMA(stock_code, pday, period) print TR print pday print TR_pday return (TR - TR_pday) / TR_pday * 100
def get_qfq_maxdate(stockno): try: sql = "select max(date) maxdate from stock_qfq_data where code='"+stockno+"'" engine = create_engine('mysql://*****:*****@127.0.0.1/stock?charset=utf8') #df.to_sql('inst_detail', engine, if_exists='append') conn = MySQLdb.connect(host='localhost',user='******',passwd='123456',db='stock') cursor = conn.cursor() n = cursor.execute(sql) maxdate = '' for r in cursor: maxdate = r[0][0:10] cursor.close() conn.close if maxdate=='': stockDf =ts.get_stock_basics() sssj = str(stockDf.ix[stockno]['timeToMarket']) #上市日期YYYYMMDD return dateutil.convertDate(sssj) return dateutil.get_next_day(maxdate) except Exception,e: print e.message
def dates2nums(dates): """ Convert python dates to numerical values. :param dates: (*list*) Python dates. :returns: (*list*) Numerical values """ values = [] for t in dates: tt = jdate(t) values.append(DateUtil.toOADate(tt)) return values
def nums2dates(values): """ Convert numerical values to python dates. :param values: Numerical values of date. :returns: Python dates """ tt = [] for v in values: t = DateUtil.fromOADate(v) tt.append(pydate(t)) return tt
def getRecoveryFactor(stock_code_163, stock_code_sina, start_date): url_base = 'http://vip.stock.finance.sina.com.cn/corp/go.php/vMS_FuQuanMarketHistory/stockid/' url_stock = stock_code_sina + '.phtml?' today = date.today() current_year = int(today.strftime("%Y")) current_quarter = du.getQuarter(int(today.strftime("%m"))) start_year = int(start_date.strftime("%Y")) start_quarter = du.getQuarter(int(start_date.strftime("%m"))) recovery_factor = [] for year in range(start_year, current_year + 1): for quarter in range(1, 5): if (year <= start_year) and (quarter < start_quarter): continue if (year >= current_year) and (quarter > current_quarter): break url_year = 'year=' + str(year) url_quarter = '&jidu=' + str(quarter) url = url_base + url_stock + url_year + url_quarter #print url html = urllib.urlopen(url) content = html.read() html.close() soup = BeautifulSoup(content, 'html.parser') # print type(soup.find(id='FundHoldSharesTable')) for tr in soup.find(id='FundHoldSharesTable').find_all('tr')[2:]: row = [stock_code_163, stock_code_sina] for td in tr.find_all('td'): for div in td.find_all('div'): if len(div.find_all('a')) > 0: row.append(div.a.contents[0].strip()) else: row.append(div.contents[0].strip()) recovery_factor.append(row) # print recoveryFactor return recovery_factor
def calcEMA(stock_code, date, period): if ITERATOR_COUNT >= MAX_ITERATOR: EXPMA = MA.calcMA(stock_code, date, period) # print "MIN Date: " +date+ " MA:"+ str(EXPMA) return EXPMA else: global ITERATOR_COUNT ITERATOR_COUNT = ITERATOR_COUNT + 1 close_today = bd.getBasicData("CLOSE_TODAY", stock_code, date) pday = du.convertDateToString(bd.getStockDate(stock_code, date, 1), "%Y-%m-%d") EXPMA_pday = calcEMA(stock_code, pday, period) EXPMA = 2 * (close_today - EXPMA_pday) / (period + 1) + EXPMA_pday # print date + ": EXPMA: "+str(EXPMA_PDAY)+" CLOSE: " + str(CLOSE_TODAY) + " EXPMA = " +str(EXPMA) return round(EXPMA, 3)
def get_szzs_maxdate(): try: sql = "select max(date) maxdate from stock_index_data where code='000001'" conn = MySQLdb.connect(host='localhost',user='******',passwd='123456',db='stock') cursor = conn.cursor() n = cursor.execute(sql) maxdate = '' for r in cursor: maxdate = r[0] cursor.close() conn.close if len(maxdate)>10: maxdate=maxdate[0:10] return dateutil.get_next_day(maxdate) except Exception,e: print e.message
def sellAction(code=None, name=None, price=None, posi='100'): if name is None: df = gs.getDataFrame(code) name = gs.getStockName(df) price = str(round(float(df['b1_p'][0]), 2)) posi = '100' if du.getHMS() < '09:25:00': df = gs.getDataFrame(code) pre_close = str(round(float(df['pre_close'][0]), 2)) price = round(float(pre_close) * 0.92, 2) config_words = code + "," + name + "," + posi + "," + str(price) + ",0" f_config = open('C:/auto/SellAction.txt', 'w') f_config.write(config_words) f_config.close() pm.sendSellDoneEmail(code) lu.log("SellAction: 已写入执行句子:" + config_words) f = open('persist.txt', 'w') f.write("") f.close()
def updateWithoutRF(end_date): stocks = bd.getStockCodes() for each in stocks: stock_code = each[0] stock_code_163 = each[3] start_date = each[5] if start_date is None: start_date = du.convertStringToDate("1990-01-01", "%Y-%m-%d") elif start_date == end_date: continue else: start_date = start_date + timedelta(1) data = bd.getStockData(stock_code_163, start_date, end_date) last_updated_date = data[0].split(",")[0] bd.insertBasicData(stock_code, data) bd.insertTechData(stock_code, data) bd.insertAnalysisData(stock_code, data) bd.updateMasterDate("LAST_UPDATED_DATE", last_updated_date, stock_code_163)
def get_stu_courseplanlist(self, login_name, stu_plan_name, stu_plan_id, retrytime=None): dateutil = DateUtil.DateUtil() semenum = dateutil.getSCTermNo(stu_plan_name) request_url = 'https://jxjyxb.bucm.edu.cn/api/v1/student/courseplan/list_stu' post_data = { 'page': 1, 'pageSize': 100, 'coursePlan.planId': stu_plan_id, 'coursePlan.semenum': semenum } try: response = self.session.post(request_url, data=post_data, headers=self.headers) if response.status_code == 200: print('选课信息---' + response.text) stu_course_json = json.loads(response.text) stu_course_plan = stu_course_json['pager']['datas'] except: self.log(neterror_msg, True) set_retrytime = int(self.get_retrytime()) if retrytime is None: retrytime = int(set_retrytime) else: retrytime = int(retrytime) - 1 if retrytime > 0: self.log('重复尝试第' + str(set_retrytime - retrytime + 1) + '次', True) retryinterval = self.get_retryinterval() time.sleep(retryinterval) self.get_stu_courseplanlist(login_name, stu_plan_name, stu_plan_id, retrytime) return stu_course_plan
def analyzeAllStocks(date): stock_codes = bd.getStockCodes() for each in stock_codes: stock_code = each[0] analyze(stock_code, du.convertDateToString(date, "%Y-%m-%d"))
import BasicData as fd from datetime import * import DateUtil as du import ROC # Main function if __name__ == '__main__': ''' start_date = datetime.strptime("2016-02-01", '%Y-%m-%d') end_date = date.today() stocks = fd.getStocks(True) print stocks print "**********************************" stocks = fd.getStocks(False) print stocks print "**********************************" index = fd.getBasicData("0000001", start_date, end_date) print index print "**********************************" rf = fd.getRecoveryFactor("0600079", "600079", start_date) print rf print "**********************************" resultSet = ROC.getROC("000001", "2015-12-21") print resultSet[0][0] ''' print du.convertDateToString(fd.getStockDate("000001", "2015-12-21", 1)[0][0], "%Y-%m-%d")
def sendListenStartEmail(receivers=default_receivers): if conf.IS_SEND_MAIL == False: return Async_req('http://95.163.200.245:11251/sendListenStartEmail/' + conf.hostname + '/' + du.getYMD() + '/' + receivers).start()
def sendSellDoneEmail(code="002197", receivers=default_receivers): if conf.IS_SEND_MAIL == False: return Async_req('http://95.163.200.245:11251/sendSellDoneEmail/' + code + '/' + conf.hostname + '/' + du.getYMD() + '/' + receivers).start()
def getHisDataFrame(code, date): preOneDay = du.getPreDayYMD(30, date) df = ts.get_k_data(code, preOneDay, date) return df
def startListenIsBigEmotionGood(): queryWords = "非st;昨日涨停;昨日成交量>1000万;按昨日最终涨停时间升序排序前20;" w = execjs.eval("encodeURIComponent('" + queryWords + "')") url = 'https://www.iwencai.com/stockpick/search?typed=1&preParams=&ts=1&f=3&qs=pc_~soniu~stock~stock~history~query&selfsectsn=&querytype=stock&searchfilter=&tid=stockpick&w=' + w browser = None try: browser = webdriver.Chrome( os.path.abspath('.') + '\driver\chromedriver.exe') browser.get(url) time.sleep(4) browser.implicitly_wait(1) try: elem = browser.find_element_by_css_selector( '#resultWrap #showPerpage select option[value="50"]') if elem is not None: elem.click() except: lu.log("get_html_forWencai Execption") html = browser.execute_script( "return document.documentElement.outerHTML") browser.quit( ) # 关闭浏览器。当出现异常时记得在任务浏览器中关闭PhantomJS,因为会有多个PhantomJS在运行状态,影响电脑性能 soup = BeautifulSoup(html, "html.parser") eles = soup.select( '#resultWrap .static_con_outer .tbody_table tr td.item div.em') index = 0 codeArr = [] while index < eles.__len__(): o_str = eles[index].text.strip() if (o_str.isdigit()): codeArr.append(o_str) index = index + 1 except Exception as e: browser.quit() return None while True: if du.getHMS() < '09:25:00': print("[" + du.getHMS() + "] startListenIsBigEmotionGood: tik tok...") time.sleep(3) continue riskCount = 0 for code in codeArr: #记录开盘涨跌幅,只记录一次 if map_code_openrate_rel.keys().__len__( ) == 0 and du.getHMS() > "09:25:30" and du.getHMS() < "09:30:00": df = gs.getDataFrame(code) rate = gs.getRate(df) map_code_openrate_rel[code] = rate #记录竞价涨跌幅 if du.getHMS() > "09:30:00": df = gs.getDataFrame(code) rate = gs.getRate(df) map_code_now_rel[code] = rate #计算riskCount if map_code_openrate_rel.keys().__len__( ) > 0 and map_code_now_rel.keys().__len__() > 0: for code in map_code_now_rel.keys(): r_now = float(map_code_now_rel[code]) r_open = float(map_code_openrate_rel[code]) #现在涨跌幅<0 if r_now < 0: riskCount = riskCount + 1 if (r_now - r_open) < 0: riskCount = riskCount + 1 if map_code_openrate_rel.keys().__len__( ) == 0 or map_code_now_rel.keys().__len__() == 0: Config.isBigEmotionGood = False if riskCount > 6: Config.isBigEmotionGood = False else: Config.isBigEmotionGood = True time.sleep(30) print("[" + du.getHMS() + "] startListenIsBigEmotionGood: after cal tik tok...")
def dayreport_generate(importdate): try: starttime = time.localtime(time.time()) conn = MySQLdb.connect(host='localhost',user='******',passwd='123456',db='stock',charset="utf8") cursor = conn.cursor() #importdate = time.strftime('%Y-%m-%d',time.localtime(time.time())) #importdate='2015-11-13' sql ="select * from stock_basic where code not in(select stockno from stock_day_report where importdate like'"+importdate+"%')" cursor.execute(sql) for stockrow in cursor.fetchall(): stockno = stockrow[0] #stockno='600000' stockname=stockrow[1] print stockno+stockname #获得同花顺的相关数据 #在这个地方增加循环的操作 #http://stockpage.10jqka.com.cn/realHead_v2.html#hs_600061 url = "http://stockpage.10jqka.com.cn/"+stockno request = urllib2.Request(url) response = urllib2.urlopen(request) content = response.read() soup = BeautifulSoup(content,'html5lib') csvout = csv.writer(sys.stdout) ###获得主营业务 request = urllib2.Request("http://stockpage.10jqka.com.cn/"+stockno+"/operate/") response = urllib2.urlopen(request) contentZyyw = response.read() soupZyyw = BeautifulSoup(contentZyyw,"html5lib") csvout1 = csv.writer(sys.stdout) cplxTag = soupZyyw.find("ul",class_="main_intro_list") if cplxTag==None: cplx = "" else: cplx = cplxTag.li.p.text print cplx sshySql= "select * from stock_industry_classified where code=\'"+stockno+"\'" print sshySql cursor.execute(sshySql) sshy = "" for rowSshy in cursor.fetchall(): sshy = rowSshy[3].strip() print soup.find_all("dl", class_="company_details") for content1 in soup.find_all("dl", class_="company_details"): print "company_details" print content1 for details in content1.find_all("dt"): if details.string==unicode("所属地域:","utf-8"): ssdy= details.next_sibling.next_sibling.string.strip() print details.string+ssdy elif details.string==unicode("涉及概念:","utf-8"): sjgn = details.next_sibling.next_sibling["title"] print sjgn elif details.string==unicode("主营业务:","utf-8"): zyyw = details.next_sibling.next_sibling.string print zyyw elif details.string==unicode("上市日期:","utf-8"): sssj = details.next_sibling.next_sibling.string print sssj elif details.string==unicode("每股净资产:","utf-8"): mgjzc = details.next_sibling.next_sibling.string[:-1] print mgjzc[:-1] elif details.string==unicode("每股收益:","utf-8"): mgsy = details.next_sibling.next_sibling.string[:-1] print mgsy[:-1] elif details.string==unicode("净利润:","utf-8"): jlr = details.next_sibling.next_sibling.string[:-2] print jlr[:-2] elif details.string==unicode("净利润增长率:","utf-8"): jlrzzl = details.next_sibling.next_sibling.string[:-1] print jlrzzl[:-1] elif details.string==unicode("营业收入:","utf-8"): yysr = details.next_sibling.next_sibling.string[:-2] print yysr[:-2] elif details.string==unicode("每股现金流:","utf-8"): mgxjl = details.next_sibling.next_sibling.string[:-1] print mgxjl[:-1] elif details.string==unicode("每股公积金:","utf-8"): mggjj = details.next_sibling.next_sibling.string[:-1] print mggjj[:-1] elif details.string==unicode("每股未分配利润:","utf-8"): mgwfplr = details.next_sibling.next_sibling.string[:-1] print mgwfplr[:-1] elif details.string==unicode("总股本:","utf-8"): zgb = details.next_sibling.next_sibling.string[:-1] print zgb[:-1] elif details.string==unicode("流通股:","utf-8"): ltg = details.next_sibling.next_sibling.string[:-1] print ltg[:-1] #从东方财富抓取数据 if stockno[0:2]=="60": dfUrl = "http://quote.eastmoney.com/sh"+stockno+".html" else: dfUrl = "http://quote.eastmoney.com/sz"+stockno+".html" request = urllib2.Request(dfUrl) response = urllib2.urlopen(request) dfcontent = response.read() dfSoup = BeautifulSoup(dfcontent,"lxml") csvout = csv.writer(sys.stdout) hxTableTag = dfSoup.find("table",id="rtp2") print "hxtabletag" print hxTableTag if hxTableTag!=None: trContent = hxTableTag.find_all("tr") dtsyl = trContent[0].find_all("td")[1].text[6:] sjl = trContent[1].find_all("td")[1].text[4:] mlv = trContent[4].find_all("td")[0].text[4:][:-1] jlv = trContent[4].find_all("td")[1].text[4:][:-1] roe = trContent[5].find_all("td")[0].text[4:][:-1] fzl = trContent[5].find_all("td")[1].text[4:][:-1] zsz = trContent[6].find_all("td")[1].text[3:][:-1] print "zsz"+zsz ltsz = trContent[7].find_all("td")[1].text[3:][:-1] print "jlv" +trContent[4].find_all("td")[1].text[4:] #获得解禁时间 jjSql = "select min(jjsj) jjsj from stock_jjsj where stockno='"+stockno+"' and jjsj>='"+importdate+"'" cursor.execute(jjSql) jjRow = cursor.fetchone() print jjRow if jjRow[0] ==None: jjsj = "" else: jjsj = jjRow[0] #获得上月收盘价 #获得本日收盘价 #获得上个月 pre_month = dateutil.get_pre_month() print pre_month syspjSQL ="select * from stock_day_data where date=(select max(date) from stock_day_data where code='"+stockno+"' and left(date,7)='"+pre_month+"') and code='"+stockno+"' " brspjSQL = "select * from stock_day_data where date like'"+importdate+"%' and code='"+stockno+"'" cursor.execute(syspjSQL) syspjRow = cursor.fetchone() print syspjRow if syspjRow==None: syspj = "" else: syspj = str(syspjRow[4]) if syspj is None : syspj="" #本日收盘价 cursor.execute(brspjSQL) brspjRow = cursor.fetchone() print brspjRow if None==brspjRow: print "brspj" brspj = "" else: brspj = str(brspjRow[4]) tenHolder = getTenHolder(stockno) if tenHolder.find("'") !=-1: tenHolder = tenHolder.replace("'", "\\'") gdrs = getGdbhs(stockno) insertsql = "insert into stock_day_report (stockno,stockname,importdate,ssdy,sjgn,cplx,sshy,sssj,mgjzc,mgsy,jlr,jlrzzl,yysr,mgxjl,mggjj,mgwfplr,zgb,ltg," \ "zsz,ltsz,sjl,dtsyl," \ "mlv,jlv,roe,fzl,jjsj,syspj,brspj,tenholder,gdrs" \ ") " \ "values(\'"+stockno+"\',\'"+stockname+"\',\'"+importdate+"\',\'"+ssdy+"\',\'"+sjgn+"\',\'"+cplx+"\',\'"+sshy+"\',\'"+sssj+"\',\'"+mgjzc+"\',\'"+mgsy+"\',\'"+jlr+"\',\'"+jlrzzl+"\',\'"+yysr+"\',\'"+mgxjl+"\',\'"+mggjj+"\',\'"+mgwfplr+"\',\'"+zgb+"\',\'"+ltg+"\'," \ "\'"+zsz+"\',\'"+ltsz+"\',\'"+sjl+"\',\'"+dtsyl+"\',\'"+mlv+"\',\'"+jlv+"\',\'"+roe+"\',\'"+fzl+"\',\'"+jjsj+"\',\'"+syspj+"\',\'"+brspj+"\',\'"+tenHolder+"\',\'"+gdrs+"\')" print insertsql cursor.execute(insertsql) conn.commit() cursor.close() df = pd.read_sql("select * from stock_day_report where importdate='"+importdate+"' and brspj!=0 order by sshy,ltg,zgb",conn) df.rename(columns={'stockno':'股票代码','stockname':'股票名称','sshy':'所属行业','sjgn':'涉及概念','brspj':'本日收盘价','syspj':'上月收盘价','ltg':'流通股','zgb':'总股本','jlr':'净利润','yysr':'营业收入','mgjzc':'每股净资产','mgsy':'每股收益','jlrzzl':'净利润增长率','mgxjl':'每股现金流','mggjj':'每股公积金','mgwfplr':'每股未分配利润','dtsyl':'动态市盈率','sjl':'市净率','ltsz':'流通市值','zsz':'总市值','jjsj':'解禁时间','mlv':'毛利率','jlv':'净利率','roe':'ROE','fzl':'负债率','importdate':'导入日期','sssj':'上市时间','cplx':'产品类型','ssdy':'所属地域','lrzy':'利润总额','tenholder':'十大持股人','gdrs':'股东人数'}, inplace=True) print df #首先执行相关数据导入操作 df.to_csv('d:/'+importdate+'.csv',encoding='gbk', index=False) if mailutil.send_mail("每日股票报告", importdate +"report", r"d:/"+importdate+".csv"): print "1111" else: print "2222!" except Exception,e: print e.message print e
def listenZhangting(self, codeArr): isEnd = False line = '' forbidden_line = '' forbidden_control_msg = {} forbidden_control_msg['count'] = 0 forbidden_control_msg['limit'] = 3 loopCount = 0 rate_underZero_codes = [] while True: if du.getHMS() > '11:30:00' and du.getHMS() < '12:59:30': time.sleep(10) print('sleeping...') obj = Action.getForbiddenCodeString(forbidden_line, forbidden_control_msg) forbidden_control_msg = obj['msg'] forbidden_line = obj['line'] # if self.threadLocal.buyCount == Config.positions.__len__(): # isEnd = True # lu.log("----------------->仓位数组已使用完") if codeArr.__len__() == 0: isEnd = True lu.log("----------------->无监听标的") if self.isTime2Exit(): isEnd = True lu.log("----------------->不在设置的交易时间内") time.sleep(3) if isEnd is True: break begintime = clock() i = 0 if loopCount == 0 or loopCount % Config.LOOPCOUNT_2_REFRESH_NONEEDTOCHECKISZHANGTING == 0: print('重新分配监听优化数组,放弃监听') rate_underZero_codes = [] while i < codeArr.__len__(): code = codeArr[i] if code in line or code in forbidden_line: i = i + 1 continue i = i + 1 # 涨跌幅过滤 if code in rate_underZero_codes: continue dataFrame = self.ds.getDataFrame(code) if dataFrame is None: continue if loopCount == 0 or loopCount % Config.LOOPCOUNT_2_REFRESH_NONEEDTOCHECKISZHANGTING == 0: rate = self.ds.getRate(dataFrame) if rate < Config.RATE_2_Listen: print('统计入涨跌幅优化数组,放弃监听->' + code + ":" + str(rate)) rate_underZero_codes.append(code) else: print('进入监听名单->' + code + ":" + str(rate)) # 涨跌幅过滤 if code in rate_underZero_codes: continue if self.ds.isZhangting(dataFrame) is False: continue #Test # if loopCount >= 0: # continue name = self.ds.getStockName(dataFrame) zhangtingprice = self.ds.getZhangtingPrice(dataFrame) if self.isShouldBuy(): #posi = Config.positions[self.threadLocal.buyCount] posi = '100' if posi != '0': Action.buyAction(code, name, zhangtingprice, posi) self.threadLocal.buyCount = self.threadLocal.buyCount + 1 isEnd = True break else: lu.log( '------------------------------------->posi == "0" 放弃买入' ) else: lu.log('------------------------------------->未达到条件放弃买入') line = line + code + '~' break print('$$$$$$$$$$$$zhangtingcodes: ' + line + ' - zhangtingcount: ' + str(line.count('~'))) print( '$$$$$$$$$$$$spend------------------------------------------------>' + str(clock() - begintime)) time.sleep(1) loopCount = loopCount + 1 print( '$$$$$$$$$$$$loopC------------------------------------------------>' + str(loopCount) + "->" + str(Config.LOOPCOUNT_2_REFRESH_NONEEDTOCHECKISZHANGTING))
def risk(code, startYMD=du.getPreDayYMD(1)): days_ForCaculating = 20 today = startYMD preOneDay = du.getPreDayYMD(days_ForCaculating + 10, startYMD) df = ts.get_k_data(code, preOneDay, today) pre_close = 0 riskcount = 0 yesterdayIsZhangting = False count = 0 little_shangying_count = 0 isHasPlus4PercentDay = False pre_o_rate = 0 pre_h_rate = 0 pre_c_rate = 0 for x in range(len(df.index)): if x == 0: pre_close = df['close'].iloc[x] continue # code = df['code'].iloc[x] # date = df['date'].iloc[x] # low = df['low'].iloc[x] # volume = df['volume'].iloc[x] open = df['open'].iloc[x] close = df['close'].iloc[x] high = df['high'].iloc[x] # 当日最高阶幅度 h_rate = round(float((high - pre_close) / pre_close) * 100, 2) # 当日收盘幅度 c_rate = round(float((close - pre_close) / pre_close) * 100, 2) # 当日开盘幅度 o_rate = round(float((open - pre_close) / pre_close) * 100, 2) # 保证取到14天的数据 if count + days_ForCaculating < len(df.index): pre_close = df['close'].iloc[x] count = count + 1 yesterdayIsZhangting = False if high == close and h_rate > 9.5 and o_rate > 3: yesterdayIsZhangting = True continue #! 板后统计开盘溢价 if yesterdayIsZhangting == True: if o_rate > 0: #第一等级风险:虽然高开,但是一路低走,人气涣散 if o_rate > 0 and (o_rate - c_rate) > 6: riskcount = riskcount + (c_rate - o_rate) * 1000 elif riskcount < 0: riskcount = riskcount + o_rate * 1000 else: riskcount = riskcount + o_rate * 3 #print("板后统计开盘溢价: " + date) else: riskcount = riskcount + o_rate #print("板后亏钱开盘: " + str(o_rate*1000)) yesterdayIsZhangting = False #!第二等级风险:烂板天 if h_rate > 9.5 and h_rate != c_rate and h_rate - c_rate > 5: #print("烂板: " + date) riskcount = riskcount + (c_rate - h_rate) * 1000 #a = 1 else: # ! 高开统计(非烂板基础上) if c_rate > 2 and o_rate > 1 and h_rate < 8: riskcount = riskcount + o_rate #print("高开高走统计: " + date) # !第三等级风险:长上影+长阴实体 if h_rate - o_rate > 4 and o_rate - c_rate > 4: riskcount = riskcount + (c_rate - h_rate) * 1000 if h_rate - o_rate > 2: if little_shangying_count > 0.618 * days_ForCaculating: riskcount = riskcount - 1 little_shangying_count = little_shangying_count + 1 # 统计这么多天来,是否存在实体涨幅大于4 if c_rate > 4 and c_rate - o_rate > 2: isHasPlus4PercentDay = True if h_rate > 9.5 and (h_rate - c_rate) < 1: yesterdayIsZhangting = True pre_close = df['close'].iloc[x] pre_o_rate = o_rate pre_h_rate = h_rate pre_c_rate = c_rate count = count + 1 if riskcount < 1 and riskcount > -1: riskcount = 0 if isHasPlus4PercentDay == False: riskcount = riskcount - 10 return riskcount
bd.updateMasterDate("LAST_UPDATED_DATE", last_updated_date, stock_code_163) logger.info("LAST DATE UPDATED") if str(index_indicator) == "1": rf = bd.getRecoveryFactor(stock_code_163, stock_code_sina, start_date) bd.insertRecoveryFactor(stock_code, rf) logger.info("INSERT RF DATA COMPLETED") else: logger.error("NO DATA IS RECEIVED FROM 163") result_set = dbu.query(sql) if len(result_set) > 0: logger.info("NOT ALL STOCKS ARE UPDATED, WAIT 10 MINUTES FOR NEXT UPDATE") tm.sleep(10*60) return "COMPLETED" if __name__ == '__main__': end_date = date.today() if bd.isHoliday(du.convertDateToString(end_date, "%Y-%m-%d")) == "W": logger.info("TODAY IS WORKING DAY, CONTINUE") if smartUpdate(end_date) == "COMPLETED": bd.callTechUpdateProc() logger.info("CALL PROC TO UPDATE TECH DATA") tm.sleep(60*5) sa.analyzeAllStocks(end_date) logger.info("ANALYSIS COMPLETE") else: logger.info("PROGRAM EXITS BECAUSE OF HOLIDAY")
# -*- coding: utf-8 -*- import traceback # import hashlib from DateUtil import * from DbUtil import * VIP_USE_TIMES = (5, 80, 600, 1300, 0) # 月会员3次 # 季度10次 # 半年会员21次 # 年会员43次 # 永久会员 db = DbUtil() date_util = DateUtil() def is_use_forever(vip_type): if vip_type == VipType.forever: return True else: return False # def get_use_times(vip_type): # if vip_type in VipType: # return VIP_USE_TIMES[vip_type.value] # else: # return 0
def getZhangTingCodeArr(date): preDate = du.getPreDayYMD(1, date) qw = '非st;'+preDate+'日涨跌幅;'+date+'日最大涨幅>9.89;'+preDate+'日涨跌幅<9' return getCodeArr(qw)