python uiautomator 安卓自动化测试
本教程使用的是win7 系统 - python 2.7
1. 安装uiautomator 同
时确保你的手机连上电脑后,adb可以正常使用, 在命令行运行adb devices,能够有设备的id输出
2. 获取手机的基本信息:
导入uiautomator包:
from uiautomator import device as d
这样子就可以使用d操作手机,获取手机信息。
输出的内容:
手机的分辨率
displayWidth 1080
displayHeight 1920
当前打开的包名: currentPackageName com.smartisanos.keyguard
3.
打开home主界面,然后查看时候有设置这个选项或者图标文字。
d(text=u'设置').wait.exists(timeout=10000)
如果在10s内找到这个字符,那么这一行就返回True, 否则返回False
收起阅读 »
1. 安装uiautomator 同
pip install uiautomator
时确保你的手机连上电脑后,adb可以正常使用, 在命令行运行adb devices,能够有设备的id输出
2. 获取手机的基本信息:
导入uiautomator包:
from uiautomator import device as d
这样子就可以使用d操作手机,获取手机信息。
info= d.info
print info
print type(info)
for i in info:
print i,info[i]
输出的内容:
{u'displayRotation': 0, u'displaySizeDpY': 640, u'displaySizeDpX': 360, u'screenOn': False, u'currentPackageName': u'com.smartisanos.keyguard', u'productName': u'icesky_msm8992', u'displayWidth': 1080, u'sdkInt': 22, u'displayHeight': 1920, u'naturalOrientation': True}
<type 'dict'>
displayRotation 0
displaySizeDpY 640
displaySizeDpX 360
screenOn False
currentPackageName com.smartisanos.keyguard
productName icesky_msm8992
displayWidth 1080
sdkInt 22
displayHeight 1920
naturalOrientation True
手机的分辨率
displayWidth 1080
displayHeight 1920
当前打开的包名: currentPackageName com.smartisanos.keyguard
3.
d.press.home()
result=d(text=u'设置').wait.exists(timeout=10000)
#单位是毫秒, 如果timeout还没有找到,就返回false
print "next"
if result:
print "You press setting"
else:
print "You don't touch any thing"
打开home主界面,然后查看时候有设置这个选项或者图标文字。
d(text=u'设置').wait.exists(timeout=10000)
如果在10s内找到这个字符,那么这一行就返回True, 否则返回False
收起阅读 »
为什么 2017 年 6 月 京东很多显卡断货
原来如此!!!!
以太坊一个月内4倍,现在显卡挖以太坊,3个月以内回本。还有做什么生意比这好的吗?各路资本都涌入了,显卡自然涨价。
显卡芯片生产速度完全跟不上显卡需求增长速度,A卡更是难买。
挖以太坊优先考虑RX470、RX480、RX570、RX580,A卡买不到才用N卡。
N卡挖以太坊用GTX1060和GTX1070,GTX1050、GTX1050Ti、GTX1080、GTX1080Ti挖以太坊效率太低,不适合用。
不仅显卡涨价了,连四川水电都涨价了。以前四川有很多矿场用水电站直供电,用电价格0.2元多一点,现在四川水电价格都涨起来了。新建矿场都去新疆和云南了。
也不能说显卡完全断货,只要愿意出价高,还是能买到。
链接:https://www.zhihu.com/question ... 47044
来源:知乎
收起阅读 »
以太坊一个月内4倍,现在显卡挖以太坊,3个月以内回本。还有做什么生意比这好的吗?各路资本都涌入了,显卡自然涨价。
显卡芯片生产速度完全跟不上显卡需求增长速度,A卡更是难买。
挖以太坊优先考虑RX470、RX480、RX570、RX580,A卡买不到才用N卡。
N卡挖以太坊用GTX1060和GTX1070,GTX1050、GTX1050Ti、GTX1080、GTX1080Ti挖以太坊效率太低,不适合用。
不仅显卡涨价了,连四川水电都涨价了。以前四川有很多矿场用水电站直供电,用电价格0.2元多一点,现在四川水电价格都涨起来了。新建矿场都去新疆和云南了。
也不能说显卡完全断货,只要愿意出价高,还是能买到。
链接:https://www.zhihu.com/question ... 47044
来源:知乎
收起阅读 »
dataframe读取excel文件第一行是列名如何跳过
比如数据如下:
那么怎样不把第一行的数据读入呢? 或者说把第一行的数据给忽略掉呢?
原文链接:http://30daydo.com/article/209
欢迎转载,转载请注明出处。 收起阅读 »
股票代码 股票简称 涨跌幅(%) 现价(元) 收盘价:前复权(元) 区间涨跌幅:前复权(%) 交易状态
2016.07.13 2016.07.13 2016.07.13
300501.SZ 海顺新材 10.00 144.65 131.50 3.06 交易
300384.SZ 三联虹普 -0.67 57.63 58.02 5.97 交易
300506.SZ 名家汇 5.98 60.98 57.54 5.52 交易
002572.SZ 索菲亚 1.03 56.80 56.22 -0.65 交易
600419.SH 天润乳业 4.66 57.10 54.56 0.06 交易
300494.SZ 盛天网络 4.86 54.19 51.68 2.64 交易
300369.SZ 绿盟科技 2.36 45.50 44.45 -0.96 交易
002113.SZ 天润数娱 -1.89 43.55 44.39 7.14 交易
002190.SZ 成飞集成 10.01 47.17 42.88 10.01 交易
600391.SH 成发科技 3.39 43.56 42.13 1.54 交易
002699.SZ 美盛文化 3.25 40.99 39.70 9.97 交易
603027.SH 千禾味业 3.70 40.39 38.95 -1.77 交易
600893.SH 中航动力 2.03 39.29 38.51 0.44 交易
603005.SH 晶方科技 4.34 40.16 38.49 2.89 交易
300339.SZ 润和软件 2.50 36.98 36.08 1.32 交易
300246.SZ 宝莱特 3.92 37.42 36.01 -0.91 交易
002368.SZ 太极股份 4.23 37.50 35.98 1.75 交易
000555.SZ 神州信息 0.35 34.66 34.54 -0.75 交易
002745.SZ 木林森 9.15 37.10 33.99 -0.23 交易
002589.SZ 瑞康医药 -1.49 33.00 33.50 4.82 交易
002007.SZ 华兰生物 3.31 33.36 32.29 -0.89 交易
002456.SZ 欧菲光 0.32 31.60 31.50 7.88 交易
002759.SZ 天际股份 9.99 34.01 30.92 0.00 重大事项,停牌自2016-07-12起连续停牌
那么怎样不把第一行的数据读入呢? 或者说把第一行的数据给忽略掉呢?
sheet1 = pd.read_excel('test.xls', header=0, skiprows=[0] )
原文链接:http://30daydo.com/article/209
欢迎转载,转载请注明出处。 收起阅读 »
30天获取证券从业资格证和基金从业资格证
证券从业资格考试
基金从业资格考试
这两门都是从业考试,所以难度不会太大。只要你能够大概把书翻一遍,或者看网上的视频教程,然后刷下题库,正常来说,通过是没问题的。
(网上说基金从业的基础知识通过率才30%都不到。这也让我觉得不可思议,怀疑不少人是去裸考的吧)
这里只是想跟大家分享一下30天内让自己完成一个时间的一个心理过程和行为过程。
首先要强迫自己去做,那么就让自己投入一些沉没成本。
报考证券从业资格和基金从业资格这两门考试,每一门需要120块的考试费用,考试费用交了后,无论你去不去考试钱都没得退回来。 因为前期投入了金钱,后期心里就不甘心让自己钱打水漂了,学习的动力会更加充足。
对于能够见得着的金钱成本,很多人都很精明,能够看得到,且能够量化到具体数额。
可是,平时我们投入的时间成本,有多少人能够精确的量化出来? 计划了3个月内学会一门语言,制定了相应的学习计划,然后执行了3周后, 因为各种原因,比如公司年会准备,周末team building等,让你的学习计划中断了。 而后,因为年会或者team building之后身体太累,你就把学习新语言的计划往后挪。就是因为这一挪,破坏了你的计划的连贯性,而且,有了第一次,肯定就会有第二次,第三次。 最后很可能的结果就是没能在3个月完成你学会一门新语言的计划。
在这里,你能够算出你因为前期投入的时间,而沉没的成本吗?
所以,换一本漂亮昂贵的日记本,买一套好的运动服,你坚持写日记,跑步的动力就会比随意拿个本子或穿件山寨耐克要充足好多。
当然,上面是对那些本来计划容易被随意打断的人而言。 对于那些自律成魔的人, 或者兴趣爱好所致,一般不需要像上面说的那样强制自己投入大量沉没成本。 收起阅读 »
监控聚币网行情 并实时发送到微信
最近由于好友推荐我入坑了国内的山寨币,所以顺便研究了下聚币网的API。 不过网页版的聚币网和手机版的做的不好,而且因为是7x24 小时交易,自己没有那么多的精力盯盘,所以写了python代码进行监控。
程序运行后,使用扫一扫登录。
coin_list=['zet','doge'] price_list=[[0.2,0.13],[0.03,0.024]]
通过这个参数,设置你想要监控的币种和目标价格。
同时程序支持发送给多个用户。
http://30daydo.com/article/205
转载请注明出处 收起阅读 »
# -*-coding=utf-8-*-
__author__ = 'Rocky'
'''
http://30daydo.com
Contact: weigesysu@qq.com
'''
import random
import hashlib
import hmac,time
import smtplib
from email.mime.text import MIMEText
from email import Utils
import threading
import requests,datetime,itchat
from toolkit import Toolkit
class Jubi_web():
def __init__(self, send=None):
cfg = Toolkit.getUserData('data.cfg')
self.public_key = cfg['public_key']
self.private_key = cfg['private_key']
self.send=send
from_mail = cfg['from_mail']
password = cfg['password']
to_mail = cfg['to_mail']
smtp_server = 'smtp.qq.com'
self.server = smtp_server
self.username = from_mail.split("@")[0]
self.from_mail = from_mail
self.password = password
self.to_mail = to_mail
self.coin_list=['IFC','DOGE','EAC','DNC','MET','ZET','SKT','YTC','PLC','LKC',
'JBC','MRYC','GOOC','QEC','PEB','XRP','NXT','WDC','MAX','ZCC',
'HLB','RSS','PGC','RIO','XAS','TFC','BLK','FZ','ANS','XPM','VTC',
'KTC','VRC','XSGS','LSK','PPC','ETC','GAME','LTC','ETH','BTC']
# 初始化邮箱设置读取需要股票信息
# 这样子只登陆一次
if self.send == 'msn':
try:
self.smtp = smtplib.SMTP_SSL(port=465)
self.smtp.connect(self.server)
self.smtp.login(self.username, self.password)
except smtplib.SMTPException, e:
print e
return 0
if send=='wechat':
self.w_name=u'xxxxx'
itchat.auto_login(hotReload=True)
account=itchat.get_friends(self.w_name)
def send_wechat(self,name,content):
w_content=name+' '+content
itchat.send(w_content,toUserName=self.toName)
time.sleep(1)
itchat.send(w_content,toUserName='filehelper')
def send_text(self, name, content):
subject = '%s' % name
self.msg = MIMEText(content, 'plain', 'utf-8')
self.msg['to'] = self.to_mail
self.msg['from'] = self.from_mail
self.msg['Subject'] = subject
self.msg['Date'] = Utils.formatdate(localtime=1)
try:
self.smtp.sendmail(self.msg['from'], self.msg['to'], self.msg.as_string())
self.smtp.quit()
print "sent"
except smtplib.SMTPException, e:
print e
return 0
def warming(self, coin, up_price, down_price):
url = 'https://www.jubi.com/api/v1/ticker/'
while 1:
time.sleep(5)
try:
data = requests.post(url, data={'coin': coin}).json()
except Exception,e:
print e
print "time out. Retry"
time.sleep(15)
continue
current = float(data['last'])
if current >= up_price:
print "Up to ", up_price
print "current price ",current
if self.send=='msn':
self.send_text(coin,str(current))
if self.send=='wechat':
self.send_wechat(coin,str(current))
time.sleep(1200)
if current <= down_price:
print "Down to ", down_price
print "current price ",current
if self.send=='msn':
self.send_text(coin,str(current))
if self.send=='wechat':
self.send_wechat(coin,str(current))
time.sleep(1200)
#上面的内容尽量不用修改。
def getContent(self):
url = 'https://www.jubi.com/api/v1/trade_list'
params_data = {'key': 'x', 'signature': 'x'}
s = requests.get(url=url, params=params_data)
def getHash(self, s):
m = hashlib.md5()
m.update(s)
return m.hexdigest()
def sha_convert(self, s):
return hashlib.sha256(self.getHash(s)).hexdigest()
def get_nonce(self):
lens = 12
return ''.join([str(random.randint(0, 9)) for i in range(lens)])
def get_signiture(self):
url = 'xxxxxxxxx'
coin = 'zet'
nonce = self.get_nonce()
# sha=self.sha_convert(private_key)
md5 = self.getHash(self.private_key)
message = 'nonce=' + nonce + '&' + 'key=' + self.public_key
# print message
signature = hmac.new(md5, message, digestmod=hashlib.sha256).digest()
# print signature
# req=requests.post(url,data={'signature':signature,'key':public_key,'nonce':nonce,'coin':'zet'})
req = requests.post(url, data={'coin': coin})
print req.status_code
print req.text
def real_time_ticker(self, coin):
url = 'xxxxxxxx'
try:
data = requests.post(url, data={'coin': coin}).json()
#print data
except Exception ,e:
print e
return data
def real_time_depth(self, coin):
url = 'xxxxxxxxx'
data = requests.post(url, data={'coin': coin}).json()
print data
data_bids = data['bids']
data_asks = data['asks']
print "bids"
for i in data_bids:
print i[0],
print ' ',
print i[1]
print "asks"
for j in data_asks:
print j[0],
print ' ',
print j[1]
def list_all_price(self):
for i in self.coin_list:
print i,
print " price: ",
p=self.real_time_ticker(i.lower())
if p is not None:
print p[u'last']
def getOrder(self,coin):
url='https://www.jubi.com/api/v1/orders/'
try:
req=requests.get(url,params={'coin':coin})
except Exception,e:
print e
data=req.json()
return data
# recent 100 trade turn over
def turnover(self,coin):
i=coin.lower()
coins=Toolkit.getUserData('coins.csv')
total=long(coins[i])
[i] [/i]p=self.getOrder(i)
print p
amount=0.00
for j in p:
t= j[u'amount']
amount=float(t)+amount
#current=float(self.real_time_ticker(i)[u'last'])
turn_over=amount*1.00/total*100
print turn_over
def multi_thread(self,coin_list,price_list):
thread_num=len(coin_list)
thread_list=
for i in range(thread_num):
t=threading.Thread(target=self.warming, args=(coin_list,price_list[0],price_list[1]),)
thread_list.append(t)
for j in thread_list:
j.start()
for k in thread_list:
k.join()
if __name__ == '__main__':
obj = Jubi_web(send='wechat')
coin_list=['zet','doge']
price_list=[[0.2,0.13],[0.03,0.024]]
obj.multi_thread(coin_list,price_list)
[/i]
程序运行后,使用扫一扫登录。
coin_list=['zet','doge'] price_list=[[0.2,0.13],[0.03,0.024]]
通过这个参数,设置你想要监控的币种和目标价格。
同时程序支持发送给多个用户。
http://30daydo.com/article/205
转载请注明出处 收起阅读 »
TA-Lib中MOM的计算公式
MOM是价格动能。
TA-Lib中MOM的参数有
ouput=talib.MOM(closed,timeperiod=5)
closed是你传入的价格list,可以是每天的收盘价,开盘价,或者你想要计算的所有价格。
timeperiod是你要计算的时间周期。
假如timeperiod=5,那么,这个计算的输出值就是 p5-p0, 如果今天是1月6日,股价为14块,而1月1日的股价为12块,那么这里通过MOM运算,得出来的就是14-12=2 这个值了。 然后如此类推,如果今天是1月7日,股价为15块,而1月2日股价为11块,那么MOM得出的是4,这样子获取到所有的值,绘制成曲线,就是MOM的曲线了。 收起阅读 »
TA-Lib中MOM的参数有
ouput=talib.MOM(closed,timeperiod=5)
closed是你传入的价格list,可以是每天的收盘价,开盘价,或者你想要计算的所有价格。
timeperiod是你要计算的时间周期。
假如timeperiod=5,那么,这个计算的输出值就是 p5-p0, 如果今天是1月6日,股价为14块,而1月1日的股价为12块,那么这里通过MOM运算,得出来的就是14-12=2 这个值了。 然后如此类推,如果今天是1月7日,股价为15块,而1月2日股价为11块,那么MOM得出的是4,这样子获取到所有的值,绘制成曲线,就是MOM的曲线了。 收起阅读 »
Price Momentum
Understanding Price Momentum
Today's stock market is more than just a place to buy and hold securities. Many investors prefer to move quickly in and out of the market. That's just one reason technical strategies, such as price momentum, have grown in popularity.
In this article, we're going to provide some insights into the investment strategy known as price momentum. We'll explain why some theorists believe this model offers investors a short-term profit opportunity. We'll also talk about the pros and cons of this approach, including the long-term opportunity that price momentum provides the market.
What is Price Momentum?
Additional Resources
Calculating Stock Prices
Capital Asset Pricing Model
Arbitrage Pricing Theory
Stock Beta and Volatility
Random Walk Theory Explained
The theory behind price momentum is relatively simple. Generally, we can talk about it in two ways; the first has to do with buying stocks:
Stocks that had relatively high returns over the past three to twelve months should return to investors above average returns over the next three to twelve months.
The theory also provides guidance on the right time to sell stocks:
Stocks that had relatively poor returns over the past three to twelve months should return to investors below average returns over the next three to twelve months.
This investment strategy was first theorized by Narasimhan Jegadeesh and Sheridan Titman in their publication "Returns to Buying Winners and Selling Losers: Implications for Stock Market Efficiency," which was published in The Journal of Finance back in March 1993.
Price Momentum Model
The model is based on the assumption the stock market is not completely efficient. This is something that most economists believe to be true. The two most practical explanations for the performance of this model include:
Investors are taking advantage of human behavior, including a "herding" mentality and / or an overreaction to news.
Investors employing a price momentum strategy are taking on additional risk; therefore, higher returns are required to compensate these investors for the risk they're assuming.
Within their study, Jegadeesh and Titman examined a large number of trading strategies. One of the conclusions from that study is stated below:
Buying past winners, and selling past losers, allowed investors to achieve above average returns over the period 1956 to 1989. In particular, stocks that were classified based on their prior 6-month performance, and held for 6 months realized an excess return of over 12% per year on average.
The Momentum Formula
Technical stock analysts understand the value this particular technique provides. They're constantly crunching numbers to see if patterns emerge. The actual formula for calculating price momentum is really quite simple, and takes the form:
M = CP - CPn
Where:
M = Momentum
CP = Closing price in the current period
CPn = Closing price N periods ago
For example, if a stock was trading at $35 per share six months ago, and is currently trading at $40 per share, then its six-month price momentum would be 40 minus 35 or 5.
Unfortunately, this formula is not normalized, and this makes it difficult to compare stocks selling at different price points. A stock experiencing a 1% price movement from $300 to $303 would have a momentum value of three. A second stock experiencing a 100% increase in price from $3 to $6 also has a momentum value of three.
Rate of Change Formula
One of the ways technical stock analysts can work around this problem is by calculating a rate of change value, which normalizes momentum:
RoC = (CP - CPn) / CPn
Where:
RoC = Rate of Change
CP = Closing price in the current period
CPn = Closing price N periods ago
Using the example above, the stock selling at $303 per share that was trading at $300 six months ago would have a Rate of Change of 3 / 300 or 1%, while the second stock would have a Rate of Change of 3 / 3 or 100%.
Momentum and Moving Averages
A second way that stock analysts use price momentum is in conjunction with moving averages. Here the technical analyst makes a series of price momentum calculations and plots these along with a moving average of the momentum.
For example, the plot might contain 28-day moving averages along with daily price momentum figures. Buy signals can be triggered when price momentum travels above its moving averages, and stays there for several trading days. Sell signals can be triggered when momentum travels below its moving average.
Contrarian Investing
As mentioned in the beginning of this article, this model tells investors they should buy past winners and sell past losers. Because this theory is based on past price performance, or historical market information, price momentum is a trading model that technical analysts would follow. Fundamental analysts believe that a stock is bought and sold based on its intrinsic value, including the company's potential to produce profits for its shareholders in the future.
Fortunately, fundamental analysts can also use price momentum to their advantage by adopting what is termed a contrarian investing strategy. Contrarian investors take the opposite approach that a theory advocates. For example, a fundamental analyst might conclude:
A stock that has been rising may now be overvalued, while a stock that has been falling may be undervalued.
One could argue the further a stock moves from its true market value, the greater the opportunity for profits. By tracking price momentum, and using this as a screening tool, fundamental analysts can then assess if a stock is truly undervalued or overvalued by studying the company's long-term financial health and earnings power.
About the Author - Understanding Price Momentum (Last Reviewed on November 22, 2016)
http://30daydo.com/article/203
收起阅读 »
Today's stock market is more than just a place to buy and hold securities. Many investors prefer to move quickly in and out of the market. That's just one reason technical strategies, such as price momentum, have grown in popularity.
In this article, we're going to provide some insights into the investment strategy known as price momentum. We'll explain why some theorists believe this model offers investors a short-term profit opportunity. We'll also talk about the pros and cons of this approach, including the long-term opportunity that price momentum provides the market.
What is Price Momentum?
Additional Resources
Calculating Stock Prices
Capital Asset Pricing Model
Arbitrage Pricing Theory
Stock Beta and Volatility
Random Walk Theory Explained
The theory behind price momentum is relatively simple. Generally, we can talk about it in two ways; the first has to do with buying stocks:
Stocks that had relatively high returns over the past three to twelve months should return to investors above average returns over the next three to twelve months.
The theory also provides guidance on the right time to sell stocks:
Stocks that had relatively poor returns over the past three to twelve months should return to investors below average returns over the next three to twelve months.
This investment strategy was first theorized by Narasimhan Jegadeesh and Sheridan Titman in their publication "Returns to Buying Winners and Selling Losers: Implications for Stock Market Efficiency," which was published in The Journal of Finance back in March 1993.
Price Momentum Model
The model is based on the assumption the stock market is not completely efficient. This is something that most economists believe to be true. The two most practical explanations for the performance of this model include:
Investors are taking advantage of human behavior, including a "herding" mentality and / or an overreaction to news.
Investors employing a price momentum strategy are taking on additional risk; therefore, higher returns are required to compensate these investors for the risk they're assuming.
Within their study, Jegadeesh and Titman examined a large number of trading strategies. One of the conclusions from that study is stated below:
Buying past winners, and selling past losers, allowed investors to achieve above average returns over the period 1956 to 1989. In particular, stocks that were classified based on their prior 6-month performance, and held for 6 months realized an excess return of over 12% per year on average.
The Momentum Formula
Technical stock analysts understand the value this particular technique provides. They're constantly crunching numbers to see if patterns emerge. The actual formula for calculating price momentum is really quite simple, and takes the form:
M = CP - CPn
Where:
M = Momentum
CP = Closing price in the current period
CPn = Closing price N periods ago
For example, if a stock was trading at $35 per share six months ago, and is currently trading at $40 per share, then its six-month price momentum would be 40 minus 35 or 5.
Unfortunately, this formula is not normalized, and this makes it difficult to compare stocks selling at different price points. A stock experiencing a 1% price movement from $300 to $303 would have a momentum value of three. A second stock experiencing a 100% increase in price from $3 to $6 also has a momentum value of three.
Rate of Change Formula
One of the ways technical stock analysts can work around this problem is by calculating a rate of change value, which normalizes momentum:
RoC = (CP - CPn) / CPn
Where:
RoC = Rate of Change
CP = Closing price in the current period
CPn = Closing price N periods ago
Using the example above, the stock selling at $303 per share that was trading at $300 six months ago would have a Rate of Change of 3 / 300 or 1%, while the second stock would have a Rate of Change of 3 / 3 or 100%.
Momentum and Moving Averages
A second way that stock analysts use price momentum is in conjunction with moving averages. Here the technical analyst makes a series of price momentum calculations and plots these along with a moving average of the momentum.
For example, the plot might contain 28-day moving averages along with daily price momentum figures. Buy signals can be triggered when price momentum travels above its moving averages, and stays there for several trading days. Sell signals can be triggered when momentum travels below its moving average.
Contrarian Investing
As mentioned in the beginning of this article, this model tells investors they should buy past winners and sell past losers. Because this theory is based on past price performance, or historical market information, price momentum is a trading model that technical analysts would follow. Fundamental analysts believe that a stock is bought and sold based on its intrinsic value, including the company's potential to produce profits for its shareholders in the future.
Fortunately, fundamental analysts can also use price momentum to their advantage by adopting what is termed a contrarian investing strategy. Contrarian investors take the opposite approach that a theory advocates. For example, a fundamental analyst might conclude:
A stock that has been rising may now be overvalued, while a stock that has been falling may be undervalued.
One could argue the further a stock moves from its true market value, the greater the opportunity for profits. By tracking price momentum, and using this as a screening tool, fundamental analysts can then assess if a stock is truly undervalued or overvalued by studying the company's long-term financial health and earnings power.
About the Author - Understanding Price Momentum (Last Reviewed on November 22, 2016)
http://30daydo.com/article/203
收起阅读 »
能否改变贫穷?
这是我的博士同事,Naphet,10月20日下午3点,他正式打出了他的博士论文,完成了四年的博士生涯。
Naphet 来自津巴布韦,世界上最混乱的国家之一(也许没有之一)。他没有谈他的童年,但我知道那一定不是我可以相比的。他从家乡出来后,成功地申请到了我们学校的 PhD,并且获得了英国国籍。这中间的努力,真的是我难以想象的。我至今深深记得,他去参加他的博士论文答辩的那天,抱着一本300多页厚厚的博士论文,像抱着一个婴儿那么珍惜。他的论文做定量的,主要工具是spss 程序,我曾经问过他从哪里学的 spss,他和我说,他在网上自学的。在读博的三年时间里,他就通过看 Youtube 的在线视频来从0开始学习 spss,如今,他的论文里充斥着各种精致的公式,而我的论文相比之下是如此的苍白无力。但他的论文还是没有通过答辩,因为我们学校新来的一个女老师质疑了他的方法,他很愤怒,因为他不理解为什么自己学校的老师竟然不支持他,但他没有气馁,而是继续每天早出晚归地来研究室修改论文。
他是有两个孩子的单亲爸爸。女儿已经上了高中,儿子才几个月大。他白天要在家里带孩子,晚上到火车站开出租车补贴学费和家用,挣来的钱还要寄回津巴布韦老家。因此他白天在家里通过远程桌面连接学校电脑学习,只有在晚上五点以后,他的女儿放学回来能照顾自己的弟弟,以及出租下班的时候才能来研究室学习。他周末的时候从来不回家,睡在出租车里,这样能多挣钱。而他一旦坐下,就会一动不动地全神贯注地开始工作。我有时候都很奇怪他从哪里来的精力,能够一边打工一边学习,并且能够如此专注。每每午夜十二点半,我离开研究室,而他仍然坐在电脑屏幕面前,专心调整着他公式的参数。
Naphet 的女儿非常优秀,她6岁的时候来到他身边。他充满自豪地同我分享了她女儿在 BBC 演讲比赛中获胜的演讲,并且告诉我她是英国青少年议会的议员,教区领袖,学校青少年协会的领导。“她的生活非常自律,比我更加自律,我从来没见过一个哪个17岁的孩子能够像她那么生活。”他对我说。在他女儿十五岁参加的那场演讲中,她把英语称之为杀手,并且分析了外国移民在英文环境中面对的语言困境。“我没有写一个字给她,都是她自己写的。我把这个视频用到了我的课程'社会学的想象力'中,这是一个可以作为博士论文的课题。”Naphet 非常自豪地对我说。我真的很震惊一个十五岁的女孩能够对环境有如此的敏感性。我提醒 Naphet 不要让她过于骄傲,他和我说:“我从来不夸奖她,我只是告诉她需要面对的挑战。她能够完成每一项挑战。”
他曾和我分享了他求职失败的经历,原因竟然是他过于优秀。三年博士期间,他获得了多个教师资格证书,比他的面试官还要优秀。结果可想而知,他精心准备的演讲反而害了他,实在是十分荒谬。但他没有气馁,他和我说:“我目前需要做的就是尽快博士毕业,好让自己有更多的自由去寻找更好的机会。”他的教学经验之丰富,远远超过了他的同辈,连他的面试官也只能嫉妒地说:“你实在是走的太快了。”我问他关于论文引用的问题,他却反过来向我求教我使用的引用软件,等我介绍完之后他掏出本子认真的记录着:“这个软件很好,我以后也要让我女儿试试。我现在就在为她准备大学需要面临的一切。”那一刻,我真的感觉到为什么人们说机会都是留给有准备的人。什么样的人是优秀的人?自强,自律,虚心,不骄不躁,永远充满信心,这样的父亲有这样的女儿,一点也不奇怪。
人在海外,社交圈很小,因此他给我的触动反倒更大。我第一次认真思考了何为一个有担当的男人。他没有钱,所以出去工作,他没有知识,所以上网自学。他面对着所有的不公正,却充满了自信的微笑。他对我说:“我要尽快完成我的博士,向我女儿证明我可以做到这一切。”是的,他一定可以的,我一点都不怀疑。反观我自己,在每一点上都放佛要被压榨出一个大大的“小”字来,我连对比的勇气都没有。他那岩石一般英朗的笑容背后有多少辛酸,多少委屈,我无法猜测,但我看到的是,他如同钟表一样准时的每天来到研究室,坐下,学习,创造着属于他和他女儿的未来。
他在论文的致谢部分写着:“献给我的母亲和我的四个兄弟,献给我过世的爸爸和五个叔叔。”
“我已经很多年没见过我母亲了。”他看着我读完了致谢之后说。
“你是怎么走过这一切的呢?”我问。
“压力。生活挤压着你,你只有前进。我所获得的一切都是靠我自己的双手得来的。”
他,是他们五兄弟中唯一走出来的。
很多时候,Naphet 这样的人是学不来的,但我想,他本身也许就是一个答案,在我们陷入迷茫和懦弱时,在我们给自己的人生拼命找借口时,带来一个声音:
贫穷不能改变吗?
能。
转至知乎:
https://www.zhihu.com/question/28098030/answer/68722565
收起阅读 »
TA-Lib MA_Type
在TA-Lib中有一个参数的类型是MA_Type, 谷歌了一下,把内容贴出来。
主要就是使用不一样的加权方式对数据进行处理。
移动平均(英语:moving average,MA),又称“移动平均线”简称均线,是技术分析中一种分析时间序列数据的工具。最常见的是利用股价、回报或交易量等变数计算出移动平均。
移动平均可抚平短期波动,反映出长期趋势或周期。数学上,移动平均可视为一种卷积。
简单移动平均(英语:simple moving average,SMA)是某变数之前n个数值的未作加权算术平均。例如,收市价的10日简单移动平均指之前10日收市价的平均数。:
当计算连续的数值,一个新的数值加入,同时一个旧数值剔出,所以无需每次都重新逐个数值加起来。
在技术分析中,不同的市场对常用天数(n值)有不同的需求,例如:某些市场普遍的n值为10日、40日、200日;有些则是5日、10日、20日、60日、120日、240日,视乎分析时期长短而定。投资者冀从移动平均线的图表中分辨出支持位或阻力位。
加权移动平均(英语:weighted moving average,WMA)指计算平均值时将个别数据乘以不同数值,在技术分析中,n日WMA的最近期一个数值乘以n、次近的乘以n-1,如此类推,一直到0:
指数移动平均(英语:exponential moving average,EMA或EWMA)是以指数式递减加权的移动平均。各数值的加权影响力随时间而指数式递减,越近期的数据加权影响力越重,但较旧的数据也给予一定的加权值
WMA EMA
使用下面的代码实现不一样的MA
生成的图像如下:
http://30daydo.com/article/201
转载请注明出处 收起阅读 »
主要就是使用不一样的加权方式对数据进行处理。
import talib
from talib import MA_Type
MA_Type: 0=SMA, 1=EMA, 2=WMA, 3=DEMA, 4=TEMA, 5=TRIMA, 6=KAMA, 7=MAMA, 8=T3 (Default=SMA)
移动平均(英语:moving average,MA),又称“移动平均线”简称均线,是技术分析中一种分析时间序列数据的工具。最常见的是利用股价、回报或交易量等变数计算出移动平均。
移动平均可抚平短期波动,反映出长期趋势或周期。数学上,移动平均可视为一种卷积。
简单移动平均(英语:simple moving average,SMA)是某变数之前n个数值的未作加权算术平均。例如,收市价的10日简单移动平均指之前10日收市价的平均数。:
当计算连续的数值,一个新的数值加入,同时一个旧数值剔出,所以无需每次都重新逐个数值加起来。
在技术分析中,不同的市场对常用天数(n值)有不同的需求,例如:某些市场普遍的n值为10日、40日、200日;有些则是5日、10日、20日、60日、120日、240日,视乎分析时期长短而定。投资者冀从移动平均线的图表中分辨出支持位或阻力位。
加权移动平均(英语:weighted moving average,WMA)指计算平均值时将个别数据乘以不同数值,在技术分析中,n日WMA的最近期一个数值乘以n、次近的乘以n-1,如此类推,一直到0:
指数移动平均(英语:exponential moving average,EMA或EWMA)是以指数式递减加权的移动平均。各数值的加权影响力随时间而指数式递减,越近期的数据加权影响力越重,但较旧的数据也给予一定的加权值
WMA EMA
使用下面的代码实现不一样的MA
#MA_Type: 0=SMA, 1=EMA, 2=WMA, 3=DEMA, 4=TEMA, 5=TRIMA, 6=KAMA, 7=MAMA, 8=T3 (Default=SMA)
df=ts.get_k_data('300580',start='2017-01-12',end='2017-05-26')
closed=df['close'].values
sma=talib.MA(closed,timeperiod=10,matype=0)
ema=talib.MA(closed,timeperiod=10,matype=1)
wma=talib.MA(closed,timeperiod=10,matype=2)
dema=talib.MA(closed,timeperiod=10,matype=3)
tema=talib.MA(closed,timeperiod=10,matype=4)
trima=talib.MA(closed,timeperiod=10,matype=5)
kma=talib.MA(closed,timeperiod=10,matype=6)
mama=talib.MA(closed,timeperiod=10,matype=7)
t3=talib.MA(closed,timeperiod=10,matype=8)
#ouput=talib.MA(closed,timeperiod=5,matype=0)
print closed
plt.ylim([0,40])
plt.plot(sma)
plt.plot(ema)
plt.plot(wma)
plt.plot(dema)
plt.plot(tema)
plt.plot(trima)
plt.plot(kma)
plt.plot(mama)
plt.plot(t3)
plt.grid()
plt.show()
生成的图像如下:
http://30daydo.com/article/201
转载请注明出处 收起阅读 »
TA-Lib 量化交易代码实例 <二> 获取布林线的上轨,中轨,下轨的数据
BOLL指标的原理
BOLL指标是美国股市分析家约翰·布林根据统计学中的标准差原理设计出来的一种非常简单实用的技术分析指标。一般而言,股价的运动总是围绕某一价值中枢(如均线、成本线等)在一定的范围内变动,布林线指标指标正是在上述条件的基础上,引进了“股价通道”的概念,其认为股价通道的宽窄随着股价波动幅度的大小而变化,而且股价通道又具有变异性,它会随着股价的变化而自动调整。正是由于它具有灵活性、直观性和趋势性的特点,BOLL指标渐渐成为投资者广为应用的市场上热门指标。
在众多技术分析指标中,BOLL指标属于比较特殊的一类指标。绝大多数技术分析指标都是通过数量的方法构造出来的,它们本身不依赖趋势分析和形态分析,而BOLL指标却股价的形态和趋势有着密不可分的联系。BOLL指标中的“股价通道”概念正是股价趋势理论的直观表现形式。BOLL是利用“股价通道”来显示股价的各种价位,当股价波动很小,处于盘整时,股价通道就会变窄,这可能预示着股价的波动处于暂时的平静期;当股价波动超出狭窄的股价通道的上轨时,预示着股价的异常激烈的向上波动即将开始;当股价波动超出狭窄的股价通道的下轨时,同样也预示着股价的异常激烈的向下波动将开始。
投资者常常会遇到两种最常见的交易陷阱,一是买低陷阱,投资者在所谓的低位买进之后,股价不仅没有止跌反而不断下跌;二是卖高陷阱,股票在所谓的高点卖出后,股价却一路上涨。布林线特别运用了爱因斯坦的相对论,认为各类市场间都是互动的,市场内和市场间的各种变化都是相对性的,是不存在绝对性的,股价的高低是相对的,股价在上轨线以上或在下轨线以下只反映该股股价相对较高或较低,投资者作出投资判断前还须综合参考其他技术指标,包括价量配合,心理类指标,类比类指标,市场间的关联数据等。
总之,BOLL指标中的股价通道对预测未来行情的走势起着重要的参考作用,它也是布林线指标所特有的分析手段。
[编辑]
BOLL指标的计算方法
在所有的指标计算中,BOLL指标的计算方法是最复杂的之一,其中引进了统计学中的标准差概念,涉及到中轨线(MB)、上轨线(UP)和下轨线(DN)的计算。另外,和其他指标的计算一样,由于选用的计算周期的不同,BOLL指标也包括日BOLL指标、周BOLL指标、月BOLL指标年BOLL指标以及分钟BOLL指标等各种类型。经常被用于股市研判的是日BOLL指标和周BOLL指标。虽然它们的计算时的取值有所不同,但基本的计算方法一样。以日BOLL指标计算为例,其计算方法如下:
1、日BOLL指标的计算公式
中轨线=N日的移动平均线
上轨线=中轨线+两倍的标准差
下轨线=中轨线-两倍的标准差
2、日BOLL指标的计算过程
1)计算MA
MA=N日内的收盘价之和÷N2)计算标准差MD
MD=平方根N日的(C-MA)的两次方之和除以N3)计算MB、UP、DN线
MB=(N-1)日的MA
UP=MB+2×MD
DN=MB-2×MD在股市分析软件中,BOLL指标一共由四条线组成,即上轨线UP 、中轨线MB、下轨线DN和价格线。其中上轨线UP是UP数值的连线,用黄色线表示;中轨线MB是MB数值的连线,用白色线表示;下轨线DN是DN数值的连线,用紫色线表示;价格线是以美国线表示,颜色为浅蓝色。和其他技术指标一样,在实战中,投资者不需要进行BOLL指标的计算,主要是了解BOLL的计算方法和过程,以便更加深入地掌握BOLL指标的实质,为运用指标打下基础。
#通过tushare获取股票信息
df=ts.get_k_data('300580',start='2017-01-12',end='2017-05-26')
#提取收盘价
closed=df['close'].values
upper,middle,lower=talib.BBANDS(closed,matype=talib.MA_Type.T3)
print upper,middle,lower
plt.plot(upper)
plt.plot(middle)
plt.plot(lower)
plt.grid()
plt.show()
diff1=upper-middle
diff2=middle-lower
print diff1
print diff2
最后那里可以看到diff1和diff2是一样的。 验证了布林线的定义ma+2d,m-2d。 收起阅读 »
quantdigger 量化交易入门 代码示例
第五天
《》
待更新
《》
待更新
TA-Lib 量化交易代码实例 <一> 获取5日,10日,20日均线数据
第一节
安装教程在前面内容已经介绍过了,对于新手也是有点障碍,可以参照前面的文章进行一步一步操作。 http://30daydo.com/article/195
上面第一句使用tushare获取股票的数据,如果不知道怎么操作的,可以在这里参考,同样是入门的教程。
http://30daydo.com/article/13
运行上面的代码后,可以得到下面的曲线:
你们可以去对比一下贝斯特的收盘价,5日,10日,20日均线。是不是一样的?
就这样我们就完成了均线的获取。 是不是很简单?
收起阅读 »
安装教程在前面内容已经介绍过了,对于新手也是有点障碍,可以参照前面的文章进行一步一步操作。 http://30daydo.com/article/195
#通过tushare获取股票信息
df=ts.get_k_data('300580',start='2017-01-12',end='2017-05-26')
#提取收盘价
closed=df['close'].values
#获取均线的数据,通过timeperiod参数来分别获取 5,10,20 日均线的数据。
ma5=talib.SMA(closed,timeperiod=5)
ma10=talib.SMA(closed,timeperiod=10)
ma20=talib.SMA(closed,timeperiod=20)
#打印出来每一个数据
print closed
print ma5
print ma10
print ma20
#通过plog函数可以很方便的绘制出每一条均线
plt.plot(closed)
plt.plot(ma5)
plt.plot(ma10)
plt.plot(ma20)
#添加网格,可有可无,只是让图像好看点
plt.grid()
#记得加这一句,不然不会显示图像
plt.show()
上面第一句使用tushare获取股票的数据,如果不知道怎么操作的,可以在这里参考,同样是入门的教程。
http://30daydo.com/article/13
运行上面的代码后,可以得到下面的曲线:
你们可以去对比一下贝斯特的收盘价,5日,10日,20日均线。是不是一样的?
就这样我们就完成了均线的获取。 是不是很简单?
收起阅读 »
量化工具TA-Lib 使用例子
http://30daydo.com/article/196
TA-Lib主要用来计算一些股市中常见的指标。
比如MACD,BOLL,均线等参数。
TA-Lib主要用来计算一些股市中常见的指标。
比如MACD,BOLL,均线等参数。
#-*-coding=utf-8-*-收起阅读 »
import Tkinter as tk
from Tkinter import *
import ttk
import matplotlib.pyplot as plt
import numpy as np
import talib as ta
series = np.random.choice([1, -1], size=200)
close = np.cumsum(series).astype(float)
# 重叠指标
def overlap_process(event):
print(event.widget.get())
overlap = event.widget.get()
upperband, middleband, lowerband = ta.BBANDS(close, timeperiod=5, nbdevup=2, nbdevdn=2, matype=0)
fig, axes = plt.subplots(2, 1, sharex=True)
ax1, ax2 = axes[0], axes[1]
axes[0].plot(close, '', markersize=3)
axes[0].plot(upperband, '')
axes[0].plot(middleband, '')
axes[0].plot(lowerband, '')
axes[0].set_title(overlap, fontproperties="SimHei")
if overlap == '布林线':
pass
elif overlap == '双指数移动平均线':
real = ta.DEMA(close, timeperiod=30)
axes[1].plot(real, '')
elif overlap == '指数移动平均线 ':
real = ta.EMA(close, timeperiod=30)
axes[1].plot(real, '')
elif overlap == '希尔伯特变换——瞬时趋势线':
real = ta.HT_TRENDLINE(close)
axes[1].plot(real, '')
elif overlap == '考夫曼自适应移动平均线':
real = ta.KAMA(close, timeperiod=30)
axes[1].plot(real, '')
elif overlap == '移动平均线':
real = ta.MA(close, timeperiod=30, matype=0)
axes[1].plot(real, '')
elif overlap == 'MESA自适应移动平均':
mama, fama = ta.MAMA(close, fastlimit=0, slowlimit=0)
axes[1].plot(mama, '')
axes[1].plot(fama, '')
elif overlap == '变周期移动平均线':
real = ta.MAVP(close, periods, minperiod=2, maxperiod=30, matype=0)
axes[1].plot(real, '')
elif overlap == '简单移动平均线':
real = ta.SMA(close, timeperiod=30)
axes[1].plot(real, '')
elif overlap == '三指数移动平均线(T3)':
real = ta.T3(close, timeperiod=5, vfactor=0)
axes[1].plot(real, '')
elif overlap == '三指数移动平均线':
real = ta.TEMA(close, timeperiod=30)
axes[1].plot(real, '')
elif overlap == '三角形加权法 ':
real = ta.TRIMA(close, timeperiod=30)
axes[1].plot(real, '')
elif overlap == '加权移动平均数':
real = ta.WMA(close, timeperiod=30)
axes[1].plot(real, '')
plt.show()
# 动量指标
def momentum_process(event):
print(event.widget.get())
momentum = event.widget.get()
upperband, middleband, lowerband = ta.BBANDS(close, timeperiod=5, nbdevup=2, nbdevdn=2, matype=0)
fig, axes = plt.subplots(2, 1, sharex=True)
ax1, ax2 = axes[0], axes[1]
axes[0].plot(close, '', markersize=3)
axes[0].plot(upperband, '')
axes[0].plot(middleband, '')
axes[0].plot(lowerband, '')
axes[0].set_title(momentum, fontproperties="SimHei")
if momentum == '绝对价格振荡器':
real = ta.APO(close, fastperiod=12, slowperiod=26, matype=0)
axes[1].plot(real, '')
elif momentum == '钱德动量摆动指标':
real = ta.CMO(close, timeperiod=14)
axes[1].plot(real, '')
elif momentum == '移动平均收敛/散度':
macd, macdsignal, macdhist = ta.MACD(close, fastperiod=12, slowperiod=26, signalperiod=9)
axes[1].plot(macd, '')
axes[1].plot(macdsignal, '')
axes[1].plot(macdhist, '')
elif momentum == '带可控MA类型的MACD':
macd, macdsignal, macdhist = ta.MACDEXT(close, fastperiod=12, fastmatype=0, slowperiod=26, slowmatype=0, signalperiod=9, signalmatype=0)
axes[1].plot(macd, '')
axes[1].plot(macdsignal, '')
axes[1].plot(macdhist, '')
elif momentum == '移动平均收敛/散度 固定 12/26':
macd, macdsignal, macdhist = ta.MACDFIX(close, signalperiod=9)
axes[1].plot(macd, '')
axes[1].plot(macdsignal, '')
axes[1].plot(macdhist, '')
elif momentum == '动量':
real = ta.MOM(close, timeperiod=10)
axes[1].plot(real, '')
elif momentum == '比例价格振荡器':
real = ta.PPO(close, fastperiod=12, slowperiod=26, matype=0)
axes[1].plot(real, '')
elif momentum == '变化率':
real = ta.ROC(close, timeperiod=10)
axes[1].plot(real, '')
elif momentum == '变化率百分比':
real = ta.ROCP(close, timeperiod=10)
axes[1].plot(real, '')
elif momentum == '变化率的比率':
real = ta.ROCR(close, timeperiod=10)
axes[1].plot(real, '')
elif momentum == '变化率的比率100倍':
real = ta.ROCR100(close, timeperiod=10)
axes[1].plot(real, '')
elif momentum == '相对强弱指数':
real = ta.RSI(close, timeperiod=14)
axes[1].plot(real, '')
elif momentum == '随机相对强弱指标':
fastk, fastd = ta.STOCHRSI(close, timeperiod=14, fastk_period=5, fastd_period=3, fastd_matype=0)
axes[1].plot(fastk, '')
axes[1].plot(fastd, '')
elif momentum == '三重光滑EMA的日变化率':
real = ta.TRIX(close, timeperiod=30)
axes[1].plot(real, '')
plt.show()
# 周期指标
def cycle_process(event):
print(event.widget.get())
cycle = event.widget.get()
upperband, middleband, lowerband = ta.BBANDS(close, timeperiod=5, nbdevup=2, nbdevdn=2, matype=0)
fig, axes = plt.subplots(2, 1, sharex=True)
ax1, ax2 = axes[0], axes[1]
axes[0].plot(close, '', markersize=3)
axes[0].plot(upperband, '')
axes[0].plot(middleband, '')
axes[0].plot(lowerband, '')
axes[0].set_title(cycle, fontproperties="SimHei")
if cycle == '希尔伯特变换——主要的循环周期':
real = ta.HT_DCPERIOD(close)
axes[1].plot(real, '')
elif cycle == '希尔伯特变换,占主导地位的周期阶段':
real = ta.HT_DCPHASE(close)
axes[1].plot(real, '')
elif cycle == '希尔伯特变换——相量组件':
inphase, quadrature = ta.HT_PHASOR(close)
axes[1].plot(inphase, '')
axes[1].plot(quadrature, '')
elif cycle == '希尔伯特变换——正弦曲线':
sine, leadsine = ta.HT_SINE(close)
axes[1].plot(sine, '')
axes[1].plot(leadsine, '')
elif cycle == '希尔伯特变换——趋势和周期模式':
integer = ta.HT_TRENDMODE(close)
axes[1].plot(integer, '')
plt.show()
# 统计功能
def statistic_process(event):
print(event.widget.get())
statistic = event.widget.get()
upperband, middleband, lowerband = ta.BBANDS(close, timeperiod=5, nbdevup=2, nbdevdn=2, matype=0)
fig, axes = plt.subplots(2, 1, sharex=True)
ax1, ax2 = axes[0], axes[1]
axes[0].plot(close, '', markersize=3)
axes[0].plot(upperband, '')
axes[0].plot(middleband, '')
axes[0].plot(lowerband, '')
axes[0].set_title(statistic, fontproperties="SimHei")
if statistic == '线性回归':
real = ta.LINEARREG(close, timeperiod=14)
axes[1].plot(real, '')
elif statistic == '线性回归角度':
real = ta.LINEARREG_ANGLE(close, timeperiod=14)
axes[1].plot(real, '')
elif statistic == '线性回归截距':
real = ta.LINEARREG_INTERCEPT(close, timeperiod=14)
axes[1].plot(real, '')
elif statistic == '线性回归斜率':
real = ta.LINEARREG_SLOPE(close, timeperiod=14)
axes[1].plot(real, '')
elif statistic == '标准差':
real = ta.STDDEV(close, timeperiod=5, nbdev=1)
axes[1].plot(real, '')
elif statistic == '时间序列预测':
real = ta.TSF(close, timeperiod=14)
axes[1].plot(real, '')
elif statistic == '方差':
real = ta.VAR(close, timeperiod=5, nbdev=1)
axes[1].plot(real, '')
plt.show()
# 数学变换
def math_transform_process(event):
print(event.widget.get())
math_transform = event.widget.get()
upperband, middleband, lowerband = ta.BBANDS(close, timeperiod=5, nbdevup=2, nbdevdn=2, matype=0)
fig, axes = plt.subplots(2, 1, sharex=True)
ax1, ax2 = axes[0], axes[1]
axes[0].plot(close, '', markersize=3)
axes[0].plot(upperband, '')
axes[0].plot(middleband, '')
axes[0].plot(lowerband, '')
axes[0].set_title(math_transform, fontproperties="SimHei")
if math_transform == '反余弦':
real = ta.ACOS(close)
axes[1].plot(real, '')
elif math_transform == '反正弦':
real = ta.ASIN(close)
axes[1].plot(real, '')
elif math_transform == '反正切':
real = ta.ATAN(close)
axes[1].plot(real, '')
elif math_transform == '向上取整':
real = ta.CEIL(close)
axes[1].plot(real, '')
elif math_transform == '余弦':
real = ta.COS(close)
axes[1].plot(real, '')
elif math_transform == '双曲余弦':
real = ta.COSH(close)
axes[1].plot(real, '')
elif math_transform == '指数':
real = ta.EXP(close)
axes[1].plot(real, '')
elif math_transform == '向下取整':
real = ta.FLOOR(close)
axes[1].plot(real, '')
elif math_transform == '自然对数':
real = ta.LN(close)
axes[1].plot(real, '')
elif math_transform == '常用对数':
real = ta.LOG10(close)
axes[1].plot(real, '')
elif math_transform == '正弦':
real = ta.SIN(close)
axes[1].plot(real, '')
elif math_transform == '双曲正弦':
real = ta.SINH(close)
axes[1].plot(real, '')
elif math_transform == '平方根':
real = ta.SQRT(close)
axes[1].plot(real, '')
elif math_transform == '正切':
real = ta.TAN(close)
axes[1].plot(real, '')
elif math_transform == '双曲正切':
real = ta.TANH(close)
axes[1].plot(real, '')
plt.show()
# 数学操作
def math_operator_process(event):
print(event.widget.get())
math_operator = event.widget.get()
upperband, middleband, lowerband = ta.BBANDS(close, timeperiod=5, nbdevup=2, nbdevdn=2, matype=0)
fig, axes = plt.subplots(2, 1, sharex=True)
ax1, ax2 = axes[0], axes[1]
axes[0].plot(close, '', markersize=3)
axes[0].plot(upperband, '')
axes[0].plot(middleband, '')
axes[0].plot(lowerband, '')
axes[0].set_title(math_operator, fontproperties="SimHei")
if math_operator == '指定的期间的最大值':
real = ta.MAX(close, timeperiod=30)
axes[1].plot(real, '')
elif math_operator == '指定的期间的最大值的索引':
integer = ta.MAXINDEX(close, timeperiod=30)
axes[1].plot(integer, '')
elif math_operator == '指定的期间的最小值':
real = ta.MIN(close, timeperiod=30)
axes[1].plot(real, '')
elif math_operator == '指定的期间的最小值的索引':
integer = ta.MININDEX(close, timeperiod=30)
axes[1].plot(integer, '')
elif math_operator == '指定的期间的最小和最大值':
min, max = ta.MINMAX(close, timeperiod=30)
axes[1].plot(min, '')
axes[1].plot(max, '')
elif math_operator == '指定的期间的最小和最大值的索引':
minidx, maxidx = ta.MINMAXINDEX(close, timeperiod=30)
axes[1].plot(minidx, '')
axes[1].plot(maxidx, '')
elif math_operator == '合计':
real = ta.SUM(close, timeperiod=30)
axes[1].plot(real, '')
plt.show()
root = tk.Tk()
# 第一行:重叠指标
rowframe1 = tk.Frame(root)
rowframe1.pack(side=tk.TOP, ipadx=3, ipady=3)
tk.Label(rowframe1, text="重叠指标").pack(side=tk.LEFT)
overlap_indicator = tk.StringVar() # 重叠指标
combobox1 = ttk.Combobox(rowframe1, textvariable=overlap_indicator)
combobox1['values'] = ['布林线','双指数移动平均线','指数移动平均线 ','希尔伯特变换——瞬时趋势线',
'考夫曼自适应移动平均线','移动平均线','MESA自适应移动平均','变周期移动平均线',
'简单移动平均线','三指数移动平均线(T3)','三指数移动平均线','三角形加权法 ','加权移动平均数']
combobox1.current(0)
combobox1.pack(side=tk.LEFT)
combobox1.bind('<<ComboboxSelected>>', overlap_process)
# 第二行:动量指标
rowframe2 = tk.Frame(root)
rowframe2.pack(side=tk.TOP, ipadx=3, ipady=3)
tk.Label(rowframe2, text="动量指标").pack(side=tk.LEFT)
momentum_indicator = tk.StringVar() # 动量指标
combobox2 = ttk.Combobox(rowframe2, textvariable=momentum_indicator)
combobox2['values'] = ['绝对价格振荡器','钱德动量摆动指标','移动平均收敛/散度','带可控MA类型的MACD',
'移动平均收敛/散度 固定 12/26','动量','比例价格振荡器','变化率','变化率百分比',
'变化率的比率','变化率的比率100倍','相对强弱指数','随机相对强弱指标','三重光滑EMA的日变化率']
combobox2.current(0)
combobox2.pack(side=tk.LEFT)
combobox2.bind('<<ComboboxSelected>>', momentum_process)
# 第三行:周期指标
rowframe3 = tk.Frame(root)
rowframe3.pack(side=tk.TOP, ipadx=3, ipady=3)
tk.Label(rowframe3, text="周期指标").pack(side=tk.LEFT)
cycle_indicator = tk.StringVar() # 周期指标
combobox3 = ttk.Combobox(rowframe3, textvariable=cycle_indicator)
combobox3['values'] = ['希尔伯特变换——主要的循环周期','希尔伯特变换——主要的周期阶段','希尔伯特变换——相量组件',
'希尔伯特变换——正弦曲线','希尔伯特变换——趋势和周期模式']
combobox3.current(0)
combobox3.pack(side=tk.LEFT)
combobox3.bind('<<ComboboxSelected>>', cycle_process)
# 第四行:统计功能
rowframe4 = tk.Frame(root)
rowframe4.pack(side=tk.TOP, ipadx=3, ipady=3)
tk.Label(rowframe4, text="统计功能").pack(side=tk.LEFT)
statistic_indicator = tk.StringVar() # 统计功能
combobox4 = ttk.Combobox(rowframe4, textvariable=statistic_indicator)
combobox4['values'] = ['贝塔系数;投资风险与股市风险系数','皮尔逊相关系数','线性回归','线性回归角度',
'线性回归截距','线性回归斜率','标准差','时间序列预测','方差']
combobox4.current(0)
combobox4.pack(side=tk.LEFT)
combobox4.bind('<<ComboboxSelected>>', statistic_process)
# 第五行:数学变换
rowframe5 = tk.Frame(root)
rowframe5.pack(side=tk.TOP, ipadx=3, ipady=3)
tk.Label(rowframe5, text="数学变换").pack(side=tk.LEFT)
math_transform = tk.StringVar() # 数学变换
combobox5 = ttk.Combobox(rowframe5, textvariable=math_transform_process)
combobox5['values'] = ['反余弦','反正弦','反正切','向上取整','余弦','双曲余弦','指数','向下取整',
'自然对数','常用对数','正弦','双曲正弦','平方根','正切','双曲正切']
combobox5.current(0)
combobox5.pack(side=tk.LEFT)
combobox5.bind('<<ComboboxSelected>>', math_transform_process)
# 第六行:数学操作
rowframe6 = tk.Frame(root)
rowframe6.pack(side=tk.TOP, ipadx=3, ipady=3)
tk.Label(rowframe6, text="数学操作").pack(side=tk.LEFT)
math_operator = tk.StringVar() # 数学操作
combobox6 = ttk.Combobox(rowframe6, textvariable=math_operator_process)
combobox6['values'] = ['指定期间的最大值','指定期间的最大值的索引','指定期间的最小值','指定期间的最小值的索引',
'指定期间的最小和最大值','指定期间的最小和最大值的索引','合计']
combobox6.current(0)
combobox6.pack(side=tk.LEFT)
combobox6.bind('<<ComboboxSelected>>', math_operator_process)
root.mainloop()
quantdigger 安装教程 & 安装出现的问题解决
http://30daydo.com/publish/article/195
win7
可以下载https://github.com/Rockyzsu/quantdigger 然后解压, 运行以下python命令:
python setupscripts/install.py 或者 pip install quantdigger
如果出现一些库文件的依赖关系导致出错
fatal error C1083: Cannot open include file: 'ta_libc.
那么说明你的TA-Lib的这个库没有安装好。
先尝试 pip install TA-Lib 看能否安装成功。如果失败了,继续下面的:
下载http://prdownloads.sourceforge.net/ta-lib/ta-lib-0.4.0-msvc.zip 然后解压放在c盘根目录下 (如: C:\ta-lib)。
再运行pip install TA-Lib
然后重新运行 python setupscripts/install.py 收起阅读 »
win7
可以下载https://github.com/Rockyzsu/quantdigger 然后解压, 运行以下python命令:
python setupscripts/install.py 或者 pip install quantdigger
如果出现一些库文件的依赖关系导致出错
fatal error C1083: Cannot open include file: 'ta_libc.
那么说明你的TA-Lib的这个库没有安装好。
先尝试 pip install TA-Lib 看能否安装成功。如果失败了,继续下面的:
下载http://prdownloads.sourceforge.net/ta-lib/ta-lib-0.4.0-msvc.zip 然后解压放在c盘根目录下 (如: C:\ta-lib)。
再运行pip install TA-Lib
然后重新运行 python setupscripts/install.py 收起阅读 »
破解安卓锁屏图案
http://30daydo.com/article/194
目前成功的有2种方法:
方法1: 暴力,快速。 只需几秒钟的时间就可以了。 不过前提需要你的手机又root权限。
具体操作: ADB连接手机,然后运行“adb rm /data/system/gesture.key”删除掉gesture.key文件,此时图形锁就失效了,随意画一下就能解锁。
方法2: 速度慢,但是可以还原你的锁屏图案。 这个方法同样需要root
原理分析
首先科普一下,安卓手机是如何标记这9个点的。通过阅读安卓系统源码可知,每个点都有其编号,组成了一个3×3的矩阵,形如:
假如设定解锁图形为一个“L”形,如图:
那么这几个点的排列顺序是这样的:00 03 06 07 08。系统就记下来了这一串数字,然后将这一串数字(以十六进制的方式)进行SHA1加密,存储在了手机里的/data/system/gesture.key 文件中
WinHex等十六进制编辑程序打开gesture.key,会发现文件内是SHA1加密过的字符串:c8c0b24a15dc8bbfd411427973574695230458f0
当你下次解锁的时候,系统就对比你画的图案,看对应的数字串是不是0003060708对应的加密结果。如果是,就解锁;不是就继续保持锁定。那么,如果穷举所有的数字串排列,会有多少呢?联想到高中的阶乘,如果用4个点做解锁图形的话,就是9x8x7x6=3024种可能性,那5个点就是15120,6个点的话60480,7个点181440,8个点362880,9个点362880。总共是985824种可能性(但这么计算并不严密,因为同一条直线上的点只能和他们相邻的点相连)。
满打满算,也不到985824种可能性。乍一看很大,但在计算机面前,穷举出来这些东西用不了几秒钟。
当你下次解锁的时候,系统就对比你画的图案,看对应的数字串是不是0003060708对应的加密结果。如果是,就解锁;不是就继续保持锁定。那么,如果穷举所有的数字串排列,会有多少呢?联想到高中的阶乘,如果用4个点做解锁图形的话,就是9x8x7x6=3024种可能性,那5个点就是15120,6个点的话60480,7个点181440,8个点362880,9个点362880。总共是985824种可能性(但这么计算并不严密,因为同一条直线上的点只能和他们相邻的点相连)。
满打满算,也不到985824种可能性。乍一看很大,但在计算机面前,穷举出来这些东西用不了几秒钟。
收起阅读 »
目前成功的有2种方法:
方法1: 暴力,快速。 只需几秒钟的时间就可以了。 不过前提需要你的手机又root权限。
具体操作: ADB连接手机,然后运行“adb rm /data/system/gesture.key”删除掉gesture.key文件,此时图形锁就失效了,随意画一下就能解锁。
方法2: 速度慢,但是可以还原你的锁屏图案。 这个方法同样需要root
# -*- coding: cp936 -*-
import itertools
import hashlib
import time
import os
#调用cmd,ADB连接到手机,读取SHA1加密后的字符串
os.system("adb pull /data/system/gesture.key gesture.key")
time.sleep(5)
f=open('gesture.key','r')
pswd=f.readline()
f.close()
pswd_hex=pswd.encode('hex')
print '加密后的密码为:%s'%pswd_hex
#生成解锁序列,得到['00','01','02','03','04','05','06','07','08']
matrix=
for i in range(0,9):
str_temp = '0'+str(i)
matrix.append(str_temp)
#将00——08的字符进行排列,至少取4个数排列,最多全部进行排列
min_num=4
max_num=len(matrix)
for num in range(min_num,max_num+1):#从04 -> 08
iter1 = itertools.permutations(matrix,num)#从9个数字中挑出n个进行排列
list_m=
list_m.append(list(iter1))#将生成的排列全部存放到 list_m 列表中
for el in list_m[0]:#遍历这n个数字的全部排列
strlist=''.join(el)#将list转换成str。[00,03,06,07,08]-->0003060708
strlist_sha1 = hashlib.sha1(strlist.decode('hex')).hexdigest()#将字符串进行SHA1加密
if pswd_hex==strlist_sha1:#将手机文件里的字符串与加密字符串进行对比
print '解锁密码为:',strlist
原理分析
首先科普一下,安卓手机是如何标记这9个点的。通过阅读安卓系统源码可知,每个点都有其编号,组成了一个3×3的矩阵,形如:
00 01 02
03 04 05
06 07 08
假如设定解锁图形为一个“L”形,如图:
那么这几个点的排列顺序是这样的:00 03 06 07 08。系统就记下来了这一串数字,然后将这一串数字(以十六进制的方式)进行SHA1加密,存储在了手机里的/data/system/gesture.key 文件中
WinHex等十六进制编辑程序打开gesture.key,会发现文件内是SHA1加密过的字符串:c8c0b24a15dc8bbfd411427973574695230458f0
当你下次解锁的时候,系统就对比你画的图案,看对应的数字串是不是0003060708对应的加密结果。如果是,就解锁;不是就继续保持锁定。那么,如果穷举所有的数字串排列,会有多少呢?联想到高中的阶乘,如果用4个点做解锁图形的话,就是9x8x7x6=3024种可能性,那5个点就是15120,6个点的话60480,7个点181440,8个点362880,9个点362880。总共是985824种可能性(但这么计算并不严密,因为同一条直线上的点只能和他们相邻的点相连)。
满打满算,也不到985824种可能性。乍一看很大,但在计算机面前,穷举出来这些东西用不了几秒钟。
当你下次解锁的时候,系统就对比你画的图案,看对应的数字串是不是0003060708对应的加密结果。如果是,就解锁;不是就继续保持锁定。那么,如果穷举所有的数字串排列,会有多少呢?联想到高中的阶乘,如果用4个点做解锁图形的话,就是9x8x7x6=3024种可能性,那5个点就是15120,6个点的话60480,7个点181440,8个点362880,9个点362880。总共是985824种可能性(但这么计算并不严密,因为同一条直线上的点只能和他们相邻的点相连)。
满打满算,也不到985824种可能性。乍一看很大,但在计算机面前,穷举出来这些东西用不了几秒钟。
收起阅读 »
对A股上有过不诚信纪录的公司进行纪录 持续更新
买股票就是买公司,如果是长线持有股票,应该避开那些没有诚信,出尔反尔,有欺诈行为或者一系列损坏散户利益的个股(清仓式减持)
本纪录只是本人浏览公告的时候筛选出来,如果其他朋友也有看到相关公司的一些违规行为(或者你觉得这个公司不道德),也可以贴上来让我更新一下。
05-22 16:21 阳光股份 遭股东清仓式减持
---> http://ggjd.cnstock.com/company/scp_ggjd/tjd_ggkx/201705/4080444.htm
獐子岛: 出名了的骗子公司。 财务作假,把散户当傻子。 獐子岛上演惊天逆转 "失踪的扇贝游回来了" http://money.163.com/15/0606/05/ARDEJNT100251LJJ.html
收起阅读 »
本纪录只是本人浏览公告的时候筛选出来,如果其他朋友也有看到相关公司的一些违规行为(或者你觉得这个公司不道德),也可以贴上来让我更新一下。
05-22 16:21 阳光股份 遭股东清仓式减持
---> http://ggjd.cnstock.com/company/scp_ggjd/tjd_ggkx/201705/4080444.htm
獐子岛: 出名了的骗子公司。 财务作假,把散户当傻子。 獐子岛上演惊天逆转 "失踪的扇贝游回来了" http://money.163.com/15/0606/05/ARDEJNT100251LJJ.html
收起阅读 »
量化交易 获取获取上市公司年报
http://30daydo.com/article/192
tushare有一个函数, ts.get_report_data(年份,季度), 可以获取每一年的季度的业绩。
如果想要获取上市公司的年报,只要吧季度参数改为4即可
例如 要获取 中国银行的2016年的年报
df=ts.get_report_data(2016,4)
print df[df['code']=='601988']
输出的结果如下:
In [4]: print df[df['code']=='601988']
code name eps eps_yoy bvps roe epcf net_profits \
1826 601988 中国银行 0.54 -3.57 4.46 12.58 NaN 16457800.0
profits_yoy distrib report_date
1826 -3.67 10派1.68 04-01
收起阅读 »
tushare有一个函数, ts.get_report_data(年份,季度), 可以获取每一年的季度的业绩。
如果想要获取上市公司的年报,只要吧季度参数改为4即可
例如 要获取 中国银行的2016年的年报
df=ts.get_report_data(2016,4)
print df[df['code']=='601988']
输出的结果如下:
In [4]: print df[df['code']=='601988']
code name eps eps_yoy bvps roe epcf net_profits \
1826 601988 中国银行 0.54 -3.57 4.46 12.58 NaN 16457800.0
profits_yoy distrib report_date
1826 -3.67 10派1.68 04-01
收起阅读 »
awk分类汇总数据(二维数组)并汇总到新文件
内容:运用bash和awk进行分类统计汇总;
1.测试数据集:
测试数据格式为:
字段分别为ID,Avg,Max,Min,times
插入视频
2.统计要求:
(1)不统计times次数大于1;
(2)不统计Id出现次数小于4;
(3)统计各ID的Avg,Max,Min的均值,Avg的众数;
(4)将统计的结果加入对应的ID数据表;
3.思路和代码:
(1)整体思路采用的是分类汇总;
(2)先筛选出times次数=1的数据,再根据awk的数组计算对数据进行分类统计和分类汇总,最后将ID次数大于3的进行最终计算;
(3)难点在于awk没有明确意义上的二维数组概念,在版本允许的基础上,可变相采取如下的方式进行计算:
统计实现代码:
(4)文件汇总根据awk的知识点NF跟FNR的差异进行处理,即在读入多个文件的情况下,NF是持续累计行数,而FNR则是读入当前文件的行数,只要读入下一个文件,则重新计算行数;比如:
读入文件1,文件2,行数都是5,则
NF的行数是:1,2,3,4,5,6,7,8,9,10;
FNR的行数是:1,2,3,4,5;1,2,3,5;
因此可根据NF==FNR判断来分辨文件;
实现代码:
收起阅读 »
1.测试数据集:
测试数据格式为:
字段分别为ID,Avg,Max,Min,times
插入视频
2.统计要求:
(1)不统计times次数大于1;
(2)不统计Id出现次数小于4;
(3)统计各ID的Avg,Max,Min的均值,Avg的众数;
(4)将统计的结果加入对应的ID数据表;
3.思路和代码:
(1)整体思路采用的是分类汇总;
(2)先筛选出times次数=1的数据,再根据awk的数组计算对数据进行分类统计和分类汇总,最后将ID次数大于3的进行最终计算;
(3)难点在于awk没有明确意义上的二维数组概念,在版本允许的基础上,可变相采取如下的方式进行计算:
统计实现代码:
#!bin/awk统计结果是:
#calculate.awk
BEGIN{
max=0;print "ID\tFre\tAvg_mean\tMax_mean\tMin_mean\tModFre"
}
{ if($5==1){
Fre[$1]+=1;
Avg[$1]+=$2;
Max[$1]+=$3;
Min[$1]+=$4;
Mode[$1][$2]+=1;
for(id in Mode){
for(num in Mode[id]){
if(Mode[id][num]>max){
max=Mode[id][num]
origin=num
}
}
ModeFre[id]=origin
max=0
origin=0
}
}
}
END{
for(id in Fre){
if(Fre[id]>3){
Avg_mean[id] = int(Avg[id] / Fre[id])
Max_mean[id] = int(Max[id] / Fre[id])
Min_mean[id] = int(Min[id] / Fre[id])
print id "\t" Fre[id] "\t" Avg_mean[id] "\t" Max_mean[id] "\t" Min_mean[id] "\t" ModeFre[id]
}
}
}
(4)文件汇总根据awk的知识点NF跟FNR的差异进行处理,即在读入多个文件的情况下,NF是持续累计行数,而FNR则是读入当前文件的行数,只要读入下一个文件,则重新计算行数;比如:
读入文件1,文件2,行数都是5,则
NF的行数是:1,2,3,4,5,6,7,8,9,10;
FNR的行数是:1,2,3,4,5;1,2,3,5;
因此可根据NF==FNR判断来分辨文件;
实现代码:
#!bin/awk4.最终汇总bash文件
#export.awk
{
if(NR==FNR){
Type[$1]=$0;
next
}
if(NR>FNR){
print $0"\t"Type[$1]
}
}
#!bin/bash
#full.sh
jobbase='/home/osboxes/Documents/linux_homework2/'
cat ${jobbase}task.txt|awk -f ${jobbase}calculate.awk > rm2.txt
awk -f ${jobbase}export.awk ${jobbase}rm2.txt ${jobbase}rm.txt
rm rm2.txt
收起阅读 »
证券投资基金考试
证券投资基金考试深圳考点在龙岗的大运软件小镇,现在觉得大运是变化好大。
安装secureCRT7.3.4 配置公私钥远程登陆debian
1.下载secureCRT安装程序与注册机;下载地址:http://download.csdn.net/detail/deng0zhaotai/9422554
(1)next;
(2)accept;
(3)Common profile;
(4)Custom;
(5)改变安装路径;
(6)next;
(7)Install;
(8)保持securtCRT.exe未打开的状态,打开keygen.exee,选择path;
(9)在secureCRT安装路径选择secureCRT.ext和LicenseHelper.exe;
(10)选择“Generate”更换序列;
(11)打开secureCRT.exe(安装完成后的快捷方式),对应位置填入内容;
(12)完成安装,打开secureCRT,选择Tool-Create Public key;
(13)选择RSA,下一步;
(14)登陆输入口令和密码,建议留空,comment默认主机名字
(15)密码长度默认;
(16)选择openSSHkey format;修改存储路径,确定为global public key;
(17)创建公私钥成功,后缀为pub为公钥,另外一个为私钥;
(18)打开虚拟机,进入终端界面,配置SSH服务(ctrl + alt + F1 可切换界面);
(19)创建.ssh目录,修改该目录权限为700
创建authorized_keys文件,修改文件权限为600或者644;
将公钥(后缀.pub)内容拷贝到authorized_keys(可通过邮件从主机发送到虚拟机,再修改文件名字为authorized_keys)
(20)修改sshd_conf配置;
RSAAuthentication yes # 启用 RSA 认证;
AuthorizedKeysFile %h/.ssh/authorized_keys # 验证公钥的存放路径;
PubkeyAuthentication yes # 启用公钥认证;
PasswordAuthentication yes # 禁止密码认证,默认是打开的;
(21)回到虚拟机,修改网络连接方式,注意进入网络适配器,禁用虚拟机另外一个网络;
(22)配置远程链接,打开secureCRT,Quick Connect;
(23)配置虚拟机IP地址,登陆账号,将公钥提前启动档次,选择properties;
(24)选择私钥路径,connet;
(25)回车键链接成功;
收起阅读 »
(1)next;
(2)accept;
(3)Common profile;
(4)Custom;
(5)改变安装路径;
(6)next;
(7)Install;
(8)保持securtCRT.exe未打开的状态,打开keygen.exee,选择path;
(9)在secureCRT安装路径选择secureCRT.ext和LicenseHelper.exe;
(10)选择“Generate”更换序列;
(11)打开secureCRT.exe(安装完成后的快捷方式),对应位置填入内容;
(12)完成安装,打开secureCRT,选择Tool-Create Public key;
(13)选择RSA,下一步;
(14)登陆输入口令和密码,建议留空,comment默认主机名字
(15)密码长度默认;
(16)选择openSSHkey format;修改存储路径,确定为global public key;
(17)创建公私钥成功,后缀为pub为公钥,另外一个为私钥;
(18)打开虚拟机,进入终端界面,配置SSH服务(ctrl + alt + F1 可切换界面);
su -进入root用户;
(19)创建.ssh目录,修改该目录权限为700
创建authorized_keys文件,修改文件权限为600或者644;
将公钥(后缀.pub)内容拷贝到authorized_keys(可通过邮件从主机发送到虚拟机,再修改文件名字为authorized_keys)
mkdir ~/.ssh
chmod 700 ~/.ssh
mv /home/osboxes/Downloads/Identity.pub ~/.ssh/authorized_keys
#(下载文件保存在主用户目录,osboxes为安装时创建的用户)
#(以上语句将公钥文件移动到~/.ssh ,并且修改名字为authorized_keys)
chmod 600 ~/.ssh/authorized_keys
cat ~/.ssh/authorize_keys
#(查看公钥内容)
ls -al ~
#(查看.ssh目录权限)
ls -al ~/.
#(查看authorized_keys权限,该文件的用户组为osboxes会导致链接失败,应该修改为root)
chown root.root ~/.ssh/authorized_keys
ls -al ~/.
#(可见文件用户组和用户已经修改为root)
(20)修改sshd_conf配置;
vi /etc/ssh/shhd_configPermitRootLogin no # 禁止root用户登陆;
RSAAuthentication yes # 启用 RSA 认证;
AuthorizedKeysFile %h/.ssh/authorized_keys # 验证公钥的存放路径;
PubkeyAuthentication yes # 启用公钥认证;
PasswordAuthentication yes # 禁止密码认证,默认是打开的;
(21)回到虚拟机,修改网络连接方式,注意进入网络适配器,禁用虚拟机另外一个网络;
/etc/init.d/ssh restart
#重启ssh服务
/etc/init.d/networking restart
#重启网络服务
ifconfig
#查看虚拟机IP地址
(22)配置远程链接,打开secureCRT,Quick Connect;
(23)配置虚拟机IP地址,登陆账号,将公钥提前启动档次,选择properties;
(24)选择私钥路径,connet;
(25)回车键链接成功;
收起阅读 »
在VirtualBox安装debian8.8(完整版)
1.完整版,是通过debian官网下载系统iso盘进行安装。好处是:可以根据个人需要进行分区,并且熟悉系统;
【参考: http://www.cnblogs.com/zhangkaimin/p/4213578.html 】
(1)通过官网下载最新版本的iso;https://www.debian.org/distrib/
(2)新建一个文件夹存放建立的虚拟硬盘;
(3)打开VirtualBox,新建,输入虚拟机的名称,下一步;
(4)分配内存:1024,下一步;
(5)不添加虚拟硬盘,创建;
(6)继续;
(7)选中新建的系统,点击选项框的设置,选中“存储”选项卡;
(8)选择创建虚拟硬盘;
(9)选择VDI,下一步;
(10)动态分配,下一步;
(11)设定存储VDI位置,这里为刚新建文件夹,修改新建VDI名字为“boot.VDI”,大小为30GB;
(12)同样的方式新建另外一块虚拟硬盘,存储位置刚新建文件夹,名字为“home.VDI”,大小为40GB;
(13)选择光盘,为官网下载的系统ISO;
(14)确定后,双击启动系统,选择“Graphical install”,Enter键;
(15)语言建议默认English;
(16)地理位置HongKong;
(17)键盘默认American English;
(18)Hostname:debian(可自行设置);
(19)Domain name:debian
(20)Hostname的密码;
(21)新的用户账号:osboxes(可自行设置);
(22)用户账号;
(23)用户账号的密码;
(24)分区选中Manual;
(25)选中第一块硬盘,continue;
(26)分配空间为30GB;Primary;Begining;
(27)剩余2.2GB全部分配;Logical;确保Use as: swap;
(28)选中第二块硬盘;42.9GB;Logical;确保EX4,挂靠为/home;
(29)确定安装源的位置China,建议ftp.cn.debian.org;
(30)pro X,Y暂时留白,后期根据需要个人进行设置;
(31)考虑后期要远程链接,建议SSH勾上;
(32)选择Grub挂载硬盘,选择根目录为主的sda硬盘;
(32)最后重新启动,进入可视化界面登陆;
收起阅读 »
【参考: http://www.cnblogs.com/zhangkaimin/p/4213578.html 】
(1)通过官网下载最新版本的iso;https://www.debian.org/distrib/
(2)新建一个文件夹存放建立的虚拟硬盘;
(3)打开VirtualBox,新建,输入虚拟机的名称,下一步;
(4)分配内存:1024,下一步;
(5)不添加虚拟硬盘,创建;
(6)继续;
(7)选中新建的系统,点击选项框的设置,选中“存储”选项卡;
(8)选择创建虚拟硬盘;
(9)选择VDI,下一步;
(10)动态分配,下一步;
(11)设定存储VDI位置,这里为刚新建文件夹,修改新建VDI名字为“boot.VDI”,大小为30GB;
(12)同样的方式新建另外一块虚拟硬盘,存储位置刚新建文件夹,名字为“home.VDI”,大小为40GB;
(13)选择光盘,为官网下载的系统ISO;
(14)确定后,双击启动系统,选择“Graphical install”,Enter键;
(15)语言建议默认English;
(16)地理位置HongKong;
(17)键盘默认American English;
(18)Hostname:debian(可自行设置);
(19)Domain name:debian
(20)Hostname的密码;
(21)新的用户账号:osboxes(可自行设置);
(22)用户账号;
(23)用户账号的密码;
(24)分区选中Manual;
(25)选中第一块硬盘,continue;
(26)分配空间为30GB;Primary;Begining;
(27)剩余2.2GB全部分配;Logical;确保Use as: swap;
(28)选中第二块硬盘;42.9GB;Logical;确保EX4,挂靠为/home;
(29)确定安装源的位置China,建议ftp.cn.debian.org;
(30)pro X,Y暂时留白,后期根据需要个人进行设置;
(31)考虑后期要远程链接,建议SSH勾上;
(32)选择Grub挂载硬盘,选择根目录为主的sda硬盘;
(32)最后重新启动,进入可视化界面登陆;
收起阅读 »
在VirtualBox安装debian8.6系统的方法(简易版)
1.简易版,是加载由VirtualBox提供的虚拟硬盘镜像进行安装,简易而且方便,适合新手体验;
官网: http://www.osboxes.org/ 安装向导: http://www.osboxes.org/guide/
根据虚拟机的软件和要安装的linux系统进行选择:
本机使用的是VirtualBox5.0.40版本,系统是osboxes提供的debian8.6镜像;
1.1进入官网,在左上角搜索debian;
1.2选择最新版本的镜像8.6;
1.3下拉点击下载页面;
1.4根据虚拟机版本和电脑系统版本选择下载的镜像;
注意点:
(1)右红框为该系统的【日常用户账号,登陆密码】【管理员账号,登陆密码】;
(2)在安装完成后首次登陆系统的账号,后续可因需要个人进行修改密码;
(3)登陆需使用日常用户账号登陆,再通过“su -”命令切换至root账号;
1.5下载完成后,打开虚拟机进行首次安装,点击新建,弹出“新建虚拟电脑”,输入系统名称后,版本和类型会自动更换为相应的信息,如错误,可自行选择,此处输入debian;
1.6设定虚拟内存,设定1024就足够了;
1.7选择使用已有的虚拟硬盘软件,选中刚下载的“debian镜像文件,点击创建”
1.8设定网络链接,选中debian,点击设置,在弹出的对话框中,选中网络选项,设置为“桥接方式”,网卡为“接了网线则为有线网卡,无线则为无线网卡”,下方的接入网线必选;
1.9之后双击直接启动虚拟机,也可通过虚拟机的右键选择启动选项;
2.0以上简易版安装完毕
收起阅读 »
官网: http://www.osboxes.org/ 安装向导: http://www.osboxes.org/guide/
根据虚拟机的软件和要安装的linux系统进行选择:
本机使用的是VirtualBox5.0.40版本,系统是osboxes提供的debian8.6镜像;
1.1进入官网,在左上角搜索debian;
1.2选择最新版本的镜像8.6;
1.3下拉点击下载页面;
1.4根据虚拟机版本和电脑系统版本选择下载的镜像;
注意点:
(1)右红框为该系统的【日常用户账号,登陆密码】【管理员账号,登陆密码】;
(2)在安装完成后首次登陆系统的账号,后续可因需要个人进行修改密码;
(3)登陆需使用日常用户账号登陆,再通过“su -”命令切换至root账号;
1.5下载完成后,打开虚拟机进行首次安装,点击新建,弹出“新建虚拟电脑”,输入系统名称后,版本和类型会自动更换为相应的信息,如错误,可自行选择,此处输入debian;
1.6设定虚拟内存,设定1024就足够了;
1.7选择使用已有的虚拟硬盘软件,选中刚下载的“debian镜像文件,点击创建”
1.8设定网络链接,选中debian,点击设置,在弹出的对话框中,选中网络选项,设置为“桥接方式”,网卡为“接了网线则为有线网卡,无线则为无线网卡”,下方的接入网线必选;
1.9之后双击直接启动虚拟机,也可通过虚拟机的右键选择启动选项;
2.0以上简易版安装完毕
收起阅读 »
安装VirtualBox
1.下载安装Virtualbox;
官网:https://www.virtualbox.org/ ; 截止文章发表的时间,目前最新的版本是5.1.2;但我下载最新版本使用时与系统有些配置出现冲突,因此退而求其次使用了5.0.40;
1.1根据自己所需要的版本进行下载,主机电脑是windows,因此下载windos版本;
1.2点击主程序进行安装,建议是一路next,只要修改安装的路径即可;
1.3修改安装路径,next;
1.4根据需要修改启动方式和快捷键,next;
1.5安装时网络会暂时中断,Yes;
1.6点击install;
1.7完成安装,界面如下;
收起阅读 »
官网:https://www.virtualbox.org/ ; 截止文章发表的时间,目前最新的版本是5.1.2;但我下载最新版本使用时与系统有些配置出现冲突,因此退而求其次使用了5.0.40;
1.1根据自己所需要的版本进行下载,主机电脑是windows,因此下载windos版本;
1.2点击主程序进行安装,建议是一路next,只要修改安装的路径即可;
1.3修改安装路径,next;
1.4根据需要修改启动方式和快捷键,next;
1.5安装时网络会暂时中断,Yes;
1.6点击install;
1.7完成安装,界面如下;
收起阅读 »
爬虫获取CSDN用户的排名
http://30daydo.com/article/185
这个是很简单的一个爬虫脚本。 我设置成每周运行一次,这样就可以监测自己的账号每周的排名情况。 还可以绘制成曲线图标,很直观的可以看出每周的排名变化:
具体的python代码如下:
只要把代码中的用户名改成你的csdn的用户名就可以了。
然后在linux或者windows设置每周一心一次,程序自动记录到csdn.txt这个文件里头。 收起阅读 »
这个是很简单的一个爬虫脚本。 我设置成每周运行一次,这样就可以监测自己的账号每周的排名情况。 还可以绘制成曲线图标,很直观的可以看出每周的排名变化:
具体的python代码如下:
#Get your range of csdn
'''
http://30daydo.com
contact: weigesysu@qq.com
'''
import urllib2,re
import time
link='http://blog.csdn.net/[b]用户名[/b]/article/details/52858314'
user_agent = "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)"
header = {"User-Agent": user_agent}
req = urllib2.Request(link, headers=header)
resp = urllib2.urlopen(req)
content = resp.read()
#print content
p=re.compile(r'<li>排名:<span>第(\d+)名</span></li>')
result=p.findall(content)
print result[0]
today=time.strftime("%Y-%m-%d")
print today
f=open("data/csdn_range.txt",'a')
contents=today+'\t'+result[0]+'\n'
f.write(contents)
f.close()
只要把代码中的用户名改成你的csdn的用户名就可以了。
然后在linux或者windows设置每周一心一次,程序自动记录到csdn.txt这个文件里头。 收起阅读 »
python 多线程监测股票涨停板打开 并通知用户
相信打板一族一个习惯就是需要盯盘,这个一件很累的事情。 需要时刻盯着分时走势,委托单的数目,涨停打开,回封。
下面写了一个用python监测准备要打开涨停板的股票。 用多线程实现,可以支持同时监测多个股票,如果遇到撤单或者托单数少于某个临界值,说明涨停很快就要被打开。
用法: 创建一个data文件夹,里面存放一个bases.csv文件,这个文件保存了A股的所有股票基本信息。 至于如何获取。请参看连接:
然后创建一个monitor_list.log的文件,把你要监测的股票代码写进去,一个代码写一行。
如果你需要程序发信息到你的手机或者邮箱,那么在data文件夹下创建一个data.cfg的文件,里面的内容格式为:
from_mail=从这个邮箱发出,我测试的是QQ邮箱
password=发出邮箱的密码
to_mail=需要发送到的通知邮箱,推荐139邮箱,这个会推送到短信手机,等同于发一个短信给你。
然后直接运行就可以了。 收起阅读 »
下面写了一个用python监测准备要打开涨停板的股票。 用多线程实现,可以支持同时监测多个股票,如果遇到撤单或者托单数少于某个临界值,说明涨停很快就要被打开。
# -*-coding=utf-8-*-
__author__ = 'Rocky'
'''
http://30daydo.com
Contact: weigesysu@qq.com
'''
import smtplib, time, os, datetime
from email.mime.text import MIMEText
from email.header import Header
from toolkit import Toolkit
from email.mime.multipart import MIMEMultipart
from email import Encoders, Utils
from toolkit import Toolkit
import tushare as ts
from pandas import Series
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
import threading
#监测涨停板开板监测
class break_monitor():
def __init__(self,send=True):
self.send=send
if self.send==True:
cfg = Toolkit.getUserData('data.cfg')
from_mail = cfg['from_mail']
password = cfg['password']
to_mail = cfg['to_mail']
smtp_server = 'smtp.qq.com'
self.server = smtp_server
self.username = from_mail.split("@")[0]
self.from_mail = from_mail
self.password = password
self.to_mail = to_mail
# 初始化邮箱设置读取需要股票信息
# 这样子只登陆一次
try:
self.smtp = smtplib.SMTP_SSL(port=465)
self.smtp.connect(self.server)
self.smtp.login(self.username, self.password)
except smtplib.SMTPException, e:
print e
return 0
self.bases = pd.read_csv('bases.csv', dtype={'code': np.str})
self.stocklist = Toolkit.read_stock('monitor_list.log')
def send_txt(self, name, content):
subject = '%s' % name
self.msg = MIMEText(content, 'plain', 'utf-8')
self.msg['to'] = self.to_mail
self.msg['from'] = self.from_mail
self.msg['Subject'] = subject
self.msg['Date'] = Utils.formatdate(localtime=1)
try:
self.smtp.sendmail(self.msg['from'], self.msg['to'], self.msg.as_string())
self.smtp.quit()
print "sent"
except smtplib.SMTPException, e:
print e
return 0
#开板提示
def break_ceil(self, code):
print threading.current_thread().name
while 1:
#print code
time.sleep(2)
try:
df = ts.get_realtime_quotes(code)
except:
time.sleep(5)
continue
v = long(df['b1_v'].values[0])
if v <= 1000:
print datetime.datetime.now().strftime("%H:%M:%S")
print u"小于万手,小心!跑"
if self.send==True:
self.push_msg('break', 10, 10, 'down')
#这里可以优化,不必每次都登陆。
def monitor_break(self,send=True):
thread_num = len(self.stocklist)
thread_list = []
join_list = []
for i in range(thread_num):
t = threading.Thread(target=self.break_ceil, args=(self.stocklist[i],))
thread_list.append(t)
for j in thread_list:
j.start()
for k in thread_list:
k.join()
if __name__ == '__main__':
path = os.path.join(os.getcwd(), 'data')
if os.path.exists(path) == False:
os.mkdir(path)
os.chdir(path)
obj = break_monitor(send=False)
obj.monitor_break()
用法: 创建一个data文件夹,里面存放一个bases.csv文件,这个文件保存了A股的所有股票基本信息。 至于如何获取。请参看连接:
然后创建一个monitor_list.log的文件,把你要监测的股票代码写进去,一个代码写一行。
如果你需要程序发信息到你的手机或者邮箱,那么在data文件夹下创建一个data.cfg的文件,里面的内容格式为:
from_mail=从这个邮箱发出,我测试的是QQ邮箱
password=发出邮箱的密码
to_mail=需要发送到的通知邮箱,推荐139邮箱,这个会推送到短信手机,等同于发一个短信给你。
然后直接运行就可以了。 收起阅读 »
挂一字板涨停个股 委托单合同编号越靠前是不是越容易成交
以自己的亲身经历告诉大家,这个没有一点用! 试过2个星期,没成功交易过。
编号2或者深圳编号为1都不可能成交。 因为夜市委托并没有进入到交易所。
要等到第二天9:15的时候,券商才会把委托“统一”地提交到交易所。 下面说的都是以一字涨停板为例(如果不是涨停板,你坚决要买就挂个涨停价就可以了,最后是以成交后的成交价为交易价格,比如你晚上挂了个涨停价10元,第二天开盘后,开盘价是9元,最终你也是以9元成交的,并不是你委托的10元)
一般对于券商VIP客户或者所谓的大户,委托单数目巨大,就会排到前面。后面跟的是小单。 所以你的散单很少机会能够在开盘的时候就能够成交。 盘中就另当别论了,如果被砸开或者有人在涨停板上吸货的话,你还是有机会能够排得到。 不过这个时候的换手率绝对不低。 收起阅读 »
编号2或者深圳编号为1都不可能成交。 因为夜市委托并没有进入到交易所。
要等到第二天9:15的时候,券商才会把委托“统一”地提交到交易所。 下面说的都是以一字涨停板为例(如果不是涨停板,你坚决要买就挂个涨停价就可以了,最后是以成交后的成交价为交易价格,比如你晚上挂了个涨停价10元,第二天开盘后,开盘价是9元,最终你也是以9元成交的,并不是你委托的10元)
一般对于券商VIP客户或者所谓的大户,委托单数目巨大,就会排到前面。后面跟的是小单。 所以你的散单很少机会能够在开盘的时候就能够成交。 盘中就另当别论了,如果被砸开或者有人在涨停板上吸货的话,你还是有机会能够排得到。 不过这个时候的换手率绝对不低。 收起阅读 »