オリジナルポートフォリオの作成


オリジナルポートフォリオの作成

メモはkobito.app

使う技術
*プログラム言語ruby
*webサービス構築sinatra
*データベース管理sqlite3
*データベースをrubyのオブジェクト化activerecord

まずsinatraから攻める
前回インストール済み

Markdown: これができればwebサービスは作れる-sinatra

構造
k-portfolio
┣main.rb
┣import.sql
┣stock.db
┗views
_┣layout.erb
_
┗index.erb

┗┣は「けいせん」で変換

layout.erb
<!DOCTYPE html>
<html lang="ja">
<head>
    <mata charset="utf-8">
    <title>k-portfolio</title>
</head>
<body>
    <%= yield %>
</body>
</html>

stock.dbの作成、import.sqlの読み込み

import.sql
drop table if exists posts;
create table posts( 
    id integer primary key,
    title text,
    body text, 
    created_at, 
    updated_at
);
Mac-no-MacBook-Pro:k-portfolio Mac$ sqlite3 stock.db
SQLite version 3.8.5 2014-08-15 22:37:57
Enter ".help" for usage hints.
sqlite> .read import.sql

sqlite> .shema
Error: unknown command or invalid arguments:  "shema". Enter ".help" for help
sqlite> .shcema
Error: unknown command or invalid arguments:  "shcema". Enter ".help" for help
sqlite> .schema
CREATE TABLE posts( 
    id integer primary key,
    title text,
    body text, 
    created_at, 
    updated_at
);
sqlite> 

main.rbにsinatra,active_record読み込み
stock.dbと関連付け,Postクラスの作成

main.rb
require "sinatra"
require "sinatra/reloader"
require 'active_record'

ActiveRecord::Base.establish_connection(
    "adapter" => "sqlite3",
    "database" => "./stock.db"
)

class Post < ActiveRecord::Base
end

get "/" do 
    @title = "index"
    @content = "this is index"
    @posts = Post.order("id").all

    erb :index
end

post "/new" do 
    Post.create({:body => params[:body]})
    redirect '/'    
    erb :index
end
index.erb
<h1><%= @title %></h1>
<%= @content %>
    <h2>Add new</h2>
    <form method="post" action="/new">
        <input type= "text" name="body"><input type= "submit" value="post!">
    </form>
    <br>

    <table border="1">
        <tr>
            <td>id</td><td>comment</td><td>created_at</td>
        </tr>
            <% @posts.each do |post| %>
        <tr>
            <td><%= post.id %></td><td><%= post.body %></td><td><%= post.created_at %></td>
        </tr>
            <% end %>
    </table>    

これでフォームに入力した文字はcomment欄に表示され、その日時も記録される。出力はテーブル表。

ここからどうするか

株ポートフォリオに必要な変数名の用意

-コード
-市場
-名称
-損益
-当時購入価格
-現在取引値
-単元株数
-前日比
-出来高

シンプルなものを作るために変数名を絞る

やりたいこと

簡単に言えばYahooポートフォリオを自作する

1.気になる銘柄を選定後、その銘柄をtextファイルに保存。
textファイルから読み出し以下のことをする。

a.コード(code)
textファイルに保存してあるので、そこからインポートしDBのcodeに追加
b.名称(name)
codeから名称を検索しDBのnameに追加
c.当時購入価格(price)(終値*最低単元株数)
codeから終値、最低単元株数を検索し、計算。計算結果をDBのpriceに追加

2.または気になる銘柄を選定後そのままDB(stock_日付.db)に追加する。

シンプルに考えて

1.引け後銘柄選定
2.日付ごとにcodeだけ保存(.db OR .text)
3.終値*最低単元株数を計算し購入価格を算出
4.上書き保存
┗とりあえずここまでやってみる
5.最新の株価と照らし合わせ日付ごとの損益を出す

引け後銘柄選定

自作chart.rbより選択
今はhtmlファイルとして保存(XXXX-XX-XX.text)

<% if focus != nil
    File.open("./stockfile/#{today}.html","a") do |file|
        file.puts focus
    end
end %>

これをdbファイルに保存したい(XXXX-XX-XX.db)がよくわからないのでtextファイルとして保存しdbファイルから読み込むようにする

<% if focus != nil
    File.open("./stockfile/#{today}.text","a") do |file|
        file.puts focus
    end
end %>

2.日付ごとにcodeだけ保存(.db OR .text)

dbファイルからtextファイルを読み込む

まずk-portfolio下に新規dbを作成。stock.db

:string     #=> 文字列
:text       #=> string読みも長い文字列
:integer    #=> 整数
:float      #=> 少数点を含む数
:decimal    #=> floatよみも精度の高い少数点を含む数
:datetime   #=> 日時
:timestamp  #=> より細かい日時
:time       #=> 日付
:date       #=> 日付 
:binary   #=> バイナリデータ
:boolean    #=> Boolean型(true or false)

参考http://morizyun.github.io/blog/active-record-rails-beginner-tutorial/

外部データからデータを取り込む - ドットインストール#17

SQL文

import.sql
drop table if exists posts;
create table posts( 
    codes integer
);
Mac>sqlite3 stock.db
sqlite> .read import.sql

sqlite> .import ./2015-01-23.text posts
sqlite> select * from posts
   ...> ;
1883
1944
2002
2193
4114
4272
6517
9008
9021
9375
9739

stock.dbにコードが記録された

3.終値*最低単元株数を計算し購入価格を算出

-stock.dbからコードを1つずつ抽出
-それをyahoofinanceで検索し、正規表現でparse
時間がかかる、サーバーに負担がかかる

-銘柄,名称のDBを作っておきそこから反映
DB構築の最初だけ時間がかかる、新しい会社の反映、更新が面倒

終値データ取得方針
-yahoofinanceから

最低単元株数データ取得方針
o-yahoofinenceから
x-100,1000から選択できるようにする

結局yahoofinenceから取らなければいけないから
名称、終値、最低単元株数は同じようにスクレイピングする
スクレイピングしたのをtext→db保存になる

でもrubyから直接dbに保存することはできないのか

「db 保存 ruby」「ruby 保存 sqlite3」で検索してみた

# 仮データを入れてみる
Stat.create(
            :update_id => '1234556',
            :name => 'zanmai',
            :text => '肉が食べたい'
            )

引用http://d.hatena.ne.jp/shokai/20080308/1205002736

なるほどchart1.rbからaciverecordをつかって

の出力先にPost.createをすればいい
ってことはchart1.rbをsinatraで作り変えなければいけない。
いつかはしたほうがいいと思っていたが...

それをまずやって、保存先をstock.dbにする!
そうすればtextファイルを経由しなくていい!
次に続く