Math equations

Showing posts with label Python. Show all posts
Showing posts with label Python. Show all posts

Monday, July 22, 2013

[Pb탐구] 모순회PB수익률의 기대값 최적화

가이드에 있는 레아시스 유저들의 연구결과에 따르면

모험심 스탯은 1 올라갈 때마다 1.25 %씩 수익률 범위를 늘려주고
[비틀즈 PB Guide] 모험심에 대하여 #2
순발력은 1올라갈 때마다 50%부터 1%씩 성공률을 높여준다.
[비틀즈 PB Guide] 순발력에 대하여 #3

회복력은 손해가 나는 경우 3%씩 손해금액을 줄여주고, 34넘게 찍으면 투자실패시 오히려 이익을 가져다 준다. [비틀즈 PB Guide] 회복력에 대하여 #4
모험심을 a,  순발력을 b 그리고 회복력을  c라고 하고,
수익률 범위가 성공 실패시 각각 균일한 분포를 따른다고 가정하면

수익률의 기대값을 다음과 같이 구할 수 있다.
$$ \frac{50+b}{100}\frac{1.25a}{200} -\frac{50-b}{100}\frac{1.25a}{200}\frac{100-3c}{100}$$

이 식을 정리하면

$$ \frac{1.25}{20000}(2ab + \frac{3}{2}ac -\frac{3abc}{100})$$
를 얻고

다음과 같은 파이썬 코드로 최대값을 구할 수 있다.

import re
import sys
def main():

  total = 56
  Max=0

  for a in range(1,2*total+1):
    for b in range(1,2*total -a):
      c= 2*total -a -b
      outcome = 400*a*b+300*a*c - 3*a*b*c
      if outcome > Max and c>1:
Max = outcome
print a/float(2),b/float(2),c/float(2), Max*1.25/16000000






if __name__ == '__main__':
  main()
 수식을 직접 입력할 경우 소수점 에러가 발생하기 때문에, 정수를 가지고 계산을 했다. 코드에 있는 a,b,c는 사실은 2a,2b,2c이다.

 세 스탯의 총합으로 가능한 최대값은 레벨이 50인 경우를 감안하면 56이고 코드를 돌려 최대값을 계산하면


21.0 34.0 1.0 0.08988
21.5 33.5 1.0 0.09069640625
22.0 33.0 1.0 0.09145125
22.5 32.5 1.0 0.09214453125
23.0 32.0 1.0 0.09277625
23.5 31.5 1.0 0.09334640625
24.0 31.0 1.0 0.093855
24.5 30.5 1.0 0.09430203125
25.0 30.0 1.0 0.0946875
25.5 29.5 1.0 0.09501140625
26.0 29.0 1.0 0.09527375
26.5 28.5 1.0 0.09547453125
27.0 28.0 1.0 0.09561375
27.5 27.5 1.0 0.09569140625
28.0 27.0 1.0 0.0957075

와 같은 결과를 얻을 수 있다. 결국 레벨 50 일반 Pb의 수익률 기대값은 약 9.5%이고 최적 스탯은 모험 28 순발력 27 회복력 1임을 알 수 있다.

 일반 Pb중 회복력 스탯이 1이면서, 운결에 투자된 기본 스탯이 가장 낮은 pb는 바로 부녀회장으로, 모순형 Pb를 육성한다면 부녀회장이 최고의 선택이라 할 수 있다.


역시 부녀회장님이 최고!



Thursday, July 4, 2013

User-Agent가 뭐지?

날이면 날마다 인터넷을 이용하지만, 사실 인터넷이 어떻게 작동하고 있는지는 잘 모르고 있는 것 같다.

오늘은 User-Agent에 대해서 조금 써보려고 한다.

한국어로는 사용자 에이전트로 번역한다. 위키
보통 그렇듯 내용이 짧아 별게 없는데 영어위키를 보면 설명이 더 쉽게 되어있다.

사용자를 대신해서 인터넷에 접속하는 소프트웨어. 즉 브라우저다.

인터넷 사이트에 접속할 때 User-agent는 사용자에 관한 정보를 전송하게 되는데
그게 바로 "User-Agent" header 사용자 에이전트 헤더다.

이건 그냥 문자열인데, 브라우저/운영체제 등에 관한 정보를 담고 있다.

현재 사용하고 있는 유저 에이전트 헤더를 확인하려면

http://www.whatsmyuseragent.com/
를 방문하면 된다.

지금 사용하고 있는 컴퓨터로 이 사이트를 방문했더니

Your User Agent String is:Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/29.0.1547.0 Safari/537.36

이런 정보가 나왔다.

리눅스를 사용하고 있다는 사실이 이렇게 드러나고 있었던 것이다.


파이썬으로 웹페이지를 방문하는 법에 대해서 이전 포스팅에서 언급한 적이 있는데
http://rheasis.blogspot.com/2013/06/blog-post_16.html
이 경우 User agent는 Python-urllib/2.7
이런식으로 나오기 때문에 서버 측에서 보통 웹브라우저가 아니라 파이썬을 이용해서 접속했다는 걸 알 수가 있겠다.


사용자 에이전트 정보에 따라서 서버 측에서 다른 웹페이지를 보여주는 것이 가능하기 때문에, 때로는 파이어폭스를 쓰면서 익스플로러를 쓰는 척하거나 리눅스를 쓰면서 윈도우에서 접속한 척하는 게 유용한 경우가 있는데

역시, 사람들이 이미 다 만들어놓았다.

파이어폭스 애드온 User agent switcher.




파이썬으로도 사용자 에이전트 헤더를 바꾸는 게 가능한다.


import urllib2
opener = urllib2.build_opener()
opener.addheaders = [('User-agent', 'Mozilla/5.0')]
opener.open('http://www.example.com/')

를 따라하면 된다.

내 경우에는 이렇게..
opener.addheaders=[('User-agent', 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/29.0.1547.0 Safari/537.36')]

바꿔주면 된다.




본 포스트는 레아시스와 무관합니다.



Sunday, June 16, 2013

파이썬으로 웹페이지에 로그인하기.


오늘 배운 Python 팁이다.

파이썬으로 일반 웹페이지의 HTML코드를 읽어오는 것은 쉽다.

http://www.boddie.org.uk/python/HTML.html 에 잘 나와있듯이

import urllib
# Get a file-like object for the Python Web site's home page.
f = urllib.urlopen("http://www.python.org")
# Read from the object, storing the page's contents in 's'.
s = f.read()
f.close()

이렇게 urllib을 써서 쉽게 할 수 있다.

파이썬으로 쿠키를 써서 인증을 해야하는 사이트에 접속하고 싶을 때는 약간 다르다. 이 문제에 관해서는 Stackoverflow에 답이 있고

How to use Python to login to a webpage and retrieve cookies for later usage?

한글로 번역된 웹페이지도 있다.

이 사이트들이 소개하고 있는 답은 다음과 같은 코드인데,
import urllib, urllib2, cookielib

username = 'myuser'
password = 'mypassword'

cj = cookielib.CookieJar()
opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cj))
login_data = urllib.urlencode({'username' : username, 'j_password' : password})
opener.open('http://www.example.com/login.php', login_data)
resp = opener.open('http://www.example.com/hiddenpage.php')
print resp.read()

이 코드를 레아시스를 예로 들어 살펴보자.

3,4번째 줄은 아이디와 비번을 입력하는 부분이고,
login_data = urllib.urlencode({'username' : username, 'j_password' : password})
이 부분을 제대로 수정하려면 해당 웹페이지의 로그인 화면의 Html코드를 살펴봐야한다. 다음은 레아시스의 로그인 창에 해당하는 코드다.


<input type="text" class="input_login" id="member_id" name="member_id" maxlength="20" required itemname="ID" value="ID"
onfocus="if (this.value=='ID') this.value='';" onblur="if (this.value=='') this.value='ID';"
style="padding-left:3px; ime-mode:disabled;" >
</div>

<div class="input_pw">
<input type="password" class="input_login" name="member_password" maxlength="20" itemname="PASSWORD"
style="width:128px;background:url(./design/login/basic_black/img/password.png) no-repeat;background-color:#ffffff;"
onfocus="this.style.backgroundImage=''" onblur="if (this.value=='') this.style.backgroundImage='url(./design/login/basic_black/img/password.png)';" >

노란색으로 표시된 부분을 참고, 다음과 같이 코드를 바꿔주자.
login_data = urllib.urlencode({'member_id' : username, 'member_password' : password})
 그 다음 opener부분을 바꾸기 위해서는 웹페이지의 히스토리를 참고하면 된다. 레아시스에 로그인할 때 logincheck.php의 주소를 이용,
opener.open('http://www.example.com/login.php', login_data)


opener.open('http://rheasis.com/framework/login/login_check.php', login_data)
로 바꿔준다.

그 다음엔 opener로 얻은 쿠키를 이용해서 인증이 필요한 곳에 접근할 수 있다.

예를 들어 이런 코드를 덧붙이면

f=opener.open('http://www.rheasis.com/rheasis/stock/?id=stock&code=20') 
print f.read()



http://www.rheasis.com/rheasis/stock/?id=stock&code=20 의 html을 출력한다.



이제 레아시스 웹페이지를 html로 볼 수 있게 되었다(--?)