인공지능과 파이썬을 이용하면 복잡한 계산을 쉽게 해결할 수 있다.

두 가지 예시를 제시해 본다.

 

첫 번째: 실질 세후수익 비교

 

1. 하루만 맡겨도 연 환산 3.65%인 경우

 

1-1 하루에 0.01%(→ 3.65% / 365일)씩 복리로 이자가 붙는 경우

이 경우에 실제 이자율은 1.0001^365 - 1 ≒ 3.71724%이다.

초기 투자액이 10,000원인 경우에

세후 이자수익: 313.59원, 납부 세액: 57.08원

 

1-2 하루에 1.0365^(1/365) - 1 ≒ 0.0098223% 만큼 복리로 이자가 붙는 경우

세후 이자수익: 307.94원, 납부 세액: 56.05원

 

2. 일 년 후에 3.65%의 이자를 지급받는 경우

세후 이자수익: 308.79원, 납부 세액: 56.21원

 

1-1는 2보다 1년 후 세후 이자 수익이 크다. 실제 이자율이 더 높기 때문이다.

1-2는 2보다 1년 후 세후 이자 수익이 작다. 매일 세금을 뜯기면서 세금의 복리효과를 겪기 때문이다.

금융회사에서 실제로 어떤 방법을 사용하고 있는지는 모름.

 

1-1 계산법이면 수익률 자체가 더 크므로 좋고

1-2 계산법이더라도 2번 방식과 비교했을 때 차이가 미미하므로

편리함으로 모자람을 충분히 만회할 수 있을 것 같음.

 

 

코드 작성은 인공지능을 이용했다.

 

프롬프트

파이썬 코드를 만들어줘. 이자율이 연 3.65%이고 하루만 예치해도 이자가 나와. 이자는 15.4%의 세금을 차감하고 지급되어. 다음날은 불어난 원금에 다시 하루치 이자가 붙고 거기에 15.4%의 세금이 차감되고 지급되지. 이렇게 365일 동안 1만 원을 예치하는 경우 납부한 세금과 이자수익이 얼마인지를 표시해 주는 거야.

 

# 초기 원금
initial_principal = 10000

# 연 이자율
annual_interest_rate = 0.0365

# 세율
tax_rate = 0.154

# 예치 일수
days = 365

# 초기 원금 설정
principal = initial_principal

# 총 이자 수익과 총 세금 초기화
total_interest_earned = 0
total_tax_paid = 0

# 일 이자율 계산 (1-2의 답을 구하기 위해서는 daily_interest_rate = 0.000098223를 넣으면 된다)
daily_interest_rate = annual_interest_rate / 365

# 365일 동안 이자 계산
for day in range(1, days + 1):
    # 하루 이자 계산
    daily_interest = principal * daily_interest_rate
    
    # 세금 계산
    tax = daily_interest * tax_rate
    
    # 세금을 차감한 실제 이자
    net_interest = daily_interest - tax
    
    # 원금에 이자 추가
    principal += net_interest
    
    # 총 이자 수익과 총 세금 업데이트
    total_interest_earned += net_interest
    total_tax_paid += tax

# 결과 출력
print(f"납부한 세금: {total_tax_paid:.2f} 원")
print(f"이자 수익: {total_interest_earned:.2f} 원")

 

 

 

 

두 번째: 도박에서 돈을 딸 확률

 

어떤 사람이 51달러를 내고 동전 던지기 게임을 한다. 100번을 던져서 앞면이 나올 때마다 1달러씩 받는 것이다. 기대값으로는 이 사람은 1달러의 손해를 보는 게임이다. 그는 지금 20번 던졌고 운이 좋게도 15번 앞면이 나왔다. 앞으로 80번을 더 던져야 한다. 이 사람이 최종적으로 수익을 보면서 게임을 마치게 될 확률은 몇 퍼센트인가?

 

답: 78.3%

 

코파일럿(창의적인 모드)의 답변

모르는 수학 용어가 많아서 외계어 같다. 채팅창에는 수식이 깨지지 않고 출력된다

코파일럿의 정밀한 모드가 예전에 비해 많이 똑똑해졌는데 창의적인 모드에 비해 수학과 코딩은 아직 부족하다.

좀 더 직관적인 해결법을 보고 싶다면 몬테카를로 시뮬레이션 방식으로 풀어달라고 요청하면 되는데 기대와 달리 시간이 예상보다 많이 걸린다.

 

 

    20번 던져서 15번 앞면이 나왔습니다. 따라서 현재 그는 15달러를 벌었습니다.
    초기 비용이 51달러였으므로 현재 그의 총 수익은 15달러 - 51달러 = -36달러입니다.
    앞으로 80번을 더 던져야 합니다.

각 동전 던지기의 기대값은 앞면이 나올 확률이 0.5이므로 80번 던질 때 앞면이 나올 기대값은 80 * 0.5 = 40번입니다. 앞면이 40번 나오면 40달러를 벌게 됩니다.

따라서 80번 더 던질 때의 기대 수익은 40달러입니다.

현재 -36달러에서 40달러를 더하면 최종 기대 수익은 4달러입니다.

하지만 우리는 이 기대값이 아니라 실제로 수익을 볼 확률을 구해야 합니다.

동전 던지기의 결과는 이항 분포를 따릅니다. 80번의 던지기에서 앞면이 나오는 횟수는 이항 분포 B(80, 0.5)를 따릅니다.

이 사람이 수익을 보려면 최종적으로 최소한 52달러를 벌어야 합니다. 현재 15달러를 벌었으므로 앞으로 37달러를 더 벌어야 합니다. 이는 앞으로 80번의 던지기에서 적어도 37번 이상의 앞면이 나와야 함을 의미합니다.

이항 분포 B(80, 0.5)에서 37번 이상 앞면이 나올 확률은 다음과 같이 계산할 수 있습니다:

P(X >= 37) = 1 - P(X < 37)

여기서 P(X < 37)은 누적 분포 함수(CDF)를 사용하여 계산할 수 있습니다. 이를 직접 계산하기는 복잡하므로, 통계 소프트웨어나 계산기를 사용하여 값을 구할 수 있습니다.

보통 이러한 확률은 정규 분포로 근사할 수 있습니다. 이항 분포 B(n, p)는 n이 클 때 정규 분포 N(np, np(1-p))로 근사됩니다. 여기서는 n=80, p=0.5이므로 정규 분포 N(40, 20)으로 근사됩니다.

정규 분포에서 Z-점수를 사용하여 P(X >= 37)을 구할 수 있습니다.

Z = (X - μ) / σ
여기서 μ = np = 40, σ = sqrt(np(1-p)) = sqrt(800.50.5) = sqrt(20) = 약 4.47

Z = (37 - 40) / 4.47 = -3 / 4.47 = 약 -0.67

Z-점수가 -0.67일 때, 정규 분포표에서 누적 확률은 약 0.2514입니다.

따라서 P(X < 37) = 0.2514이고, P(X >= 37) = 1 - 0.2514 = 0.7486입니다.

따라서 이 사람이 최종적으로 수익을 보면서 게임을 마치게 될 확률은 약 74.86%입니다.

 

 

 

 

 

이 문제를 인공지능이 만들어준 파이썬 코드로 돌려보면 78.3%가 나온다. 다른 인공지능과 교차검증을 해도 78.3%에 가깝다. 챗봇이 직접 계산하는 데는 오류가 많으므로 코드를 직접 실행한 결과인 78.3%가 맞을 것 같다.

아래는 이 문제를 해결하기 위해서 인공지능이 만들어준 파이썬 코드다.

 

import math

# 이항 분포의 확률 질량 함수(PMF)
def binomial_pmf(n, k, p):
    return math.comb(n, k) * (p ** k) * ((1 - p) ** (n - k))

# 현재 상황
current_heads = 15
current_tosses = 20
total_tosses = 100
remaining_tosses = total_tosses - current_tosses
initial_investment = 51
current_earnings = current_heads

# 수익을 내려면 필요한 최소한의 앞면 수 (51달러를 벌면 수익이 0이니까 52가 필요함)
min_heads_needed = 52 - current_earnings

# 이항 분포의 누적 분포 함수(CDF)를 계산하는 함수
def binomial_cdf(n, p, k):
    cdf = 0
    for i in range(k, n + 1):
        cdf += binomial_pmf(n, i, p)
    return cdf

# 동전의 앞면이 나올 확률
p = 0.5

# 앞으로 80번 던져서 최소 min_heads_needed번 앞면이 나올 확률
probability = binomial_cdf(remaining_tosses, p, min_heads_needed)

print(f"최종적으로 수익을 보면서 게임을 마치게 될 확률은 {probability * 100:.2f}% 입니다.")

 

 

수학과 통계 지식이 없는 나같은 사람에게 이런 설명은 좌절을 줄 뿐이다. 보다 직관적인 이해를 위해 몬테카를로 시뮬레이션을 사용해 볼 수도 있다. (구글ai 스튜디오)

 

import random

def coin_flip_simulation(trials, flips_remaining, current_wins):
  """동전 던지기 시뮬레이션 함수"""
  wins = 0  # 시뮬레이션 성공 횟수 (수익을 보는 경우)

  for _ in range(trials):
    total_wins = current_wins  # 현재까지 앞면 나온 횟수
    for _ in range(flips_remaining):
      if random.random() < 0.5:  # 앞면 확률 0.5
        total_wins += 1

    if total_wins > 51:  # 51달러 이상 획득하면 성공
      wins += 1

  return wins / trials  # 성공 확률 계산


trials = 1000000  # 시뮬레이션 횟수 (1억 번)
flips_remaining = 80  # 남은 던지기 횟수
current_wins = 15  # 현재까지 앞면 나온 횟수

probability = coin_flip_simulation(trials, flips_remaining, current_wins)

print("수익을 보면서 게임을 마칠 확률:", probability * 100, "%")
Use code with caution.Python

실행 결과:

수익을 보면서 게임을 마칠 확률: 18.1813 %
Use code with caution.

코드 설명:

  1. coin_flip_simulation 함수:
    • trials: 시뮬레이션 횟수
    • flips_remaining: 남은 던지기 횟수
    • current_wins: 현재까지 앞면 나온 횟수
    • 함수 내에서 trials 만큼 시뮬레이션을 반복합니다.
    • 각 시뮬레이션에서 flips_remaining 만큼 동전을 던지고 앞면이 나오면 total_wins를 증가시킵니다.
    • 시뮬레이션 후 total_wins가 51보다 크면 (수익을 보면) wins를 증가시킵니다.
    • 최종적으로 성공 확률 (wins / trials)을 반환합니다.
  2. trials, flips_remaining, current_wins 변수 설정: 문제에서 주어진 값으로 설정합니다.
  3. coin_flip_simulation 함수 호출: 설정된 값을 사용하여 시뮬레이션을 실행하고 결과를 probability 변수에 저장합니다.
  4. 결과 출력: 수익을 보면서 게임을 마칠 확률을 백분율로 출력합니다.

결론:

몬테카를로 시뮬레이션 결과, 이 사람이 최종적으로 수익을 보면서 게임을 마치게 될 확률은 약 18.18%입니다.

Posted by 누미
,