In [1]:
#-*- coding: utf-8 -*-
import pandas as pd
import pandas_datareader.data as web
import datetime

In [2]:
def get_file_path(code):
    return "../data/" + code

In [3]:
def download(code, year1, month1, day1, year2, month2, day2):
    start = datetime.datetime(year1, month1, day1)
    end = datetime.datetime(year2, month2, day2)
    df = web.DataReader("%s.KS" % code, "yahoo", start, end)
    df.to_pickle(get_file_path(code))
    
    return df

In [4]:
def load(code):
    df = pd.read_pickle(get_file_path(code))
    return df

In [130]:
df = download("005930", 2016, 1, 1, 2016, 11, 15)

In [131]:
def Stochastic(m_Df, n=10, k=6, d=6): # price: 종가(시간 오름차순), n: 기간
    sz = len(m_Df['Close'])
    if sz >= n:
        tempSto_K=[]
        for i in range(sz):
            if i >= n-1:
                lows = m_Df['Low'][i-n:i]
                highs = m_Df['High'][i-n:i]
                                
                if len(lows) and len(highs):
                    tempUp = m_Df['Close'][i] - min(lows)
                    tempDown = max(highs) -  min(lows)
                    tempSto_K.append(tempUp / tempDown)
                else:
                    tempSto_K.append(0)
            else:
                tempSto_K.append(0) #n보다 작은 초기값은 0 설정

        m_Df['Sto_K'] = pd.Series(tempSto_K, index=m_Df.index) * 100
        m_Df['Sto_D'] = pd.Series.rolling(m_Df['Sto_K'], center=False, window=k).mean()
        m_Df['Sto_SlowD'] = pd.Series.rolling(m_Df['Sto_D'], center=False, window=d).mean()

    return m_Df

In [133]:
Stochastic(df, 10, 6, 6)


Out[133]:
Open High Low Close Volume Adj Close Sto_K Sto_D Sto_SlowD
Date
2016-01-01 1260000.0 1260000.0 1260000.0 1260000.0 0 1259099.38 0.000000 NaN NaN
2016-01-04 1260000.0 1260000.0 1205000.0 1205000.0 306900 1204138.69 0.000000 NaN NaN
2016-01-05 1202000.0 1218000.0 1186000.0 1208000.0 216000 1207136.55 0.000000 NaN NaN
2016-01-06 1208000.0 1208000.0 1168000.0 1175000.0 366700 1174160.13 0.000000 NaN NaN
2016-01-07 1166000.0 1183000.0 1151000.0 1163000.0 282300 1162168.71 0.000000 NaN NaN
2016-01-08 1163000.0 1186000.0 1163000.0 1171000.0 257700 1170162.99 0.000000 0.000000 NaN
2016-01-11 1156000.0 1166000.0 1146000.0 1152000.0 241200 1151176.57 0.000000 0.000000 NaN
2016-01-12 1148000.0 1166000.0 1144000.0 1146000.0 206200 1145180.86 0.000000 0.000000 NaN
2016-01-13 1153000.0 1159000.0 1148000.0 1148000.0 143300 1147179.43 0.000000 0.000000 NaN
2016-01-14 1131000.0 1142000.0 1131000.0 1138000.0 209000 1137186.58 0.000000 0.000000 NaN
2016-01-15 1140000.0 1152000.0 1124000.0 1132000.0 209400 1131190.87 0.775194 0.129199 0.021533
2016-01-18 1088000.0 1133000.0 1088000.0 1126000.0 320200 1125195.16 1.470588 0.374297 0.083916
2016-01-19 1128000.0 1171000.0 1128000.0 1171000.0 207200 1170162.99 63.846154 11.015323 1.919803
2016-01-20 1160000.0 1160000.0 1132000.0 1138000.0 167000 1137186.58 41.666667 17.959767 4.913098
2016-01-21 1133000.0 1155000.0 1125000.0 1131000.0 190300 1130191.59 43.877551 25.272692 9.125213
2016-01-22 1145000.0 1168000.0 1145000.0 1168000.0 147500 1167165.14 81.632653 38.878134 15.604902
2016-01-25 1172000.0 1176000.0 1156000.0 1162000.0 159900 1161169.43 89.156627 53.608373 24.518098
2016-01-26 1155000.0 1157000.0 1136000.0 1137000.0 152300 1136187.30 55.681818 62.643578 34.896311
2016-01-27 1126000.0 1175000.0 1126000.0 1175000.0 276200 1174160.13 98.863636 68.479825 44.473728
2016-01-28 1164000.0 1168000.0 1139000.0 1145000.0 315900 1144181.58 64.772727 72.330835 53.535573
2016-01-29 1140000.0 1150000.0 1116000.0 1150000.0 436900 1149178.00 70.454545 76.760334 62.116847
2016-02-01 1152000.0 1163000.0 1151000.0 1163000.0 259900 1162168.71 85.227273 77.359438 68.530397
2016-02-02 1161000.0 1166000.0 1147000.0 1156000.0 166300 1155173.72 66.666667 73.611111 71.864187
2016-02-03 1150000.0 1152000.0 1137000.0 1146000.0 174500 1145180.86 50.000000 72.664141 73.534281
2016-02-04 1150000.0 1161000.0 1148000.0 1156000.0 247900 1155173.72 66.666667 67.297980 73.337307
2016-02-05 1156000.0 1169000.0 1156000.0 1164000.0 188000 1163168.00 80.000000 69.835859 72.921477
2016-02-08 1164000.0 1164000.0 1164000.0 1164000.0 0 1163168.00 80.000000 71.426768 72.032549
2016-02-09 1164000.0 1164000.0 1164000.0 1164000.0 0 1163168.00 81.355932 70.781544 70.936234
2016-02-10 1164000.0 1164000.0 1164000.0 1164000.0 0 1163168.00 81.355932 73.229755 70.872674
2016-02-11 1118000.0 1137000.0 1118000.0 1130000.0 305200 1129192.30 26.415094 69.298938 70.311807
... ... ... ... ... ... ... ... ... ...
2016-10-04 1610000.0 1624000.0 1606000.0 1614000.0 261000 1614000.00 75.000000 57.878938 59.428277
2016-10-05 1601000.0 1626000.0 1597000.0 1619000.0 249400 1619000.00 79.629630 62.703054 58.847777
2016-10-06 1696000.0 1700000.0 1667000.0 1691000.0 591100 1691000.00 146.296296 81.237817 62.209978
2016-10-07 1700000.0 1716000.0 1690000.0 1706000.0 521000 1706000.00 103.592814 87.830771 66.819688
2016-10-10 1650000.0 1689000.0 1628000.0 1680000.0 505800 1680000.00 80.327869 90.838632 72.659707
2016-10-11 1600000.0 1625000.0 1545000.0 1545000.0 768500 1545000.00 6.557377 81.900664 77.064979
2016-10-12 1495000.0 1545000.0 1494000.0 1535000.0 781700 1535000.00 -5.847953 68.426005 78.822824
2016-10-13 1550000.0 1581000.0 1545000.0 1557000.0 437200 1557000.00 28.378378 59.884130 78.353003
2016-10-14 1548000.0 1588000.0 1547000.0 1577000.0 283100 1577000.00 37.387387 41.732645 71.768808
2016-10-17 1565000.0 1602000.0 1538000.0 1590000.0 255700 1590000.00 43.243243 31.674384 62.409410
2016-10-18 1572000.0 1595000.0 1572000.0 1589000.0 207600 1589000.00 42.792793 25.418538 51.506061
2016-10-19 1579000.0 1643000.0 1575000.0 1625000.0 308800 1625000.00 59.009009 34.160476 43.549363
2016-10-20 1626000.0 1651000.0 1609000.0 1620000.0 206600 1620000.00 56.756757 44.594595 39.577461
2016-10-21 1606000.0 1613000.0 1588000.0 1589000.0 209500 1589000.00 42.792793 46.996997 37.429606
2016-10-24 1593000.0 1608000.0 1590000.0 1608000.0 185700 1608000.00 58.461538 50.509356 38.892391
2016-10-25 1600000.0 1604000.0 1592000.0 1597000.0 197300 1597000.00 65.605096 54.236331 42.652715
2016-10-26 1597000.0 1599000.0 1562000.0 1567000.0 210600 1567000.00 46.496815 54.853668 47.558570
2016-10-27 1571000.0 1617000.0 1556000.0 1573000.0 282300 1573000.00 30.973451 50.181075 50.228670
2016-10-28 1580000.0 1614000.0 1580000.0 1614000.0 204200 1614000.00 67.256637 51.931055 51.451414
2016-10-31 1616000.0 1639000.0 1611000.0 1639000.0 241300 1639000.00 89.380531 59.695678 53.567860
2016-11-01 1630000.0 1652000.0 1612000.0 1652000.0 206900 1652000.00 101.052632 66.794194 56.282000
2016-11-02 1640000.0 1652000.0 1631000.0 1643000.0 201900 1643000.00 90.625000 70.964178 59.069975
2016-11-03 1630000.0 1640000.0 1606000.0 1616000.0 206800 1616000.00 62.500000 73.631375 62.199592
2016-11-04 1605000.0 1634000.0 1605000.0 1627000.0 142000 1627000.00 73.958333 80.795522 67.302000
2016-11-07 1647000.0 1650000.0 1634000.0 1640000.0 153200 1640000.00 87.500000 84.169416 72.675060
2016-11-08 1649000.0 1649000.0 1635000.0 1644000.0 108300 1644000.00 91.666667 84.550439 76.817521
2016-11-09 1646000.0 1657000.0 1591000.0 1596000.0 313600 1596000.00 41.666667 74.652778 78.127285
2016-11-10 1630000.0 1650000.0 1618000.0 1649000.0 235900 1649000.00 92.079208 74.895146 78.782446
2016-11-11 1585000.0 1618000.0 1585000.0 1598000.0 256700 1598000.00 23.376623 68.374583 77.906314
2016-11-14 1595000.0 1596000.0 1552000.0 1553000.0 302600 1553000.00 -44.444444 48.640787 72.547191

227 rows × 9 columns


In [ ]: