Last active
July 2, 2018 14:23
-
-
Save yukoba/66bbbf6a971817d28c48586d60a68b0d to your computer and use it in GitHub Desktop.
税
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# 2018年度用 | |
def calc_kojin(income, age): | |
# 基礎控除 | |
kisokoujyo_kuni = 38 | |
kisokoujyo_chihou = 33 | |
# 給与所得控除 https://www.nta.go.jp/m/taxanswer/1410.htm | |
if income <= 180: | |
kyuyo_shotoku_koujyo = max(65, income * 0.4) | |
elif income <= 360: | |
kyuyo_shotoku_koujyo = income * 0.3 + 18 | |
elif income <= 660: | |
kyuyo_shotoku_koujyo = income * 0.2 + 54 | |
elif income <= 1000: | |
kyuyo_shotoku_koujyo = income * 0.1 + 120 | |
else: | |
kyuyo_shotoku_koujyo = 220 | |
# 厚生年金 https://www.kyoukaikenpo.or.jp/~/media/Files/shared/hokenryouritu/h30/ippan4gatu_2/h30413tokyo_02.pdf | |
if income <= 9.3 * 12: | |
kousei_nenkin = 1.6104 * 12 | |
elif income <= 63.5 * 12: | |
kousei_nenkin = income * 0.183 | |
else: | |
kousei_nenkin = 11.346 * 12 | |
# 協会けんぽ | |
if 40 <= age <= 64: | |
if income <= 6.3 * 12: | |
kenpo = 0.5742 * 12 | |
elif income <= 135.5 * 12: | |
kenpo = income * 0.1147 | |
else: | |
kenpo = 15.9433 * 12 | |
else: | |
if income <= 6.3 * 12: | |
kenpo = 0.66526 * 12 | |
elif income <= 135.5 * 12: | |
kenpo = income * 0.099 | |
else: | |
kenpo = 13.7610 * 12 | |
# 所得税 https://www.nta.go.jp/taxes/shiraberu/taxanswer/shotoku/2260.htm | |
kazei_income_kuni = max(0, | |
income - kisokoujyo_kuni - | |
kyuyo_shotoku_koujyo - (kousei_nenkin + kenpo) / 2) | |
if kazei_income_kuni <= 195: | |
syotokuzei = kazei_income_kuni * 0.05 | |
elif kazei_income_kuni <= 330: | |
syotokuzei = kazei_income_kuni * 0.1 - 9.75 | |
elif kazei_income_kuni <= 695: | |
syotokuzei = kazei_income_kuni * 0.2 - 42.75 | |
elif kazei_income_kuni <= 900: | |
syotokuzei = kazei_income_kuni * 0.23 - 63.6 | |
elif kazei_income_kuni <= 1800: | |
syotokuzei = kazei_income_kuni * 0.33 - 153.6 | |
elif kazei_income_kuni <= 4000: | |
syotokuzei = kazei_income_kuni * 0.4 - 279.6 | |
else: | |
syotokuzei = kazei_income_kuni * 0.45 - 479.6 | |
# 特別復興所得税 | |
syotokuzei = syotokuzei * 1.021 | |
# 住民税 | |
kazei_income_chihou = max(0, | |
income - kisokoujyo_chihou - \ | |
kyuyo_shotoku_koujyo - (kousei_nenkin + kenpo) / 2) | |
jyuminzei = kazei_income_chihou * 0.1 | |
zei = syotokuzei + jyuminzei + kenpo | |
# print("%d\t%f" % (income, zei / income)) | |
return zei, (kousei_nenkin + kenpo) / 2 | |
def calc_houjin(income): | |
# 法人税 | |
houjinzei = min(800, income) * 0.15 + max(0, income - 800) * 0.232 | |
# 地方法人税 | |
chihou_houjinzei = houjinzei * 0.044 | |
# 法人住民税 | |
houjin_jyuminzei = houjinzei * 0.129 if houjinzei <= 1000 else houjinzei * 0.163 | |
# 法人事業税 | |
if income <= 2500: | |
houjin_jigyouzei = min(400, income) * 0.034 + \ | |
max(0, min(400, income - 400)) * 0.051 + \ | |
max(0, income - 800) * 0.067 | |
else: | |
houjin_jigyouzei = min(400, income) * 0.0365 + \ | |
max(0, min(400, income - 400)) * 0.05465 + \ | |
max(0, income - 800) * 0.0718 | |
# 地方法人特別税 | |
houjin_toubetsuzei = houjin_jigyouzei * 0.432 | |
hyoumen_zeigaku = houjinzei + chihou_houjinzei + houjin_jyuminzei + houjin_jigyouzei + houjin_toubetsuzei | |
jikkou_zeiritsu = hyoumen_zeigaku / (income + houjin_jigyouzei + houjin_toubetsuzei) | |
hyoumen_zeigaku_kintouwari = hyoumen_zeigaku + 7 | |
jikkou_zeiritsu_kintouwari = hyoumen_zeigaku_kintouwari / (income + houjin_jigyouzei + houjin_toubetsuzei) | |
# print("法人税 = %f" % houjinzei) | |
# print("地方法人税 = %f" % chihou_houjinzei) | |
# print("法人住民税 = %f" % houjin_jyuminzei) | |
# print("法人事業税 = %f" % houjin_jigyouzei) | |
# print("地方法人特別税 = %f" % houjin_toubetsuzei) | |
# print("表面税額(-均等割) = %f" % hyoumen_zeigaku) | |
# print("実効税率(-均等割) = %f" % (jikkou_zeiritsu * 100)) | |
# print("表面税額(+均等割) = %f" % hyoumen_zeigaku_kintouwari) | |
# print("実効税率(+均等割) = %f" % (jikkou_zeiritsu_kintouwari * 100)) | |
# print("%d\t%f" % (income, jikkou_zeiritsu)) | |
# print("%d\t%f" % (income, jikkou_zeiritsu_kintouwari)) | |
return income * jikkou_zeiritsu | |
def find_best(income, age): | |
best_zei_total = 1e100 | |
best_kojin_income = 0 | |
# for kojin_income in range(80, income + 10, 10): | |
for kojin_income in range(80, 1300, 1): | |
zei_kojin, koujyo = calc_kojin(kojin_income, age) | |
if income > kojin_income + koujyo: | |
zei_houjin = calc_houjin(income - kojin_income - koujyo) | |
else: | |
zei_houjin = 0 | |
zei_total = zei_kojin + zei_houjin | |
# print("%d\t%d\t%d\t%d\t%d" % (kojin_income, zei_kojin, koujyo, zei_houjin, zei_total)) | |
if zei_total <= best_zei_total: | |
best_zei_total = zei_total | |
best_kojin_income = kojin_income | |
print("%d\t%d" % (income, best_kojin_income)) | |
def main(): | |
for income in range(80, 5010, 10): | |
find_best(income, 39) | |
# calc_houjin(income) | |
# calc_kojin(income, 39) | |
main() |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment